diff --git a/CHANGELOG.md b/CHANGELOG.md index de9ce0a3..1fd46067 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ See full changelog for the OpenAPI schema (OAS) [here](https://github.com/plaid/plaid-openapi/blob/master/CHANGELOG.md). +# 9.2.0 +Updating to OAS 2020-09-14_1.31.1. + ## 9.1.0 Updating to OAS 2020-09-14_1.26.1. diff --git a/api.ts b/api.ts index 82dc119c..98bcac50 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -241,13 +241,13 @@ export interface AccountBalance { [key: string]: object | any; /** - * The amount of funds available to be withdrawn from the account, as determined by the financial institution. For `credit`-type accounts, the `available` balance typically equals the `limit` less the `current` balance, less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance typically equals the `current` balance less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance does not include the overdraft limit. For `investment`-type accounts, the `available` balance is the total cash available to withdraw as presented by the institution. Note that not all institutions calculate the `available` balance. In the event that `available` balance is unavailable, Plaid will return an `available` balance value of `null`. Available balance may be cached and is not guaranteed to be up-to-date in realtime unless the value was returned by `/accounts/balance/get`. + * The amount of funds available to be withdrawn from the account, as determined by the financial institution. For `credit`-type accounts, the `available` balance typically equals the `limit` less the `current` balance, less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance typically equals the `current` balance less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance does not include the overdraft limit. For `investment`-type accounts, the `available` balance is the total cash available to withdraw as presented by the institution. Note that not all institutions calculate the `available` balance. In the event that `available` balance is unavailable, Plaid will return an `available` balance value of `null`. Available balance may be cached and is not guaranteed to be up-to-date in realtime unless the value was returned by `/accounts/balance/get`. If `current` is `null` this field is guaranteed not to be `null`. * @type {number} * @memberof AccountBalance */ available: number | null; /** - * The total amount of funds in or owed by the account. For `credit`-type accounts, a positive balance indicates the amount owed; a negative amount indicates the lender owing the account holder. For `loan`-type accounts, the current balance is the principal remaining on the loan, except in the case of student loan accounts at Sallie Mae (`ins_116944`). For Sallie Mae student loans, the account\'s balance includes both principal and any outstanding interest. For `investment`-type accounts, the current balance is the total value of assets as presented by the institution. Note that balance information may be cached unless the value was returned by `/accounts/balance/get`; if the Item is enabled for Transactions, the balance will be at least as recent as the most recent Transaction update. If you require realtime balance information, use the `available` balance as provided by `/accounts/balance/get`. + * The total amount of funds in or owed by the account. For `credit`-type accounts, a positive balance indicates the amount owed; a negative amount indicates the lender owing the account holder. For `loan`-type accounts, the current balance is the principal remaining on the loan, except in the case of student loan accounts at Sallie Mae (`ins_116944`). For Sallie Mae student loans, the account\'s balance includes both principal and any outstanding interest. For `investment`-type accounts, the current balance is the total value of assets as presented by the institution. Note that balance information may be cached unless the value was returned by `/accounts/balance/get`; if the Item is enabled for Transactions, the balance will be at least as recent as the most recent Transaction update. If you require realtime balance information, use the `available` balance as provided by `/accounts/balance/get`. When returned by `/accounts/balance/get`, this field may be `null`. When this happens, `available` is guaranteed not to be `null`. * @type {number} * @memberof AccountBalance */ @@ -1857,6 +1857,48 @@ export interface AuthGetResponse { */ request_id: string; } +/** + * Metadata that captures information about the Auth features of an institution. + * @export + * @interface AuthMetadata + */ +export interface AuthMetadata { + [key: string]: object | any; + + /** + * + * @type {AuthSupportedMethods} + * @memberof AuthMetadata + */ + supported_methods: AuthSupportedMethods | null; +} +/** + * Metadata specifically related to which auth methods an institution supports. + * @export + * @interface AuthSupportedMethods + */ +export interface AuthSupportedMethods { + [key: string]: object | any; + + /** + * Indicates if instant auth is supported. + * @type {boolean} + * @memberof AuthSupportedMethods + */ + instant_auth: boolean; + /** + * Indicates if instant match is supported. + * @type {boolean} + * @memberof AuthSupportedMethods + */ + instant_match: boolean; + /** + * Indicates if automated microdeposits are supported. + * @type {boolean} + * @memberof AuthSupportedMethods + */ + automated_micro_deposits: boolean; +} /** * Fired when an Item is verified via automated micro-deposits. We recommend communicating to your users when this event is received to notify them that their account is verified and ready for use. * @export @@ -2878,7 +2920,7 @@ export interface BankTransferSweepGetRequest { */ sweep_id: number; /** - * If multiple origination accounts are available, `origination_account_id` must be used to specify the account for which balance will be returned. + * If multiple origination accounts are available, `origination_account_id` must be used to specify the account that the sweep belongs to. * @type {string} * @memberof BankTransferSweepGetRequest */ @@ -2905,6 +2947,76 @@ export interface BankTransferSweepGetResponse { */ request_id: string; } +/** + * BankTransferSweepListRequest defines the request schema for `/bank_transfer/sweep/list` + * @export + * @interface BankTransferSweepListRequest + */ +export interface BankTransferSweepListRequest { + /** + * 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 BankTransferSweepListRequest + */ + 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 BankTransferSweepListRequest + */ + secret?: string; + /** + * If multiple origination accounts are available, `origination_account_id` must be used to specify the account that the sweeps belong to. + * @type {string} + * @memberof BankTransferSweepListRequest + */ + origination_account_id?: string | null; + /** + * Starting ID of sweeps to return. + * @type {number} + * @memberof BankTransferSweepListRequest + */ + start_id?: number | null; + /** + * The start datetime of sweeps to return (RFC 3339 format). + * @type {string} + * @memberof BankTransferSweepListRequest + */ + start_time?: string | null; + /** + * The end datetime of sweeps to return (RFC 3339 format). + * @type {string} + * @memberof BankTransferSweepListRequest + */ + end_time?: string | null; + /** + * The maximum number of sweeps to return. + * @type {number} + * @memberof BankTransferSweepListRequest + */ + count?: number | null; +} +/** + * BankTransferSweepListResponse defines the response schema for `/bank_transfer/sweep/list` + * @export + * @interface BankTransferSweepListResponse + */ +export interface BankTransferSweepListResponse { + [key: string]: object | any; + + /** + * + * @type {Array} + * @memberof BankTransferSweepListResponse + */ + sweeps: Array; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof BankTransferSweepListResponse + */ + request_id: string; +} /** * The type of bank transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into the origination account; a `credit` indicates a transfer of money out of the origination account. * @export @@ -3959,18 +4071,22 @@ export interface EarningsTotal { * @enum {string} */ export enum EarningsTotalCanonicalDescriptionEnum { - Bonus = 'Bonus', - Commission = 'Commission', - Overtime = 'Overtime', - PaidTimeOff = 'Paid Time Off', - RegularPay = 'Regular Pay', - Vacation = 'Vacation', - EmployeeMedicare = 'Employee Medicare', + Bonus = 'BONUS', + Commission = 'COMMISSION', + Overtime = 'OVERTIME', + PaidTimeOff = 'PAID TIME OFF', + RegularPay = 'REGULAR PAY', + Vacation = 'VACATION', + EmployeeMedicare = 'EMPLOYEE MEDICARE', Fica = 'FICA', - SocialSecurityEmployeeTax = 'Social Security Employee Tax', - Medical = 'Medical', - Vision = 'Vision', - Dental = 'Dental' + SocialSecurityEmployeeTax = 'SOCIAL SECURITY EMPLOYEE TAX', + Medical = 'MEDICAL', + Vision = 'VISION', + Dental = 'DENTAL', + NetPay = 'NET PAY', + Taxes = 'TAXES', + NotFound = 'NOT_FOUND', + Other = 'OTHER' } /** @@ -4989,6 +5105,33 @@ export interface IncomeVerificationPaystubGetRequest { */ access_token?: string | null; } +/** + * IncomeVerificationPaystubGetResponse defines the response schema for `/income/verification/paystub/get`. + * @export + * @interface IncomeVerificationPaystubGetResponse + */ +export interface IncomeVerificationPaystubGetResponse { + [key: string]: object | any; + + /** + * + * @type {Paystub} + * @memberof IncomeVerificationPaystubGetResponse + */ + paystub: Paystub; + /** + * + * @type {Error} + * @memberof IncomeVerificationPaystubGetResponse + */ + error?: Error | null; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof IncomeVerificationPaystubGetResponse + */ + request_id: string; +} /** * IncomeVerificationPaystubsGetRequest defines the request schema for `/income/verification/paystubs/get`. * @export @@ -5054,6 +5197,167 @@ export interface IncomeVerificationPaystubsGetResponse { */ request_id: string; } +/** + * + * @export + * @interface IncomeVerificationPrecheckEmployer + */ +export interface IncomeVerificationPrecheckEmployer { + /** + * The employer\'s name + * @type {string} + * @memberof IncomeVerificationPrecheckEmployer + */ + name?: string; + /** + * The employer\'s tax id + * @type {string} + * @memberof IncomeVerificationPrecheckEmployer + */ + tax_id?: string; +} +/** + * + * @export + * @interface IncomeVerificationPrecheckMilitaryInfo + */ +export interface IncomeVerificationPrecheckMilitaryInfo { + /** + * Is the user currently active duty in the US military + * @type {boolean} + * @memberof IncomeVerificationPrecheckMilitaryInfo + */ + is_active_duty?: boolean | null; + /** + * If the user is currently serving in the US military, the branch of the military they are serving in + * @type {string} + * @memberof IncomeVerificationPrecheckMilitaryInfo + */ + branch?: IncomeVerificationPrecheckMilitaryInfoBranchEnum; +} + +/** + * @export + * @enum {string} + */ +export enum IncomeVerificationPrecheckMilitaryInfoBranchEnum { + AirForce = 'AIR FORCE', + Army = 'ARMY', + CoastGuard = 'COAST GUARD', + Marines = 'MARINES', + Navy = 'NAVY' +} + +/** + * IncomeVerificationPrecheckRequest defines the request schema for `/income/verification/precheck` + * @export + * @interface IncomeVerificationPrecheckRequest + */ +export interface IncomeVerificationPrecheckRequest { + /** + * 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 IncomeVerificationPrecheckRequest + */ + 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 IncomeVerificationPrecheckRequest + */ + secret?: string; + /** + * + * @type {IncomeVerificationPrecheckUser} + * @memberof IncomeVerificationPrecheckRequest + */ + user?: IncomeVerificationPrecheckUser | null; + /** + * + * @type {IncomeVerificationPrecheckEmployer} + * @memberof IncomeVerificationPrecheckRequest + */ + employer?: IncomeVerificationPrecheckEmployer | null; + /** + * The access token associated with the Item data is being requested for. + * @type {string} + * @memberof IncomeVerificationPrecheckRequest + */ + transactions_access_token?: string | null; + /** + * + * @type {IncomeVerificationPrecheckMilitaryInfo} + * @memberof IncomeVerificationPrecheckRequest + */ + us_military_info?: IncomeVerificationPrecheckMilitaryInfo | null; +} +/** + * IncomeVerificationPrecheckResponse defines the response schema for `/income/verification/precheck`. + * @export + * @interface IncomeVerificationPrecheckResponse + */ +export interface IncomeVerificationPrecheckResponse { + /** + * ID of the precheck. + * @type {string} + * @memberof IncomeVerificationPrecheckResponse + */ + precheck_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 IncomeVerificationPrecheckResponse + */ + request_id: string; + /** + * The confidence that Plaid can support the user in the income verification flow. One of the following: `\"HIGH\"`: This precheck information submitted is definitively tied to a Plaid-supported integration. \"`LOW`\": This precheck information submitted is known not to be supported by Plaid. `\"UNKNOWN\"`: It was not possible to determine if the user is supportable with the information passed. + * @type {string} + * @memberof IncomeVerificationPrecheckResponse + */ + confidence: IncomeVerificationPrecheckResponseConfidenceEnum; +} + +/** + * @export + * @enum {string} + */ +export enum IncomeVerificationPrecheckResponseConfidenceEnum { + High = 'HIGH', + Low = 'LOW', + Unknown = 'UNKNOWN' +} + +/** + * + * @export + * @interface IncomeVerificationPrecheckUser + */ +export interface IncomeVerificationPrecheckUser { + /** + * The user\'s first name + * @type {string} + * @memberof IncomeVerificationPrecheckUser + */ + first_name?: string | null; + /** + * The user\'s last name + * @type {string} + * @memberof IncomeVerificationPrecheckUser + */ + last_name?: string | null; + /** + * The user\'s email address + * @type {string} + * @memberof IncomeVerificationPrecheckUser + */ + email_address?: string | null; + /** + * + * @type {AddressDataNullable} + * @memberof IncomeVerificationPrecheckUser + */ + home_address?: AddressDataNullable | null; +} /** * IncomeVerificationRefreshRequest defines the request schema for `/income/verification/refresh` * @export @@ -5429,6 +5733,12 @@ export interface Institution { * @memberof Institution */ payment_initiation_metadata?: PaymentInitiationMetadata | null; + /** + * + * @type {AuthMetadata} + * @memberof Institution + */ + auth_metadata?: AuthMetadata | null; } /** * The status of an institution is determined by the health of its Item logins, Transactions updates, Investments updates, Liabilities updates, Auth requests, Balance requests, Identity requests, Investments requests, and Liabilities requests. A login attempt is conducted during the initial Item add in Link. If there is not enough traffic to accurately calculate an institution\'s status, Plaid will return null rather than potentially inaccurate data. Institution status is accessible in the Dashboard and via the API using the `/institutions/get_by_id` endpoint with the `include_status` option set to true. Note that institution status is not available in the Sandbox environment. @@ -5554,6 +5864,12 @@ export interface InstitutionsGetByIdRequestOptions { * @memberof InstitutionsGetByIdRequestOptions */ include_status?: boolean; + /** + * When `true`, returns metadata related to the Auth product indicating which auth methods are supported. + * @type {boolean} + * @memberof InstitutionsGetByIdRequestOptions + */ + include_auth_metadata?: boolean; /** * When `true`, returns metadata related to the Payment Initiation product indicating which payment configurations are supported. * @type {boolean} @@ -5655,6 +5971,12 @@ export interface InstitutionsGetRequestOptions { * @memberof InstitutionsGetRequestOptions */ include_optional_metadata?: boolean; + /** + * When `true`, returns metadata related to the Auth product indicating which auth methods are supported. + * @type {boolean} + * @memberof InstitutionsGetRequestOptions + */ + include_auth_metadata?: boolean; /** * When `true`, returns metadata related to the Payment Initiation product indicating which payment configurations are supported. * @type {boolean} @@ -5798,6 +6120,12 @@ export interface InstitutionsSearchRequestOptions { * @memberof InstitutionsSearchRequestOptions */ include_optional_metadata?: boolean; + /** + * When `true`, returns metadata related to the Auth product indicating which auth methods are supported. + * @type {boolean} + * @memberof InstitutionsSearchRequestOptions + */ + include_auth_metadata?: boolean; /** * When `true`, returns metadata related to the Payment Initiation product indicating which payment configurations are supported. * @type {boolean} @@ -9096,6 +9424,12 @@ export interface PaymentInitiationPayment { * @memberof PaymentInitiationPayment */ iban: string | null; + /** + * Initiated refunds associated with the payment. + * @type {Array} + * @memberof PaymentInitiationPayment + */ + initiated_refunds?: Array; /** * The EMI (E-Money Institution) account that this payment is associated with, if any. This EMI account is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. * @type {string} @@ -9301,6 +9635,12 @@ export interface PaymentInitiationPaymentGetResponse { * @memberof PaymentInitiationPaymentGetResponse */ iban: string | null; + /** + * Initiated refunds associated with the payment. + * @type {Array} + * @memberof PaymentInitiationPaymentGetResponse + */ + initiated_refunds?: Array; /** * The EMI (E-Money Institution) account that this payment is associated with, if any. This EMI account is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. * @type {string} @@ -9388,6 +9728,70 @@ export interface PaymentInitiationPaymentListResponse { */ request_id: string; } +/** + * PaymentInitiationPaymentReverseRequest defines the request schema for `/payment_initiation/payment/reverse` + * @export + * @interface PaymentInitiationPaymentReverseRequest + */ +export interface PaymentInitiationPaymentReverseRequest { + /** + * 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 PaymentInitiationPaymentReverseRequest + */ + 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 PaymentInitiationPaymentReverseRequest + */ + secret?: string; + /** + * The ID of the payment to reverse + * @type {string} + * @memberof PaymentInitiationPaymentReverseRequest + */ + payment_id: string; +} +/** + * PaymentInitiationPaymentReverseResponse defines the response schema for `/payment_initation/payment/reverse` + * @export + * @interface PaymentInitiationPaymentReverseResponse + */ +export interface PaymentInitiationPaymentReverseResponse { + [key: string]: object | any; + + /** + * A unique ID identifying the refund + * @type {string} + * @memberof PaymentInitiationPaymentReverseResponse + */ + refund_id: string; + /** + * The status of the refund. `PROCESSING`: The refund is currently being processed. The refund will automatically exit this state when processing is complete. `INITIATED`: The refund has been successfully initiated. `EXECUTED`: Indicates that the refund has been successfully executed. `FAILED`: The refund has failed to be executed. This error is retryable once the root cause is resolved. + * @type {string} + * @memberof PaymentInitiationPaymentReverseResponse + */ + status: PaymentInitiationPaymentReverseResponseStatusEnum; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof PaymentInitiationPaymentReverseResponse + */ + request_id: string; +} + +/** + * @export + * @enum {string} + */ +export enum PaymentInitiationPaymentReverseResponseStatusEnum { + Processing = 'PROCESSING', + Executed = 'EXECUTED', + Initiated = 'INITIATED', + Failed = 'FAILED' +} + /** * PaymentInitiationPaymentTokenCreateRequest defines the request schema for `/payment_initiation/payment/token/create` * @export @@ -9676,6 +10080,51 @@ export interface PaymentInitiationRecipientListResponse { */ request_id: string; } +/** + * PaymentInitiationRefund defines a payment initiation refund + * @export + * @interface PaymentInitiationRefund + */ +export interface PaymentInitiationRefund { + [key: string]: object | any; + + /** + * The ID of the refund. Like all Plaid identifiers, the `refund_id` is case sensitive. + * @type {string} + * @memberof PaymentInitiationRefund + */ + refund_id: string; + /** + * + * @type {PaymentAmount} + * @memberof PaymentInitiationRefund + */ + amount: PaymentAmount; + /** + * The status of the refund. `PROCESSING`: The refund is currently being processed. The refund will automatically exit this state when processing is complete. `INITIATED`: The refund has been successfully initiated. `EXECUTED`: Indicates that the refund has been successfully executed. `FAILED`: The refund has failed to be executed. This error is retryable once the root cause is resolved. + * @type {string} + * @memberof PaymentInitiationRefund + */ + status: PaymentInitiationRefundStatusEnum; + /** + * The date and time of the last time the `status` was updated, in IS0 8601 format + * @type {string} + * @memberof PaymentInitiationRefund + */ + last_status_update: string; +} + +/** + * @export + * @enum {string} + */ +export enum PaymentInitiationRefundStatusEnum { + Processing = 'PROCESSING', + Initiated = 'INITIATED', + Executed = 'EXECUTED', + Failed = 'FAILED' +} + /** * Metadata specifically related to valid Payment Initiation standing order configurations for the institution. * @export @@ -10160,6 +10609,27 @@ export interface PendingExpirationWebhook { */ consent_expiration_time: string; } +/** + * Information describing the intent of the transaction. Most relevant for personal finance use cases, but not limited to such use cases. The field is currently in beta. The complete category can be generated by concatenating primary and detailed categories. This feature is currently in beta – to request access, contact transactions-feedback@plaid.com. + * @export + * @interface PersonalFinanceCategory + */ +export interface PersonalFinanceCategory { + [key: string]: object | any; + + /** + * A high level category that communicates the broad category of the transaction. + * @type {string} + * @memberof PersonalFinanceCategory + */ + primary: string; + /** + * Provides additional granularity to the primary categorization. + * @type {string} + * @memberof PersonalFinanceCategory + */ + detailed: string; +} /** * A phone number * @export @@ -10651,7 +11121,7 @@ export enum ProcessorTokenCreateRequestProcessorEnum { PrimeTrust = 'prime_trust', Rize = 'rize', SilaMoney = 'sila_money', - SbvApi = 'sbv_api', + SvbApi = 'svb_api', TreasuryPrime = 'treasury_prime', Unit = 'unit', Vesta = 'vesta', @@ -11827,7 +12297,7 @@ export interface SignalAddressData { country?: string | null; } /** - * + * SignalDecisionReportRequest defines the request schema for `/signal/decision/report` * @export * @interface SignalDecisionReportRequest */ @@ -11858,7 +12328,7 @@ export interface SignalDecisionReportRequest { initiated: boolean; } /** - * + * SignalDecisionReportResponse defines the response schema for `/signal/decision/report` * @export * @interface SignalDecisionReportResponse */ @@ -12107,7 +12577,7 @@ export interface SignalEvaluateCoreAttributes { address_change_count_90d?: number | null; } /** - * + * SignalEvaluateRequest defines the request schema for `/signal/evaluate` * @export * @interface SignalEvaluateRequest */ @@ -12170,7 +12640,7 @@ export interface SignalEvaluateRequest { device?: SignalDevice; } /** - * + * SignalEvaluateResponse defines the response schema for `/signal/income/evaluate` * @export * @interface SignalEvaluateResponse */ @@ -12234,7 +12704,7 @@ export interface SignalPersonName { suffix?: string | null; } /** - * + * SignalReturnReportRequest defines the request schema for `/signal/return/report` * @export * @interface SignalReturnReportRequest */ @@ -12265,7 +12735,7 @@ export interface SignalReturnReportRequest { return_code: string; } /** - * + * SignalReturnReportResponse defines the response schema for `/signal/return/report` * @export * @interface SignalReturnReportResponse */ @@ -12278,7 +12748,7 @@ export interface SignalReturnReportResponse { request_id: string; } /** - * + * Risk scoring details broken down by risk category. * @export * @interface SignalScores */ @@ -12782,18 +13252,22 @@ export interface Total { * @enum {string} */ export enum TotalCanonicalDescriptionEnum { - Bonus = 'Bonus', - Commission = 'Commission', - Overtime = 'Overtime', - PaidTimeOff = 'Paid Time Off', - RegularPay = 'Regular Pay', - Vacation = 'Vacation', - EmployeeMedicare = 'Employee Medicare', + Bonus = 'BONUS', + Commission = 'COMMISSION', + Overtime = 'OVERTIME', + PaidTimeOff = 'PAID TIME OFF', + RegularPay = 'REGULAR PAY', + Vacation = 'VACATION', + EmployeeMedicare = 'EMPLOYEE MEDICARE', Fica = 'FICA', - SocialSecurityEmployeeTax = 'Social Security Employee Tax', - Medical = 'Medical', - Vision = 'Vision', - Dental = 'Dental' + SocialSecurityEmployeeTax = 'SOCIAL SECURITY EMPLOYEE TAX', + Medical = 'MEDICAL', + Vision = 'VISION', + Dental = 'DENTAL', + NetPay = 'NET PAY', + Taxes = 'TAXES', + NotFound = 'NOT_FOUND', + Other = 'OTHER' } /** @@ -12941,6 +13415,12 @@ export interface Transaction { * @memberof Transaction */ transaction_code: TransactionCode | null; + /** + * + * @type {PersonalFinanceCategory & any} + * @memberof Transaction + */ + personal_finance_category?: PersonalFinanceCategory & any | null; } /** @@ -13011,6 +13491,12 @@ export interface TransactionAllOf { * @memberof TransactionAllOf */ transaction_code: TransactionCode | null; + /** + * + * @type {PersonalFinanceCategory & any} + * @memberof TransactionAllOf + */ + personal_finance_category?: PersonalFinanceCategory & any | null; } /** @@ -13313,6 +13799,12 @@ export interface TransactionsGetRequestOptions { * @memberof TransactionsGetRequestOptions */ include_original_description?: boolean | null; + /** + * Include the `personal_finance_category` object in the response. This feature is currently in beta – to request access, contact transactions-feedback@plaid.com. + * @type {boolean} + * @memberof TransactionsGetRequestOptions + */ + include_personal_finance_category_beta?: boolean; } /** * TransactionsGetResponse defines the response schema for `/transactions/get` @@ -13474,12 +13966,6 @@ export interface Transfer { * @memberof Transfer */ amount: string; - /** - * The currency of the transfer amount, e.g. \"USD\" - * @type {string} - * @memberof Transfer - */ - iso_currency_code: string; /** * The description of the transfer. * @type {string} @@ -13516,12 +14002,6 @@ export interface Transfer { * @memberof Transfer */ failure_reason: TransferFailure | null; - /** - * A string containing the custom tag provided by the client in the create request. Will be null if not provided. - * @type {string} - * @memberof Transfer - */ - custom_tag: string | null; /** * The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: - The JSON values must be Strings (no nested JSON objects allowed) - Only ASCII characters may be used - Maximum of 50 key/value pairs - Maximum key length of 40 characters - Maximum value length of 500 characters * @type {{ [key: string]: string; }} @@ -13534,12 +14014,6 @@ export interface Transfer { * @memberof Transfer */ origination_account_id: string; - /** - * - * @type {TransferDirection} - * @memberof Transfer - */ - direction: TransferDirection | null; } /** * TransferAuthorization contains the authorization decision for a proposed transfer @@ -13632,25 +14106,13 @@ export interface TransferAuthorizationCreateRequest { * @type {TransferNetwork} * @memberof TransferAuthorizationCreateRequest */ - network: TransferNetwork; - /** - * The amount of the transfer (decimal string with two digits of precision e.g. “10.00”). - * @type {string} - * @memberof TransferAuthorizationCreateRequest - */ - amount: string; - /** - * The currency of the transfer amount – should be set to \"USD\". - * @type {string} - * @memberof TransferAuthorizationCreateRequest - */ - iso_currency_code: string; + network: TransferNetwork; /** - * The authorization description. Maximum of 10 characters. + * The amount of the transfer (decimal string with two digits of precision e.g. “10.00”). * @type {string} * @memberof TransferAuthorizationCreateRequest */ - description: string; + amount: string; /** * * @type {ACHClass} @@ -13790,18 +14252,6 @@ export interface TransferAuthorizationProposedTransfer { * @memberof TransferAuthorizationProposedTransfer */ amount: string; - /** - * The currency of the transfer amount. - * @type {string} - * @memberof TransferAuthorizationProposedTransfer - */ - iso_currency_code: string; - /** - * A description of the proposed transfer. - * @type {string} - * @memberof TransferAuthorizationProposedTransfer - */ - description: string; /** * The network or rails used for the transfer. * @type {string} @@ -13915,12 +14365,6 @@ export interface TransferCreateRequest { * @memberof TransferCreateRequest */ amount: string; - /** - * The currency of the transfer amount – should be set to \"USD\". - * @type {string} - * @memberof TransferCreateRequest - */ - iso_currency_code: string; /** * The transfer description. Maximum of 10 characters. * @type {string} @@ -13932,19 +14376,13 @@ export interface TransferCreateRequest { * @type {ACHClass} * @memberof TransferCreateRequest */ - ach_class?: ACHClass; + ach_class: ACHClass; /** * * @type {TransferUserInRequest} * @memberof TransferCreateRequest */ user: TransferUserInRequest; - /** - * An arbitrary string provided by the client for storage with the transfer. May be up to 100 characters. - * @type {string} - * @memberof TransferCreateRequest - */ - custom_tag?: string | null; /** * The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: - The JSON values must be Strings (no nested JSON objects allowed) - Only ASCII characters may be used - Maximum of 50 key/value pairs - Maximum key length of 40 characters - Maximum value length of 500 characters * @type {{ [key: string]: string; }} @@ -13979,17 +14417,6 @@ export interface TransferCreateResponse { */ request_id: string; } -/** - * Indicates the direction of the transfer: `outbound` for API-initiated transfers, or `inbound` for payments received by the FBO account. - * @export - * @enum {string} - */ -export enum TransferDirection { - Outbound = 'outbound', - Inbound = 'inbound', - Null = 'null' -} - /** * Represents an event in the Transfers API. * @export @@ -14046,30 +14473,12 @@ export interface TransferEvent { * @memberof TransferEvent */ transfer_amount: string; - /** - * The currency of the transfer amount. - * @type {string} - * @memberof TransferEvent - */ - transfer_iso_currency_code: string; /** * * @type {TransferFailure} * @memberof TransferEvent */ failure_reason: TransferFailure | null; - /** - * - * @type {TransferDirection} - * @memberof TransferEvent - */ - direction: TransferDirection | null; - /** - * - * @type {TransferReceiverDetails} - * @memberof TransferEvent - */ - receiver_details: TransferReceiverDetails | null; } /** * Defines the request schema for `/transfer/event/list` @@ -14143,12 +14552,6 @@ export interface TransferEventListRequest { * @memberof TransferEventListRequest */ origination_account_id?: string | null; - /** - * Indicates the direction of the transfer: `outbound`: for API-initiated transfers `inbound`: for payments received by the FBO account. - * @type {string} - * @memberof TransferEventListRequest - */ - direction?: TransferEventListRequestDirectionEnum; } /** @@ -14160,15 +14563,6 @@ export enum TransferEventListRequestTransferTypeEnum { Credit = 'credit', Null = 'null' } -/** - * @export - * @enum {string} - */ -export enum TransferEventListRequestDirectionEnum { - Inbound = 'inbound', - Outbound = 'outbound', - Null = 'null' -} /** * Defines the response schema for `/transfer/event/list` @@ -14244,7 +14638,7 @@ export interface TransferEventSyncResponse { request_id: string; } /** - * The type of event that this transfer represents. `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. `reversed`: A posted transfer was reversed. `receiver_pending`: The matching transfer was found as a pending transaction in the receiver\'s account `receiver_posted`: The matching transfer was found as a posted transaction in the receiver\'s account + * The type of event that this transfer represents. `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. `reversed`: A posted transfer was reversed. * @export * @enum {string} */ @@ -14253,9 +14647,7 @@ export enum TransferEventType { Cancelled = 'cancelled', Failed = 'failed', Posted = 'posted', - Reversed = 'reversed', - ReceiverPending = 'receiver_pending', - ReceiverPosted = 'receiver_posted' + Reversed = 'reversed' } /** @@ -14373,12 +14765,6 @@ export interface TransferListRequest { * @memberof TransferListRequest */ origination_account_id?: string | null; - /** - * - * @type {TransferDirection} - * @memberof TransferListRequest - */ - direction?: TransferDirection | null; } /** * Defines the response schema for `/transfer/list` @@ -14411,32 +14797,6 @@ export enum TransferNetwork { SameDayAch = 'same-day-ach' } -/** - * The receiver details if the type of this event is `reciever_pending` or `reciever_posted`. Null value otherwise. - * @export - * @interface TransferReceiverDetails - */ -export interface TransferReceiverDetails { - [key: string]: object | any; - - /** - * The sign of the available balance for the receiver bank account associated with the receiver event at the time the matching transaction was found. Can be `positive`, `negative`, or null if the balance was not available at the time. - * @type {string} - * @memberof TransferReceiverDetails - */ - available_balance: TransferReceiverDetailsAvailableBalanceEnum; -} - -/** - * @export - * @enum {string} - */ -export enum TransferReceiverDetailsAvailableBalanceEnum { - Positive = 'positive', - Negative = 'negative', - Null = 'null' -} - /** * The status of the transfer. * @export @@ -16100,6 +16460,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList: async (bankTransferSweepListRequest: BankTransferSweepListRequest, options: any = {}): Promise => { + // verify required parameter 'bankTransferSweepListRequest' is not null or undefined + assertParamExists('bankTransferSweepList', 'bankTransferSweepListRequest', bankTransferSweepListRequest) + const localVarPath = `/bank_transfer/sweep/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(bankTransferSweepListRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -16631,6 +17036,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck: async (incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options: any = {}): Promise => { + // verify required parameter 'incomeVerificationPrecheckRequest' is not null or undefined + assertParamExists('incomeVerificationPrecheck', 'incomeVerificationPrecheckRequest', incomeVerificationPrecheckRequest) + const localVarPath = `/income/verification/precheck`; + // 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(incomeVerificationPrecheckRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -17666,6 +18116,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse: async (paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options: any = {}): Promise => { + // verify required parameter 'paymentInitiationPaymentReverseRequest' is not null or undefined + assertParamExists('paymentInitiationPaymentReverse', 'paymentInitiationPaymentReverseRequest', paymentInitiationPaymentReverseRequest) + const localVarPath = `/payment_initiation/payment/reverse`; + // 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(paymentInitiationPaymentReverseRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -19403,6 +19898,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.bankTransferSweepGet(bankTransferSweepGetRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.bankTransferSweepList(bankTransferSweepListRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -19520,7 +20026,7 @@ export const PlaidApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -19535,6 +20041,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async incomeVerificationPrecheck(incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -19788,6 +20305,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -20381,6 +20909,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath bankTransferSweepGet(bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any): AxiosPromise { return localVarFp.bankTransferSweepGet(bankTransferSweepGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): AxiosPromise { + return localVarFp.bankTransferSweepList(bankTransferSweepListRequest, options).then((request) => request(axios, basePath)); + }, /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -20488,7 +21026,7 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath * @param {*} [options] Override http request option. * @throws {RequiredError} */ - incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): AxiosPromise { + incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): AxiosPromise { return localVarFp.incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest, options).then((request) => request(axios, basePath)); }, /** @@ -20501,6 +21039,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest: IncomeVerificationPaystubsGetRequest, options?: any): AxiosPromise { return localVarFp.incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck(incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options?: any): AxiosPromise { + return localVarFp.incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options).then((request) => request(axios, basePath)); + }, /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -20731,6 +21279,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath paymentInitiationPaymentList(paymentInitiationPaymentListRequest: PaymentInitiationPaymentListRequest, options?: any): AxiosPromise { return localVarFp.paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options).then((request) => request(axios, basePath)); }, + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options?: any): AxiosPromise { + return localVarFp.paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options).then((request) => request(axios, basePath)); + }, /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -21335,6 +21893,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).bankTransferSweepGet(bankTransferSweepGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any) { + return PlaidApiFp(this.configuration).bankTransferSweepList(bankTransferSweepListRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -21479,6 +22049,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public incomeVerificationPrecheck(incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options?: any) { + return PlaidApiFp(this.configuration).incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -21755,6 +22337,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options?: any) { + return PlaidApiFp(this.configuration).paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient diff --git a/base.ts b/base.ts index 4f393882..e93a007e 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/common.ts b/common.ts index 08a25538..3fac5c12 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/configuration.ts b/configuration.ts index e8b1a5ce..d1fc62a1 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -97,7 +97,7 @@ export class Configuration { if(!this.baseOptions) this.baseOptions = {}; if(!this.baseOptions.headers) this.baseOptions.headers = {}; this.baseOptions.headers = { - ['User-Agent']: `Plaid Node v9.1.0`, + ['User-Agent']: `Plaid Node v9.2.0`, ['Plaid-Version']: '2020-09-14', ...this.baseOptions.headers, } diff --git a/dist/api.d.ts b/dist/api.d.ts index 674028a2..5343a2d4 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -225,13 +225,13 @@ export interface AccountAssetsAllOf { export interface AccountBalance { [key: string]: object | any; /** - * The amount of funds available to be withdrawn from the account, as determined by the financial institution. For `credit`-type accounts, the `available` balance typically equals the `limit` less the `current` balance, less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance typically equals the `current` balance less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance does not include the overdraft limit. For `investment`-type accounts, the `available` balance is the total cash available to withdraw as presented by the institution. Note that not all institutions calculate the `available` balance. In the event that `available` balance is unavailable, Plaid will return an `available` balance value of `null`. Available balance may be cached and is not guaranteed to be up-to-date in realtime unless the value was returned by `/accounts/balance/get`. + * The amount of funds available to be withdrawn from the account, as determined by the financial institution. For `credit`-type accounts, the `available` balance typically equals the `limit` less the `current` balance, less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance typically equals the `current` balance less any pending outflows plus any pending inflows. For `depository`-type accounts, the `available` balance does not include the overdraft limit. For `investment`-type accounts, the `available` balance is the total cash available to withdraw as presented by the institution. Note that not all institutions calculate the `available` balance. In the event that `available` balance is unavailable, Plaid will return an `available` balance value of `null`. Available balance may be cached and is not guaranteed to be up-to-date in realtime unless the value was returned by `/accounts/balance/get`. If `current` is `null` this field is guaranteed not to be `null`. * @type {number} * @memberof AccountBalance */ available: number | null; /** - * The total amount of funds in or owed by the account. For `credit`-type accounts, a positive balance indicates the amount owed; a negative amount indicates the lender owing the account holder. For `loan`-type accounts, the current balance is the principal remaining on the loan, except in the case of student loan accounts at Sallie Mae (`ins_116944`). For Sallie Mae student loans, the account\'s balance includes both principal and any outstanding interest. For `investment`-type accounts, the current balance is the total value of assets as presented by the institution. Note that balance information may be cached unless the value was returned by `/accounts/balance/get`; if the Item is enabled for Transactions, the balance will be at least as recent as the most recent Transaction update. If you require realtime balance information, use the `available` balance as provided by `/accounts/balance/get`. + * The total amount of funds in or owed by the account. For `credit`-type accounts, a positive balance indicates the amount owed; a negative amount indicates the lender owing the account holder. For `loan`-type accounts, the current balance is the principal remaining on the loan, except in the case of student loan accounts at Sallie Mae (`ins_116944`). For Sallie Mae student loans, the account\'s balance includes both principal and any outstanding interest. For `investment`-type accounts, the current balance is the total value of assets as presented by the institution. Note that balance information may be cached unless the value was returned by `/accounts/balance/get`; if the Item is enabled for Transactions, the balance will be at least as recent as the most recent Transaction update. If you require realtime balance information, use the `available` balance as provided by `/accounts/balance/get`. When returned by `/accounts/balance/get`, this field may be `null`. When this happens, `available` is guaranteed not to be `null`. * @type {number} * @memberof AccountBalance */ @@ -1813,6 +1813,46 @@ export interface AuthGetResponse { */ request_id: string; } +/** + * Metadata that captures information about the Auth features of an institution. + * @export + * @interface AuthMetadata + */ +export interface AuthMetadata { + [key: string]: object | any; + /** + * + * @type {AuthSupportedMethods} + * @memberof AuthMetadata + */ + supported_methods: AuthSupportedMethods | null; +} +/** + * Metadata specifically related to which auth methods an institution supports. + * @export + * @interface AuthSupportedMethods + */ +export interface AuthSupportedMethods { + [key: string]: object | any; + /** + * Indicates if instant auth is supported. + * @type {boolean} + * @memberof AuthSupportedMethods + */ + instant_auth: boolean; + /** + * Indicates if instant match is supported. + * @type {boolean} + * @memberof AuthSupportedMethods + */ + instant_match: boolean; + /** + * Indicates if automated microdeposits are supported. + * @type {boolean} + * @memberof AuthSupportedMethods + */ + automated_micro_deposits: boolean; +} /** * Fired when an Item is verified via automated micro-deposits. We recommend communicating to your users when this event is received to notify them that their account is verified and ready for use. * @export @@ -2814,7 +2854,7 @@ export interface BankTransferSweepGetRequest { */ sweep_id: number; /** - * If multiple origination accounts are available, `origination_account_id` must be used to specify the account for which balance will be returned. + * If multiple origination accounts are available, `origination_account_id` must be used to specify the account that the sweep belongs to. * @type {string} * @memberof BankTransferSweepGetRequest */ @@ -2840,6 +2880,75 @@ export interface BankTransferSweepGetResponse { */ request_id: string; } +/** + * BankTransferSweepListRequest defines the request schema for `/bank_transfer/sweep/list` + * @export + * @interface BankTransferSweepListRequest + */ +export interface BankTransferSweepListRequest { + /** + * 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 BankTransferSweepListRequest + */ + 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 BankTransferSweepListRequest + */ + secret?: string; + /** + * If multiple origination accounts are available, `origination_account_id` must be used to specify the account that the sweeps belong to. + * @type {string} + * @memberof BankTransferSweepListRequest + */ + origination_account_id?: string | null; + /** + * Starting ID of sweeps to return. + * @type {number} + * @memberof BankTransferSweepListRequest + */ + start_id?: number | null; + /** + * The start datetime of sweeps to return (RFC 3339 format). + * @type {string} + * @memberof BankTransferSweepListRequest + */ + start_time?: string | null; + /** + * The end datetime of sweeps to return (RFC 3339 format). + * @type {string} + * @memberof BankTransferSweepListRequest + */ + end_time?: string | null; + /** + * The maximum number of sweeps to return. + * @type {number} + * @memberof BankTransferSweepListRequest + */ + count?: number | null; +} +/** + * BankTransferSweepListResponse defines the response schema for `/bank_transfer/sweep/list` + * @export + * @interface BankTransferSweepListResponse + */ +export interface BankTransferSweepListResponse { + [key: string]: object | any; + /** + * + * @type {Array} + * @memberof BankTransferSweepListResponse + */ + sweeps: Array; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof BankTransferSweepListResponse + */ + request_id: string; +} /** * The type of bank transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into the origination account; a `credit` indicates a transfer of money out of the origination account. * @export @@ -3860,18 +3969,22 @@ export interface EarningsTotal { * @enum {string} */ export declare enum EarningsTotalCanonicalDescriptionEnum { - Bonus = "Bonus", - Commission = "Commission", - Overtime = "Overtime", - PaidTimeOff = "Paid Time Off", - RegularPay = "Regular Pay", - Vacation = "Vacation", - EmployeeMedicare = "Employee Medicare", + Bonus = "BONUS", + Commission = "COMMISSION", + Overtime = "OVERTIME", + PaidTimeOff = "PAID TIME OFF", + RegularPay = "REGULAR PAY", + Vacation = "VACATION", + EmployeeMedicare = "EMPLOYEE MEDICARE", Fica = "FICA", - SocialSecurityEmployeeTax = "Social Security Employee Tax", - Medical = "Medical", - Vision = "Vision", - Dental = "Dental" + SocialSecurityEmployeeTax = "SOCIAL SECURITY EMPLOYEE TAX", + Medical = "MEDICAL", + Vision = "VISION", + Dental = "DENTAL", + NetPay = "NET PAY", + Taxes = "TAXES", + NotFound = "NOT_FOUND", + Other = "OTHER" } /** * An object representing an email address @@ -4863,6 +4976,32 @@ export interface IncomeVerificationPaystubGetRequest { */ access_token?: string | null; } +/** + * IncomeVerificationPaystubGetResponse defines the response schema for `/income/verification/paystub/get`. + * @export + * @interface IncomeVerificationPaystubGetResponse + */ +export interface IncomeVerificationPaystubGetResponse { + [key: string]: object | any; + /** + * + * @type {Paystub} + * @memberof IncomeVerificationPaystubGetResponse + */ + paystub: Paystub; + /** + * + * @type {Error} + * @memberof IncomeVerificationPaystubGetResponse + */ + error?: Error | null; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof IncomeVerificationPaystubGetResponse + */ + request_id: string; +} /** * IncomeVerificationPaystubsGetRequest defines the request schema for `/income/verification/paystubs/get`. * @export @@ -4927,6 +5066,163 @@ export interface IncomeVerificationPaystubsGetResponse { */ request_id: string; } +/** + * + * @export + * @interface IncomeVerificationPrecheckEmployer + */ +export interface IncomeVerificationPrecheckEmployer { + /** + * The employer\'s name + * @type {string} + * @memberof IncomeVerificationPrecheckEmployer + */ + name?: string; + /** + * The employer\'s tax id + * @type {string} + * @memberof IncomeVerificationPrecheckEmployer + */ + tax_id?: string; +} +/** + * + * @export + * @interface IncomeVerificationPrecheckMilitaryInfo + */ +export interface IncomeVerificationPrecheckMilitaryInfo { + /** + * Is the user currently active duty in the US military + * @type {boolean} + * @memberof IncomeVerificationPrecheckMilitaryInfo + */ + is_active_duty?: boolean | null; + /** + * If the user is currently serving in the US military, the branch of the military they are serving in + * @type {string} + * @memberof IncomeVerificationPrecheckMilitaryInfo + */ + branch?: IncomeVerificationPrecheckMilitaryInfoBranchEnum; +} +/** + * @export + * @enum {string} + */ +export declare enum IncomeVerificationPrecheckMilitaryInfoBranchEnum { + AirForce = "AIR FORCE", + Army = "ARMY", + CoastGuard = "COAST GUARD", + Marines = "MARINES", + Navy = "NAVY" +} +/** + * IncomeVerificationPrecheckRequest defines the request schema for `/income/verification/precheck` + * @export + * @interface IncomeVerificationPrecheckRequest + */ +export interface IncomeVerificationPrecheckRequest { + /** + * 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 IncomeVerificationPrecheckRequest + */ + 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 IncomeVerificationPrecheckRequest + */ + secret?: string; + /** + * + * @type {IncomeVerificationPrecheckUser} + * @memberof IncomeVerificationPrecheckRequest + */ + user?: IncomeVerificationPrecheckUser | null; + /** + * + * @type {IncomeVerificationPrecheckEmployer} + * @memberof IncomeVerificationPrecheckRequest + */ + employer?: IncomeVerificationPrecheckEmployer | null; + /** + * The access token associated with the Item data is being requested for. + * @type {string} + * @memberof IncomeVerificationPrecheckRequest + */ + transactions_access_token?: string | null; + /** + * + * @type {IncomeVerificationPrecheckMilitaryInfo} + * @memberof IncomeVerificationPrecheckRequest + */ + us_military_info?: IncomeVerificationPrecheckMilitaryInfo | null; +} +/** + * IncomeVerificationPrecheckResponse defines the response schema for `/income/verification/precheck`. + * @export + * @interface IncomeVerificationPrecheckResponse + */ +export interface IncomeVerificationPrecheckResponse { + /** + * ID of the precheck. + * @type {string} + * @memberof IncomeVerificationPrecheckResponse + */ + precheck_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 IncomeVerificationPrecheckResponse + */ + request_id: string; + /** + * The confidence that Plaid can support the user in the income verification flow. One of the following: `\"HIGH\"`: This precheck information submitted is definitively tied to a Plaid-supported integration. \"`LOW`\": This precheck information submitted is known not to be supported by Plaid. `\"UNKNOWN\"`: It was not possible to determine if the user is supportable with the information passed. + * @type {string} + * @memberof IncomeVerificationPrecheckResponse + */ + confidence: IncomeVerificationPrecheckResponseConfidenceEnum; +} +/** + * @export + * @enum {string} + */ +export declare enum IncomeVerificationPrecheckResponseConfidenceEnum { + High = "HIGH", + Low = "LOW", + Unknown = "UNKNOWN" +} +/** + * + * @export + * @interface IncomeVerificationPrecheckUser + */ +export interface IncomeVerificationPrecheckUser { + /** + * The user\'s first name + * @type {string} + * @memberof IncomeVerificationPrecheckUser + */ + first_name?: string | null; + /** + * The user\'s last name + * @type {string} + * @memberof IncomeVerificationPrecheckUser + */ + last_name?: string | null; + /** + * The user\'s email address + * @type {string} + * @memberof IncomeVerificationPrecheckUser + */ + email_address?: string | null; + /** + * + * @type {AddressDataNullable} + * @memberof IncomeVerificationPrecheckUser + */ + home_address?: AddressDataNullable | null; +} /** * IncomeVerificationRefreshRequest defines the request schema for `/income/verification/refresh` * @export @@ -5295,6 +5591,12 @@ export interface Institution { * @memberof Institution */ payment_initiation_metadata?: PaymentInitiationMetadata | null; + /** + * + * @type {AuthMetadata} + * @memberof Institution + */ + auth_metadata?: AuthMetadata | null; } /** * The status of an institution is determined by the health of its Item logins, Transactions updates, Investments updates, Liabilities updates, Auth requests, Balance requests, Identity requests, Investments requests, and Liabilities requests. A login attempt is conducted during the initial Item add in Link. If there is not enough traffic to accurately calculate an institution\'s status, Plaid will return null rather than potentially inaccurate data. Institution status is accessible in the Dashboard and via the API using the `/institutions/get_by_id` endpoint with the `include_status` option set to true. Note that institution status is not available in the Sandbox environment. @@ -5419,6 +5721,12 @@ export interface InstitutionsGetByIdRequestOptions { * @memberof InstitutionsGetByIdRequestOptions */ include_status?: boolean; + /** + * When `true`, returns metadata related to the Auth product indicating which auth methods are supported. + * @type {boolean} + * @memberof InstitutionsGetByIdRequestOptions + */ + include_auth_metadata?: boolean; /** * When `true`, returns metadata related to the Payment Initiation product indicating which payment configurations are supported. * @type {boolean} @@ -5519,6 +5827,12 @@ export interface InstitutionsGetRequestOptions { * @memberof InstitutionsGetRequestOptions */ include_optional_metadata?: boolean; + /** + * When `true`, returns metadata related to the Auth product indicating which auth methods are supported. + * @type {boolean} + * @memberof InstitutionsGetRequestOptions + */ + include_auth_metadata?: boolean; /** * When `true`, returns metadata related to the Payment Initiation product indicating which payment configurations are supported. * @type {boolean} @@ -5659,6 +5973,12 @@ export interface InstitutionsSearchRequestOptions { * @memberof InstitutionsSearchRequestOptions */ include_optional_metadata?: boolean; + /** + * When `true`, returns metadata related to the Auth product indicating which auth methods are supported. + * @type {boolean} + * @memberof InstitutionsSearchRequestOptions + */ + include_auth_metadata?: boolean; /** * When `true`, returns metadata related to the Payment Initiation product indicating which payment configurations are supported. * @type {boolean} @@ -8902,6 +9222,12 @@ export interface PaymentInitiationPayment { * @memberof PaymentInitiationPayment */ iban: string | null; + /** + * Initiated refunds associated with the payment. + * @type {Array} + * @memberof PaymentInitiationPayment + */ + initiated_refunds?: Array; /** * The EMI (E-Money Institution) account that this payment is associated with, if any. This EMI account is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. * @type {string} @@ -9102,6 +9428,12 @@ export interface PaymentInitiationPaymentGetResponse { * @memberof PaymentInitiationPaymentGetResponse */ iban: string | null; + /** + * Initiated refunds associated with the payment. + * @type {Array} + * @memberof PaymentInitiationPaymentGetResponse + */ + initiated_refunds?: Array; /** * The EMI (E-Money Institution) account that this payment is associated with, if any. This EMI account is used as an intermediary account to enable Plaid to reconcile the settlement of funds for Payment Initiation requests. * @type {string} @@ -9186,6 +9518,67 @@ export interface PaymentInitiationPaymentListResponse { */ request_id: string; } +/** + * PaymentInitiationPaymentReverseRequest defines the request schema for `/payment_initiation/payment/reverse` + * @export + * @interface PaymentInitiationPaymentReverseRequest + */ +export interface PaymentInitiationPaymentReverseRequest { + /** + * 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 PaymentInitiationPaymentReverseRequest + */ + 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 PaymentInitiationPaymentReverseRequest + */ + secret?: string; + /** + * The ID of the payment to reverse + * @type {string} + * @memberof PaymentInitiationPaymentReverseRequest + */ + payment_id: string; +} +/** + * PaymentInitiationPaymentReverseResponse defines the response schema for `/payment_initation/payment/reverse` + * @export + * @interface PaymentInitiationPaymentReverseResponse + */ +export interface PaymentInitiationPaymentReverseResponse { + [key: string]: object | any; + /** + * A unique ID identifying the refund + * @type {string} + * @memberof PaymentInitiationPaymentReverseResponse + */ + refund_id: string; + /** + * The status of the refund. `PROCESSING`: The refund is currently being processed. The refund will automatically exit this state when processing is complete. `INITIATED`: The refund has been successfully initiated. `EXECUTED`: Indicates that the refund has been successfully executed. `FAILED`: The refund has failed to be executed. This error is retryable once the root cause is resolved. + * @type {string} + * @memberof PaymentInitiationPaymentReverseResponse + */ + status: PaymentInitiationPaymentReverseResponseStatusEnum; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof PaymentInitiationPaymentReverseResponse + */ + request_id: string; +} +/** + * @export + * @enum {string} + */ +export declare enum PaymentInitiationPaymentReverseResponseStatusEnum { + Processing = "PROCESSING", + Executed = "EXECUTED", + Initiated = "INITIATED", + Failed = "FAILED" +} /** * PaymentInitiationPaymentTokenCreateRequest defines the request schema for `/payment_initiation/payment/token/create` * @export @@ -9470,6 +9863,48 @@ export interface PaymentInitiationRecipientListResponse { */ request_id: string; } +/** + * PaymentInitiationRefund defines a payment initiation refund + * @export + * @interface PaymentInitiationRefund + */ +export interface PaymentInitiationRefund { + [key: string]: object | any; + /** + * The ID of the refund. Like all Plaid identifiers, the `refund_id` is case sensitive. + * @type {string} + * @memberof PaymentInitiationRefund + */ + refund_id: string; + /** + * + * @type {PaymentAmount} + * @memberof PaymentInitiationRefund + */ + amount: PaymentAmount; + /** + * The status of the refund. `PROCESSING`: The refund is currently being processed. The refund will automatically exit this state when processing is complete. `INITIATED`: The refund has been successfully initiated. `EXECUTED`: Indicates that the refund has been successfully executed. `FAILED`: The refund has failed to be executed. This error is retryable once the root cause is resolved. + * @type {string} + * @memberof PaymentInitiationRefund + */ + status: PaymentInitiationRefundStatusEnum; + /** + * The date and time of the last time the `status` was updated, in IS0 8601 format + * @type {string} + * @memberof PaymentInitiationRefund + */ + last_status_update: string; +} +/** + * @export + * @enum {string} + */ +export declare enum PaymentInitiationRefundStatusEnum { + Processing = "PROCESSING", + Initiated = "INITIATED", + Executed = "EXECUTED", + Failed = "FAILED" +} /** * Metadata specifically related to valid Payment Initiation standing order configurations for the institution. * @export @@ -9939,6 +10374,26 @@ export interface PendingExpirationWebhook { */ consent_expiration_time: string; } +/** + * Information describing the intent of the transaction. Most relevant for personal finance use cases, but not limited to such use cases. The field is currently in beta. The complete category can be generated by concatenating primary and detailed categories. This feature is currently in beta – to request access, contact transactions-feedback@plaid.com. + * @export + * @interface PersonalFinanceCategory + */ +export interface PersonalFinanceCategory { + [key: string]: object | any; + /** + * A high level category that communicates the broad category of the transaction. + * @type {string} + * @memberof PersonalFinanceCategory + */ + primary: string; + /** + * Provides additional granularity to the primary categorization. + * @type {string} + * @memberof PersonalFinanceCategory + */ + detailed: string; +} /** * A phone number * @export @@ -10422,7 +10877,7 @@ export declare enum ProcessorTokenCreateRequestProcessorEnum { PrimeTrust = "prime_trust", Rize = "rize", SilaMoney = "sila_money", - SbvApi = "sbv_api", + SvbApi = "svb_api", TreasuryPrime = "treasury_prime", Unit = "unit", Vesta = "vesta", @@ -11569,7 +12024,7 @@ export interface SignalAddressData { country?: string | null; } /** - * + * SignalDecisionReportRequest defines the request schema for `/signal/decision/report` * @export * @interface SignalDecisionReportRequest */ @@ -11600,7 +12055,7 @@ export interface SignalDecisionReportRequest { initiated: boolean; } /** - * + * SignalDecisionReportResponse defines the response schema for `/signal/decision/report` * @export * @interface SignalDecisionReportResponse */ @@ -11849,7 +12304,7 @@ export interface SignalEvaluateCoreAttributes { address_change_count_90d?: number | null; } /** - * + * SignalEvaluateRequest defines the request schema for `/signal/evaluate` * @export * @interface SignalEvaluateRequest */ @@ -11911,7 +12366,7 @@ export interface SignalEvaluateRequest { device?: SignalDevice; } /** - * + * SignalEvaluateResponse defines the response schema for `/signal/income/evaluate` * @export * @interface SignalEvaluateResponse */ @@ -11974,7 +12429,7 @@ export interface SignalPersonName { suffix?: string | null; } /** - * + * SignalReturnReportRequest defines the request schema for `/signal/return/report` * @export * @interface SignalReturnReportRequest */ @@ -12005,7 +12460,7 @@ export interface SignalReturnReportRequest { return_code: string; } /** - * + * SignalReturnReportResponse defines the response schema for `/signal/return/report` * @export * @interface SignalReturnReportResponse */ @@ -12018,7 +12473,7 @@ export interface SignalReturnReportResponse { request_id: string; } /** - * + * Risk scoring details broken down by risk category. * @export * @interface SignalScores */ @@ -12506,18 +12961,22 @@ export interface Total { * @enum {string} */ export declare enum TotalCanonicalDescriptionEnum { - Bonus = "Bonus", - Commission = "Commission", - Overtime = "Overtime", - PaidTimeOff = "Paid Time Off", - RegularPay = "Regular Pay", - Vacation = "Vacation", - EmployeeMedicare = "Employee Medicare", + Bonus = "BONUS", + Commission = "COMMISSION", + Overtime = "OVERTIME", + PaidTimeOff = "PAID TIME OFF", + RegularPay = "REGULAR PAY", + Vacation = "VACATION", + EmployeeMedicare = "EMPLOYEE MEDICARE", Fica = "FICA", - SocialSecurityEmployeeTax = "Social Security Employee Tax", - Medical = "Medical", - Vision = "Vision", - Dental = "Dental" + SocialSecurityEmployeeTax = "SOCIAL SECURITY EMPLOYEE TAX", + Medical = "MEDICAL", + Vision = "VISION", + Dental = "DENTAL", + NetPay = "NET PAY", + Taxes = "TAXES", + NotFound = "NOT_FOUND", + Other = "OTHER" } /** * A representation of a transaction @@ -12664,6 +13123,12 @@ export interface Transaction { * @memberof Transaction */ transaction_code: TransactionCode | null; + /** + * + * @type {PersonalFinanceCategory & any} + * @memberof Transaction + */ + personal_finance_category?: PersonalFinanceCategory & any | null; } /** * @export @@ -12732,6 +13197,12 @@ export interface TransactionAllOf { * @memberof TransactionAllOf */ transaction_code: TransactionCode | null; + /** + * + * @type {PersonalFinanceCategory & any} + * @memberof TransactionAllOf + */ + personal_finance_category?: PersonalFinanceCategory & any | null; } /** * @export @@ -13026,6 +13497,12 @@ export interface TransactionsGetRequestOptions { * @memberof TransactionsGetRequestOptions */ include_original_description?: boolean | null; + /** + * Include the `personal_finance_category` object in the response. This feature is currently in beta – to request access, contact transactions-feedback@plaid.com. + * @type {boolean} + * @memberof TransactionsGetRequestOptions + */ + include_personal_finance_category_beta?: boolean; } /** * TransactionsGetResponse defines the response schema for `/transactions/get` @@ -13184,12 +13661,6 @@ export interface Transfer { * @memberof Transfer */ amount: string; - /** - * The currency of the transfer amount, e.g. \"USD\" - * @type {string} - * @memberof Transfer - */ - iso_currency_code: string; /** * The description of the transfer. * @type {string} @@ -13226,12 +13697,6 @@ export interface Transfer { * @memberof Transfer */ failure_reason: TransferFailure | null; - /** - * A string containing the custom tag provided by the client in the create request. Will be null if not provided. - * @type {string} - * @memberof Transfer - */ - custom_tag: string | null; /** * The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: - The JSON values must be Strings (no nested JSON objects allowed) - Only ASCII characters may be used - Maximum of 50 key/value pairs - Maximum key length of 40 characters - Maximum value length of 500 characters * @type {{ [key: string]: string; }} @@ -13246,12 +13711,6 @@ export interface Transfer { * @memberof Transfer */ origination_account_id: string; - /** - * - * @type {TransferDirection} - * @memberof Transfer - */ - direction: TransferDirection | null; } /** * TransferAuthorization contains the authorization decision for a proposed transfer @@ -13348,18 +13807,6 @@ export interface TransferAuthorizationCreateRequest { * @memberof TransferAuthorizationCreateRequest */ amount: string; - /** - * The currency of the transfer amount – should be set to \"USD\". - * @type {string} - * @memberof TransferAuthorizationCreateRequest - */ - iso_currency_code: string; - /** - * The authorization description. Maximum of 10 characters. - * @type {string} - * @memberof TransferAuthorizationCreateRequest - */ - description: string; /** * * @type {ACHClass} @@ -13493,18 +13940,6 @@ export interface TransferAuthorizationProposedTransfer { * @memberof TransferAuthorizationProposedTransfer */ amount: string; - /** - * The currency of the transfer amount. - * @type {string} - * @memberof TransferAuthorizationProposedTransfer - */ - iso_currency_code: string; - /** - * A description of the proposed transfer. - * @type {string} - * @memberof TransferAuthorizationProposedTransfer - */ - description: string; /** * The network or rails used for the transfer. * @type {string} @@ -13617,12 +14052,6 @@ export interface TransferCreateRequest { * @memberof TransferCreateRequest */ amount: string; - /** - * The currency of the transfer amount – should be set to \"USD\". - * @type {string} - * @memberof TransferCreateRequest - */ - iso_currency_code: string; /** * The transfer description. Maximum of 10 characters. * @type {string} @@ -13634,19 +14063,13 @@ export interface TransferCreateRequest { * @type {ACHClass} * @memberof TransferCreateRequest */ - ach_class?: ACHClass; + ach_class: ACHClass; /** * * @type {TransferUserInRequest} * @memberof TransferCreateRequest */ user: TransferUserInRequest; - /** - * An arbitrary string provided by the client for storage with the transfer. May be up to 100 characters. - * @type {string} - * @memberof TransferCreateRequest - */ - custom_tag?: string | null; /** * The Metadata object is a mapping of client-provided string fields to any string value. The following limitations apply: - The JSON values must be Strings (no nested JSON objects allowed) - Only ASCII characters may be used - Maximum of 50 key/value pairs - Maximum key length of 40 characters - Maximum value length of 500 characters * @type {{ [key: string]: string; }} @@ -13682,16 +14105,6 @@ export interface TransferCreateResponse { */ request_id: string; } -/** - * Indicates the direction of the transfer: `outbound` for API-initiated transfers, or `inbound` for payments received by the FBO account. - * @export - * @enum {string} - */ -export declare enum TransferDirection { - Outbound = "outbound", - Inbound = "inbound", - Null = "null" -} /** * Represents an event in the Transfers API. * @export @@ -13747,30 +14160,12 @@ export interface TransferEvent { * @memberof TransferEvent */ transfer_amount: string; - /** - * The currency of the transfer amount. - * @type {string} - * @memberof TransferEvent - */ - transfer_iso_currency_code: string; /** * * @type {TransferFailure} * @memberof TransferEvent */ failure_reason: TransferFailure | null; - /** - * - * @type {TransferDirection} - * @memberof TransferEvent - */ - direction: TransferDirection | null; - /** - * - * @type {TransferReceiverDetails} - * @memberof TransferEvent - */ - receiver_details: TransferReceiverDetails | null; } /** * Defines the request schema for `/transfer/event/list` @@ -13844,12 +14239,6 @@ export interface TransferEventListRequest { * @memberof TransferEventListRequest */ origination_account_id?: string | null; - /** - * Indicates the direction of the transfer: `outbound`: for API-initiated transfers `inbound`: for payments received by the FBO account. - * @type {string} - * @memberof TransferEventListRequest - */ - direction?: TransferEventListRequestDirectionEnum; } /** * @export @@ -13860,15 +14249,6 @@ export declare enum TransferEventListRequestTransferTypeEnum { Credit = "credit", Null = "null" } -/** - * @export - * @enum {string} - */ -export declare enum TransferEventListRequestDirectionEnum { - Inbound = "inbound", - Outbound = "outbound", - Null = "null" -} /** * Defines the response schema for `/transfer/event/list` * @export @@ -13941,7 +14321,7 @@ export interface TransferEventSyncResponse { request_id: string; } /** - * The type of event that this transfer represents. `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. `reversed`: A posted transfer was reversed. `receiver_pending`: The matching transfer was found as a pending transaction in the receiver\'s account `receiver_posted`: The matching transfer was found as a posted transaction in the receiver\'s account + * The type of event that this transfer represents. `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. `reversed`: A posted transfer was reversed. * @export * @enum {string} */ @@ -13950,9 +14330,7 @@ export declare enum TransferEventType { Cancelled = "cancelled", Failed = "failed", Posted = "posted", - Reversed = "reversed", - ReceiverPending = "receiver_pending", - ReceiverPosted = "receiver_posted" + Reversed = "reversed" } /** * The failure reason if the type of this transfer is `\"failed\"` or `\"reversed\"`. Null value otherwise. @@ -14067,12 +14445,6 @@ export interface TransferListRequest { * @memberof TransferListRequest */ origination_account_id?: string | null; - /** - * - * @type {TransferDirection} - * @memberof TransferListRequest - */ - direction?: TransferDirection | null; } /** * Defines the response schema for `/transfer/list` @@ -14103,29 +14475,6 @@ export declare enum TransferNetwork { Ach = "ach", SameDayAch = "same-day-ach" } -/** - * The receiver details if the type of this event is `reciever_pending` or `reciever_posted`. Null value otherwise. - * @export - * @interface TransferReceiverDetails - */ -export interface TransferReceiverDetails { - [key: string]: object | any; - /** - * The sign of the available balance for the receiver bank account associated with the receiver event at the time the matching transaction was found. Can be `positive`, `negative`, or null if the balance was not available at the time. - * @type {string} - * @memberof TransferReceiverDetails - */ - available_balance: TransferReceiverDetailsAvailableBalanceEnum; -} -/** - * @export - * @enum {string} - */ -export declare enum TransferReceiverDetailsAvailableBalanceEnum { - Positive = "positive", - Negative = "negative", - Null = "null" -} /** * The status of the transfer. * @export @@ -14954,6 +15303,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ bankTransferSweepGet: (bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any) => Promise; + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList: (bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any) => Promise; /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -15050,6 +15407,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ incomeVerificationPaystubsGet: (incomeVerificationPaystubsGetRequest: IncomeVerificationPaystubsGetRequest, options?: any) => Promise; + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck: (incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options?: any) => Promise; /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -15236,6 +15601,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ paymentInitiationPaymentList: (paymentInitiationPaymentListRequest: PaymentInitiationPaymentListRequest, options?: any) => Promise; + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse: (paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options?: any) => Promise; /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -15684,6 +16057,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ 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 + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -15771,7 +16152,7 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @param {*} [options] Override http request option. * @throws {RequiredError} */ - incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * `/income/verification/paystubs/get` returns the information collected from the paystubs that were used to verify an end user\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. * @summary Retrieve information from the paystubs used for income verification @@ -15780,6 +16161,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest: IncomeVerificationPaystubsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck(incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -15966,6 +16355,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ paymentInitiationPaymentList(paymentInitiationPaymentListRequest: PaymentInitiationPaymentListRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -16414,6 +16811,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ bankTransferSweepGet(bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any): AxiosPromise; + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): AxiosPromise; /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -16501,7 +16906,7 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @param {*} [options] Override http request option. * @throws {RequiredError} */ - incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): AxiosPromise; + incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): AxiosPromise; /** * `/income/verification/paystubs/get` returns the information collected from the paystubs that were used to verify an end user\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. * @summary Retrieve information from the paystubs used for income verification @@ -16510,6 +16915,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest: IncomeVerificationPaystubsGetRequest, options?: any): AxiosPromise; + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck(incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options?: any): AxiosPromise; /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -16696,6 +17109,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ paymentInitiationPaymentList(paymentInitiationPaymentListRequest: PaymentInitiationPaymentListRequest, options?: any): AxiosPromise; + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options?: any): AxiosPromise; /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -17168,6 +17589,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ bankTransferSweepGet(bankTransferSweepGetRequest: BankTransferSweepGetRequest, options?: any): Promise>; + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + bankTransferSweepList(bankTransferSweepListRequest: BankTransferSweepListRequest, options?: any): Promise>; /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -17266,7 +17696,7 @@ export declare class PlaidApi extends BaseAPI { * @throws {RequiredError} * @memberof PlaidApi */ - incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): Promise>; + incomeVerificationPaystubGet(incomeVerificationPaystubGetRequest: IncomeVerificationPaystubGetRequest, options?: any): Promise>; /** * `/income/verification/paystubs/get` returns the information collected from the paystubs that were used to verify an end user\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. * @summary Retrieve information from the paystubs used for income verification @@ -17276,6 +17706,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest: IncomeVerificationPaystubsGetRequest, options?: any): Promise>; + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + incomeVerificationPrecheck(incomeVerificationPrecheckRequest: IncomeVerificationPrecheckRequest, options?: any): Promise>; /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -17485,6 +17924,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ paymentInitiationPaymentList(paymentInitiationPaymentListRequest: PaymentInitiationPaymentListRequest, options?: any): Promise>; + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest: PaymentInitiationPaymentReverseRequest, options?: any): Promise>; /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient diff --git a/dist/api.js b/dist/api.js index 3b39e313..17d716d7 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -25,8 +25,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PhoneNumberTypeEnum = exports.PaystubDetailsPayFrequencyEnum = exports.PaymentStatusUpdateWebhookOldPaymentStatusEnum = exports.PaymentStatusUpdateWebhookNewPaymentStatusEnum = exports.PaymentScheduleInterval = exports.PaymentInitiationPaymentGetResponseStatusEnum = exports.PaymentInitiationPaymentCreateResponseStatusEnum = exports.PaymentInitiationPaymentStatusEnum = exports.PaymentAmountCurrencyEnum = exports.PayFrequencyValueEnum = exports.OverrideAccountType = exports.ModelErrorErrorTypeEnum = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.ItemUpdateTypeEnum = exports.InvestmentTransactionSubtypeEnum = exports.InvestmentTransactionTypeEnum = exports.IncomeBreakdownTypeEnum = exports.IncidentUpdateStatusEnum = exports.EmailTypeEnum = exports.EarningsTotalCanonicalDescriptionEnum = exports.DepositSwitchTargetAccountAccountSubtypeEnum = exports.DepositSwitchGetResponseSwitchMethodEnum = exports.DepositSwitchGetResponseStateEnum = exports.DepositSwitchCreateRequestCountryCodeEnum = exports.DepositSwitchAltCreateRequestCountryCodeEnum = exports.CountryCode = exports.ConnectedApplicationProductDataTypesEnum = exports.BankTransferType = exports.BankTransferStatus = exports.BankTransferReceiverDetailsAvailableBalanceEnum = exports.BankTransferNetwork = exports.BankTransferEventType = exports.BankTransferEventListRequestDirectionEnum = exports.BankTransferEventListRequestBankTransferTypeEnum = exports.BankTransferDirection = exports.AssetReportTransactionTransactionTypeEnum = exports.AccountType = exports.AccountSubtype = exports.AccountSelectionCardinality = exports.AccountIdentityVerificationStatusEnum = exports.AccountBaseVerificationStatusEnum = exports.AccountAssetsVerificationStatusEnum = exports.APRAprTypeEnum = exports.ACHClass = void 0; -exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.WarningWarningCodeEnum = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.TransferType = exports.TransferStatus = exports.TransferReceiverDetailsAvailableBalanceEnum = exports.TransferNetwork = exports.TransferEventType = exports.TransferEventListRequestDirectionEnum = exports.TransferEventListRequestTransferTypeEnum = exports.TransferDirection = exports.TransferAuthorizationDecisionRationaleCodeEnum = exports.TransferAuthorizationDecisionEnum = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescriptionEnum = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.ScopesContext = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = void 0; +exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PhoneNumberTypeEnum = exports.PaystubDetailsPayFrequencyEnum = exports.PaymentStatusUpdateWebhookOldPaymentStatusEnum = exports.PaymentStatusUpdateWebhookNewPaymentStatusEnum = exports.PaymentScheduleInterval = exports.PaymentInitiationRefundStatusEnum = exports.PaymentInitiationPaymentReverseResponseStatusEnum = exports.PaymentInitiationPaymentGetResponseStatusEnum = exports.PaymentInitiationPaymentCreateResponseStatusEnum = exports.PaymentInitiationPaymentStatusEnum = exports.PaymentAmountCurrencyEnum = exports.PayFrequencyValueEnum = exports.OverrideAccountType = exports.ModelErrorErrorTypeEnum = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.ItemUpdateTypeEnum = exports.InvestmentTransactionSubtypeEnum = exports.InvestmentTransactionTypeEnum = exports.IncomeVerificationPrecheckResponseConfidenceEnum = exports.IncomeVerificationPrecheckMilitaryInfoBranchEnum = exports.IncomeBreakdownTypeEnum = exports.IncidentUpdateStatusEnum = exports.EmailTypeEnum = exports.EarningsTotalCanonicalDescriptionEnum = exports.DepositSwitchTargetAccountAccountSubtypeEnum = exports.DepositSwitchGetResponseSwitchMethodEnum = exports.DepositSwitchGetResponseStateEnum = exports.DepositSwitchCreateRequestCountryCodeEnum = exports.DepositSwitchAltCreateRequestCountryCodeEnum = exports.CountryCode = exports.ConnectedApplicationProductDataTypesEnum = exports.BankTransferType = exports.BankTransferStatus = exports.BankTransferReceiverDetailsAvailableBalanceEnum = exports.BankTransferNetwork = exports.BankTransferEventType = exports.BankTransferEventListRequestDirectionEnum = exports.BankTransferEventListRequestBankTransferTypeEnum = exports.BankTransferDirection = exports.AssetReportTransactionTransactionTypeEnum = exports.AccountType = exports.AccountSubtype = exports.AccountSelectionCardinality = exports.AccountIdentityVerificationStatusEnum = exports.AccountBaseVerificationStatusEnum = exports.AccountAssetsVerificationStatusEnum = exports.APRAprTypeEnum = exports.ACHClass = void 0; +exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.WarningWarningCodeEnum = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.TransferType = exports.TransferStatus = exports.TransferNetwork = exports.TransferEventType = exports.TransferEventListRequestTransferTypeEnum = exports.TransferAuthorizationDecisionRationaleCodeEnum = exports.TransferAuthorizationDecisionEnum = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescriptionEnum = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.ScopesContext = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = void 0; const axios_1 = __importDefault(require("axios")); // Some imports not used depending on template conditions // @ts-ignore @@ -392,18 +392,22 @@ var DepositSwitchTargetAccountAccountSubtypeEnum; */ var EarningsTotalCanonicalDescriptionEnum; (function (EarningsTotalCanonicalDescriptionEnum) { - EarningsTotalCanonicalDescriptionEnum["Bonus"] = "Bonus"; - EarningsTotalCanonicalDescriptionEnum["Commission"] = "Commission"; - EarningsTotalCanonicalDescriptionEnum["Overtime"] = "Overtime"; - EarningsTotalCanonicalDescriptionEnum["PaidTimeOff"] = "Paid Time Off"; - EarningsTotalCanonicalDescriptionEnum["RegularPay"] = "Regular Pay"; - EarningsTotalCanonicalDescriptionEnum["Vacation"] = "Vacation"; - EarningsTotalCanonicalDescriptionEnum["EmployeeMedicare"] = "Employee Medicare"; + EarningsTotalCanonicalDescriptionEnum["Bonus"] = "BONUS"; + EarningsTotalCanonicalDescriptionEnum["Commission"] = "COMMISSION"; + EarningsTotalCanonicalDescriptionEnum["Overtime"] = "OVERTIME"; + EarningsTotalCanonicalDescriptionEnum["PaidTimeOff"] = "PAID TIME OFF"; + EarningsTotalCanonicalDescriptionEnum["RegularPay"] = "REGULAR PAY"; + EarningsTotalCanonicalDescriptionEnum["Vacation"] = "VACATION"; + EarningsTotalCanonicalDescriptionEnum["EmployeeMedicare"] = "EMPLOYEE MEDICARE"; EarningsTotalCanonicalDescriptionEnum["Fica"] = "FICA"; - EarningsTotalCanonicalDescriptionEnum["SocialSecurityEmployeeTax"] = "Social Security Employee Tax"; - EarningsTotalCanonicalDescriptionEnum["Medical"] = "Medical"; - EarningsTotalCanonicalDescriptionEnum["Vision"] = "Vision"; - EarningsTotalCanonicalDescriptionEnum["Dental"] = "Dental"; + EarningsTotalCanonicalDescriptionEnum["SocialSecurityEmployeeTax"] = "SOCIAL SECURITY EMPLOYEE TAX"; + EarningsTotalCanonicalDescriptionEnum["Medical"] = "MEDICAL"; + EarningsTotalCanonicalDescriptionEnum["Vision"] = "VISION"; + EarningsTotalCanonicalDescriptionEnum["Dental"] = "DENTAL"; + EarningsTotalCanonicalDescriptionEnum["NetPay"] = "NET PAY"; + EarningsTotalCanonicalDescriptionEnum["Taxes"] = "TAXES"; + EarningsTotalCanonicalDescriptionEnum["NotFound"] = "NOT_FOUND"; + EarningsTotalCanonicalDescriptionEnum["Other"] = "OTHER"; })(EarningsTotalCanonicalDescriptionEnum = exports.EarningsTotalCanonicalDescriptionEnum || (exports.EarningsTotalCanonicalDescriptionEnum = {})); /** * @export @@ -438,6 +442,28 @@ var IncomeBreakdownTypeEnum; IncomeBreakdownTypeEnum["Regular"] = "regular"; IncomeBreakdownTypeEnum["Null"] = "null"; })(IncomeBreakdownTypeEnum = exports.IncomeBreakdownTypeEnum || (exports.IncomeBreakdownTypeEnum = {})); +/** + * @export + * @enum {string} + */ +var IncomeVerificationPrecheckMilitaryInfoBranchEnum; +(function (IncomeVerificationPrecheckMilitaryInfoBranchEnum) { + IncomeVerificationPrecheckMilitaryInfoBranchEnum["AirForce"] = "AIR FORCE"; + IncomeVerificationPrecheckMilitaryInfoBranchEnum["Army"] = "ARMY"; + IncomeVerificationPrecheckMilitaryInfoBranchEnum["CoastGuard"] = "COAST GUARD"; + IncomeVerificationPrecheckMilitaryInfoBranchEnum["Marines"] = "MARINES"; + IncomeVerificationPrecheckMilitaryInfoBranchEnum["Navy"] = "NAVY"; +})(IncomeVerificationPrecheckMilitaryInfoBranchEnum = exports.IncomeVerificationPrecheckMilitaryInfoBranchEnum || (exports.IncomeVerificationPrecheckMilitaryInfoBranchEnum = {})); +/** + * @export + * @enum {string} + */ +var IncomeVerificationPrecheckResponseConfidenceEnum; +(function (IncomeVerificationPrecheckResponseConfidenceEnum) { + IncomeVerificationPrecheckResponseConfidenceEnum["High"] = "HIGH"; + IncomeVerificationPrecheckResponseConfidenceEnum["Low"] = "LOW"; + IncomeVerificationPrecheckResponseConfidenceEnum["Unknown"] = "UNKNOWN"; +})(IncomeVerificationPrecheckResponseConfidenceEnum = exports.IncomeVerificationPrecheckResponseConfidenceEnum || (exports.IncomeVerificationPrecheckResponseConfidenceEnum = {})); /** * @export * @enum {string} @@ -611,6 +637,28 @@ var PaymentInitiationPaymentGetResponseStatusEnum; PaymentInitiationPaymentGetResponseStatusEnum["Blocked"] = "PAYMENT_STATUS_BLOCKED"; PaymentInitiationPaymentGetResponseStatusEnum["Unknown"] = "PAYMENT_STATUS_UNKNOWN"; })(PaymentInitiationPaymentGetResponseStatusEnum = exports.PaymentInitiationPaymentGetResponseStatusEnum || (exports.PaymentInitiationPaymentGetResponseStatusEnum = {})); +/** + * @export + * @enum {string} + */ +var PaymentInitiationPaymentReverseResponseStatusEnum; +(function (PaymentInitiationPaymentReverseResponseStatusEnum) { + PaymentInitiationPaymentReverseResponseStatusEnum["Processing"] = "PROCESSING"; + PaymentInitiationPaymentReverseResponseStatusEnum["Executed"] = "EXECUTED"; + PaymentInitiationPaymentReverseResponseStatusEnum["Initiated"] = "INITIATED"; + PaymentInitiationPaymentReverseResponseStatusEnum["Failed"] = "FAILED"; +})(PaymentInitiationPaymentReverseResponseStatusEnum = exports.PaymentInitiationPaymentReverseResponseStatusEnum || (exports.PaymentInitiationPaymentReverseResponseStatusEnum = {})); +/** + * @export + * @enum {string} + */ +var PaymentInitiationRefundStatusEnum; +(function (PaymentInitiationRefundStatusEnum) { + PaymentInitiationRefundStatusEnum["Processing"] = "PROCESSING"; + PaymentInitiationRefundStatusEnum["Initiated"] = "INITIATED"; + PaymentInitiationRefundStatusEnum["Executed"] = "EXECUTED"; + PaymentInitiationRefundStatusEnum["Failed"] = "FAILED"; +})(PaymentInitiationRefundStatusEnum = exports.PaymentInitiationRefundStatusEnum || (exports.PaymentInitiationRefundStatusEnum = {})); /** * The frequency interval of the payment. * @export @@ -697,7 +745,7 @@ var ProcessorTokenCreateRequestProcessorEnum; ProcessorTokenCreateRequestProcessorEnum["PrimeTrust"] = "prime_trust"; ProcessorTokenCreateRequestProcessorEnum["Rize"] = "rize"; ProcessorTokenCreateRequestProcessorEnum["SilaMoney"] = "sila_money"; - ProcessorTokenCreateRequestProcessorEnum["SbvApi"] = "sbv_api"; + ProcessorTokenCreateRequestProcessorEnum["SvbApi"] = "svb_api"; ProcessorTokenCreateRequestProcessorEnum["TreasuryPrime"] = "treasury_prime"; ProcessorTokenCreateRequestProcessorEnum["Unit"] = "unit"; ProcessorTokenCreateRequestProcessorEnum["Vesta"] = "vesta"; @@ -831,18 +879,22 @@ var StudentRepaymentPlanTypeEnum; */ var TotalCanonicalDescriptionEnum; (function (TotalCanonicalDescriptionEnum) { - TotalCanonicalDescriptionEnum["Bonus"] = "Bonus"; - TotalCanonicalDescriptionEnum["Commission"] = "Commission"; - TotalCanonicalDescriptionEnum["Overtime"] = "Overtime"; - TotalCanonicalDescriptionEnum["PaidTimeOff"] = "Paid Time Off"; - TotalCanonicalDescriptionEnum["RegularPay"] = "Regular Pay"; - TotalCanonicalDescriptionEnum["Vacation"] = "Vacation"; - TotalCanonicalDescriptionEnum["EmployeeMedicare"] = "Employee Medicare"; + TotalCanonicalDescriptionEnum["Bonus"] = "BONUS"; + TotalCanonicalDescriptionEnum["Commission"] = "COMMISSION"; + TotalCanonicalDescriptionEnum["Overtime"] = "OVERTIME"; + TotalCanonicalDescriptionEnum["PaidTimeOff"] = "PAID TIME OFF"; + TotalCanonicalDescriptionEnum["RegularPay"] = "REGULAR PAY"; + TotalCanonicalDescriptionEnum["Vacation"] = "VACATION"; + TotalCanonicalDescriptionEnum["EmployeeMedicare"] = "EMPLOYEE MEDICARE"; TotalCanonicalDescriptionEnum["Fica"] = "FICA"; - TotalCanonicalDescriptionEnum["SocialSecurityEmployeeTax"] = "Social Security Employee Tax"; - TotalCanonicalDescriptionEnum["Medical"] = "Medical"; - TotalCanonicalDescriptionEnum["Vision"] = "Vision"; - TotalCanonicalDescriptionEnum["Dental"] = "Dental"; + TotalCanonicalDescriptionEnum["SocialSecurityEmployeeTax"] = "SOCIAL SECURITY EMPLOYEE TAX"; + TotalCanonicalDescriptionEnum["Medical"] = "MEDICAL"; + TotalCanonicalDescriptionEnum["Vision"] = "VISION"; + TotalCanonicalDescriptionEnum["Dental"] = "DENTAL"; + TotalCanonicalDescriptionEnum["NetPay"] = "NET PAY"; + TotalCanonicalDescriptionEnum["Taxes"] = "TAXES"; + TotalCanonicalDescriptionEnum["NotFound"] = "NOT_FOUND"; + TotalCanonicalDescriptionEnum["Other"] = "OTHER"; })(TotalCanonicalDescriptionEnum = exports.TotalCanonicalDescriptionEnum || (exports.TotalCanonicalDescriptionEnum = {})); /** * @export @@ -929,17 +981,6 @@ var TransferAuthorizationDecisionRationaleCodeEnum; TransferAuthorizationDecisionRationaleCodeEnum["LoginRequired"] = "LOGIN_REQUIRED"; TransferAuthorizationDecisionRationaleCodeEnum["Error"] = "ERROR"; })(TransferAuthorizationDecisionRationaleCodeEnum = exports.TransferAuthorizationDecisionRationaleCodeEnum || (exports.TransferAuthorizationDecisionRationaleCodeEnum = {})); -/** - * Indicates the direction of the transfer: `outbound` for API-initiated transfers, or `inbound` for payments received by the FBO account. - * @export - * @enum {string} - */ -var TransferDirection; -(function (TransferDirection) { - TransferDirection["Outbound"] = "outbound"; - TransferDirection["Inbound"] = "inbound"; - TransferDirection["Null"] = "null"; -})(TransferDirection = exports.TransferDirection || (exports.TransferDirection = {})); /** * @export * @enum {string} @@ -951,17 +992,7 @@ var TransferEventListRequestTransferTypeEnum; TransferEventListRequestTransferTypeEnum["Null"] = "null"; })(TransferEventListRequestTransferTypeEnum = exports.TransferEventListRequestTransferTypeEnum || (exports.TransferEventListRequestTransferTypeEnum = {})); /** - * @export - * @enum {string} - */ -var TransferEventListRequestDirectionEnum; -(function (TransferEventListRequestDirectionEnum) { - TransferEventListRequestDirectionEnum["Inbound"] = "inbound"; - TransferEventListRequestDirectionEnum["Outbound"] = "outbound"; - TransferEventListRequestDirectionEnum["Null"] = "null"; -})(TransferEventListRequestDirectionEnum = exports.TransferEventListRequestDirectionEnum || (exports.TransferEventListRequestDirectionEnum = {})); -/** - * The type of event that this transfer represents. `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. `reversed`: A posted transfer was reversed. `receiver_pending`: The matching transfer was found as a pending transaction in the receiver\'s account `receiver_posted`: The matching transfer was found as a posted transaction in the receiver\'s account + * The type of event that this transfer represents. `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. `reversed`: A posted transfer was reversed. * @export * @enum {string} */ @@ -972,8 +1003,6 @@ var TransferEventType; TransferEventType["Failed"] = "failed"; TransferEventType["Posted"] = "posted"; TransferEventType["Reversed"] = "reversed"; - TransferEventType["ReceiverPending"] = "receiver_pending"; - TransferEventType["ReceiverPosted"] = "receiver_posted"; })(TransferEventType = exports.TransferEventType || (exports.TransferEventType = {})); /** * The network or rails used for the transfer. Valid options are `ach` or `same-day-ach`. @@ -985,16 +1014,6 @@ var TransferNetwork; TransferNetwork["Ach"] = "ach"; TransferNetwork["SameDayAch"] = "same-day-ach"; })(TransferNetwork = exports.TransferNetwork || (exports.TransferNetwork = {})); -/** - * @export - * @enum {string} - */ -var TransferReceiverDetailsAvailableBalanceEnum; -(function (TransferReceiverDetailsAvailableBalanceEnum) { - TransferReceiverDetailsAvailableBalanceEnum["Positive"] = "positive"; - TransferReceiverDetailsAvailableBalanceEnum["Negative"] = "negative"; - TransferReceiverDetailsAvailableBalanceEnum["Null"] = "null"; -})(TransferReceiverDetailsAvailableBalanceEnum = exports.TransferReceiverDetailsAvailableBalanceEnum || (exports.TransferReceiverDetailsAvailableBalanceEnum = {})); /** * The status of the transfer. * @export @@ -1846,6 +1865,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList: (bankTransferSweepListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'bankTransferSweepListRequest' is not null or undefined + common_1.assertParamExists('bankTransferSweepList', 'bankTransferSweepListRequest', bankTransferSweepListRequest); + const localVarPath = `/bank_transfer/sweep/list`; + // 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(bankTransferSweepListRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -2272,6 +2327,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck: (incomeVerificationPrecheckRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'incomeVerificationPrecheckRequest' is not null or undefined + common_1.assertParamExists('incomeVerificationPrecheck', 'incomeVerificationPrecheckRequest', incomeVerificationPrecheckRequest); + const localVarPath = `/income/verification/precheck`; + // 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(incomeVerificationPrecheckRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -3100,6 +3191,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse: (paymentInitiationPaymentReverseRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'paymentInitiationPaymentReverseRequest' is not null or undefined + common_1.assertParamExists('paymentInitiationPaymentReverse', 'paymentInitiationPaymentReverseRequest', paymentInitiationPaymentReverseRequest); + const localVarPath = `/payment_initiation/payment/reverse`; + // 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(paymentInitiationPaymentReverseRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -4584,6 +4711,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList(bankTransferSweepListRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferSweepList(bankTransferSweepListRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -4740,6 +4880,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -5039,6 +5192,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -5698,6 +5864,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { bankTransferSweepGet(bankTransferSweepGetRequest, options) { return localVarFp.bankTransferSweepGet(bankTransferSweepGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + bankTransferSweepList(bankTransferSweepListRequest, options) { + return localVarFp.bankTransferSweepList(bankTransferSweepListRequest, options).then((request) => request(axios, basePath)); + }, /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -5818,6 +5994,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options) { return localVarFp.incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options) { + return localVarFp.incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options).then((request) => request(axios, basePath)); + }, /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -6048,6 +6234,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options) { return localVarFp.paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options).then((request) => request(axios, basePath)); }, + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options) { + return localVarFp.paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options).then((request) => request(axios, basePath)); + }, /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -6630,6 +6826,17 @@ class PlaidApi extends base_1.BaseAPI { bankTransferSweepGet(bankTransferSweepGetRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferSweepGet(bankTransferSweepGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. + * @summary List sweeps + * @param {BankTransferSweepListRequest} bankTransferSweepListRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + bankTransferSweepList(bankTransferSweepListRequest, options) { + return exports.PlaidApiFp(this.configuration).bankTransferSweepList(bankTransferSweepListRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. * @summary Get Categories @@ -6762,6 +6969,17 @@ class PlaidApi extends base_1.BaseAPI { incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options) { return exports.PlaidApiFp(this.configuration).incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * `/income/verification/precheck` returns whether a given user is supportable by the income product + * @summary Check a user\'s eligibility for the income verification product + * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options) { + return exports.PlaidApiFp(this.configuration).incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * `/income/verification/refresh` refreshes a given income verification. * @summary Refresh an income verification @@ -7015,6 +7233,17 @@ class PlaidApi extends base_1.BaseAPI { paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Reverse a previously initiated payment. A payment can only be reversed once and will be refunded to the original sender\'s account. + * @summary Reverse an existing payment + * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options) { + return exports.PlaidApiFp(this.configuration).paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA). For a standing order (recurring) payment, the recipient must be in the UK. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient @@ -7380,4 +7609,4 @@ class PlaidApi extends base_1.BaseAPI { } } exports.PlaidApi = PlaidApi; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQUU1Rjs7OztHQUlHO0FBQ0gsSUFBWSxRQWdCWDtBQWhCRCxXQUFZLFFBQVE7SUFDaEIsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0FBQ2YsQ0FBQyxFQWhCVyxRQUFRLEdBQVIsZ0JBQVEsS0FBUixnQkFBUSxRQWdCbkI7QUFvQ0Q7OztNQUdNO0FBQ04sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3RCLDZEQUEyQyxDQUFBO0lBQzNDLHNDQUFvQixDQUFBO0lBQ3BCLDhDQUE0QixDQUFBO0lBQzVCLHFDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUt6QjtBQXFHRDs7O01BR007QUFDTixJQUFZLG1DQU9YO0FBUEQsV0FBWSxtQ0FBbUM7SUFDM0MsdUZBQWdELENBQUE7SUFDaEQsc0dBQStELENBQUE7SUFDL0QsZ0dBQXlELENBQUE7SUFDekQsNkVBQXNDLENBQUE7SUFDdEMsbUZBQTRDLENBQUE7SUFDNUMsaUZBQTBDLENBQUE7QUFDOUMsQ0FBQyxFQVBXLG1DQUFt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T0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN6SSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFlBQVksQ0FBQyxtQkFBd0MsRUFBRSxPQUFhO1FBQ3ZFLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0ksQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSx5QkFBeUIsQ0FBQyxnQ0FBa0UsRUFBRSxPQUFhO1FBQzlHLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMseUJBQXlCLENBQUMsZ0NBQWdDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNySyxDQUFDO0NBQ0o7QUF4akNELDRCQXdqQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS4yNi4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuICBSZXF1aXJlZCBmb3IgdHJhbnNmZXJzIG9uIGFuIEFDSCBuZXR3b3JrLiAgYFxcXCJhcmNcXFwiYCAtIEFjY291bnRzIFJlY2VpdmFibGUgRW50cnkgIGBcXFwiY2JyYFxcXCIgLSBDcm9zcyBCb3JkZXIgRW50cnkgIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJjaWVcXFwiYCAtIEN1c3RvbWVyIEluaXRpYXRlZCBFbnRyeSAgYFxcXCJjb3JcXFwiYCAtIEF1dG9tYXRlZCBOb3RpZmljYXRpb24gb2YgQ2hhbmdlICBgXFxcImN0eFxcXCJgIC0gQ29ycG9yYXRlIFRyYWRlIEV4Y2hhbmdlICBgXFxcImlhdFxcXCJgIC0gSW50ZXJuYXRpb25hbCAgYFxcXCJtdGVcXFwiYCAtIE1hY2hpbmUgVHJhbnNmZXIgRW50cnkgIGBcXFwicGJyXFxcImAgLSBDcm9zcyBCb3JkZXIgRW50cnkgIGBcXFwicG9wXFxcImAgLSBQb2ludC1vZi1QdXJjaGFzZSBFbnRyeSAgYFxcXCJwb3NcXFwiYCAtIFBvaW50LW9mLVNhbGUgRW50cnkgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcInJja1xcXCJgIC0gUmUtcHJlc2VudGVkIENoZWNrIEVudHJ5ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUNIQ2xhc3Mge1xuICAgIEFyYyA9ICdhcmMnLFxuICAgIENiciA9ICdjYnInLFxuICAgIENjZCA9ICdjY2QnLFxuICAgIENpZSA9ICdjaWUnLFxuICAgIENvciA9ICdjb3InLFxuICAgIEN0eCA9ICdjdHgnLFxuICAgIElhdCA9ICdpYXQnLFxuICAgIE10ZSA9ICdtdGUnLFxuICAgIFBiciA9ICdwYnInLFxuICAgIFBvcCA9ICdwb3AnLFxuICAgIFBvcyA9ICdwb3MnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFJjayA9ICdyY2snLFxuICAgIFRlbCA9ICd0ZWwnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIEFQUiBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQVBSXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbm51YWwgUGVyY2VudGFnZSBSYXRlIGFwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFsYW5jZSB0byB3aGljaCB0aGUgQVBSIGFwcGxpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYXByX3R5cGU6IEFQUkFwclR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSB0aGF0IGlzIHN1YmplY3RlZCB0byB0aGUgQVBSIGlmIGEgYmFsYW5jZSB3YXMgY2FycmllZCBiZXlvbmQgcGF5bWVudCBkdWUgZGF0ZS4gSG93IGl0IGlzIGNhbGN1bGF0ZWQgY2FuIHZhcnkgYnkgY2FyZCBpc3N1ZXIuIEl0IGlzIG9mdGVuIGNhbGN1bGF0ZWQgYXMgYW4gYXZlcmFnZSBkYWlseSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGJhbGFuY2Vfc3ViamVjdF90b19hcHI6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIG1vbmV5IGNoYXJnZWQgZHVlIHRvIGludGVyZXN0IGZyb20gbGFzdCBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgaW50ZXJlc3RfY2hhcmdlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBUFJBcHJUeXBlRW51bSB7XG4gICAgQmFsYW5jZVRyYW5zZmVyQXByID0gJ2JhbGFuY2VfdHJhbnNmZXJfYXByJyxcbiAgICBDYXNoQXByID0gJ2Nhc2hfYXByJyxcbiAgICBQdXJjaGFzZUFwciA9ICdwdXJjaGFzZV9hcHInLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCdcbn1cblxuLyoqXG4gKiBBbGxvdyBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBieSBhY2NvdW50LiBVbmxpc3RlZCAoZS5nLiBtaXNzaW5nKSBhY2NvdW50cyB3aWxsIGJlIGNvbnNpZGVyZWQgYG5ld19hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QXNzZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIHR3byBhbW91bnRzLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBBc3NldHMgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEFzc2V0cyBlbmRwb2ludHMuIFRyYW5zYWN0aW9uIGhpc3RvcnkgcmV0dXJuZWQgYnkgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHRvcC1sZXZlbCBgdHJhbnNhY3Rpb25zYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQXNzZXRzIGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBBc3NldHMgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQXNzZXRzIGVuZHBvaW50cy4gVHJhbnNhY3Rpb24gaGlzdG9yeSByZXR1cm5lZCBieSBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgdG9wLWxldmVsIGB0cmFuc2FjdGlvbnNgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQXNzZXRzIGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG59XG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LiBCYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSBiYWxhbmNlIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEJhbGFuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGFzc2V0cyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IGJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDsgaWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgVHJhbnNhY3Rpb25zLCB0aGUgYmFsYW5jZSB3aWxsIGJlIGF0IGxlYXN0IGFzIHJlY2VudCBhcyB0aGUgbW9zdCByZWNlbnQgVHJhbnNhY3Rpb24gdXBkYXRlLiBJZiB5b3UgcmVxdWlyZSByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIGNyZWRpdCBsaW1pdC4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBwcmUtYXJyYW5nZWQgb3ZlcmRyYWZ0IGxpbWl0LCB3aGljaCBpcyBjb21tb24gZm9yIGN1cnJlbnQgKGNoZWNraW5nKSBhY2NvdW50cyBpbiBFdXJvcGUuICBJbiBOb3J0aCBBbWVyaWNhLCB0aGlzIGZpZWxkIGlzIHR5cGljYWxseSBvbmx5IGF2YWlsYWJsZSBmb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhhdCB0aGUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgaGFzIGJlZW4gdXBkYXRlZCAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBwcm92aWRlZCB3aGVuIHRoZSBgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZWAgaXMgcGFzc2VkIHdoZW4gY2FsbGluZyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNpbmdsZSBhY2NvdW50IGF0IGEgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIHR3byBhbW91bnRzLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudEJhc2VWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRCYXNlVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnXG59XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgZm9yIHRoZSB1c2VyIHRvIGJlIGFibGUgdG8gc2VsZWN0IGZyb20uIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gUGxhaWQgZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50IGZpbHRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRoZSBgYWNjb3VudF9maWx0ZXJzYCBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgbG9hbj86IExvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgdHdvIGFtb3VudHMuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2Yge1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBUaGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCBhY2NvdW50cyBiZSBsaW1pdGVkIHRvIGEgc3BlY2lmaWMgY2FyZGluYWxpdHkuIGBNVUxUSV9TRUxFQ1RgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBwaWNrIG11bHRpcGxlIGFjY291bnRzLiBgU0lOR0xFX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgb25seSBhIHNpbmdsZSBhY2NvdW50LiBgQUxMYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgbXVzdCBzaGFyZSBhbGwgb2YgdGhlaXIgYWNjb3VudHMgYW5kIHNob3VsZCBub3QgYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvIGRlLXNlbGVjdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFNlbGVjdGlvbkNhcmRpbmFsaXR5IHtcbiAgICBTaW5nbGVTZWxlY3QgPSAnU0lOR0xFX1NFTEVDVCcsXG4gICAgTXVsdGlTZWxlY3QgPSAnTVVMVElfU0VMRUNUJyxcbiAgICBBbGwgPSAnQUxMJ1xufVxuXG4vKipcbiAqIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRTdWJ0eXBlIHtcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBfNTI5ID0gJzUyOScsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgQ2FzaElzYSA9ICdjYXNoIGlzYScsXG4gICAgRWR1Y2F0aW9uU2F2aW5nc0FjY291bnQgPSAnZWR1Y2F0aW9uIHNhdmluZ3MgYWNjb3VudCcsXG4gICAgRWJ0ID0gJ2VidCcsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgTGlmID0gJ2xpZicsXG4gICAgTGlmZUluc3VyYW5jZSA9ICdsaWZlIGluc3VyYW5jZScsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTm9uVGF4YWJsZUJyb2tlcmFnZUFjY291bnQgPSAnbm9uLXRheGFibGUgYnJva2VyYWdlIGFjY291bnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNlcElyYSA9ICdzZXAgaXJhJyxcbiAgICBTaW1wbGVJcmEgPSAnc2ltcGxlIGlyYScsXG4gICAgU2lwcCA9ICdzaXBwJyxcbiAgICBTdG9ja1BsYW4gPSAnc3RvY2sgcGxhbicsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5JyxcbiAgICBDcmVkaXRDYXJkID0gJ2NyZWRpdCBjYXJkJyxcbiAgICBQYXlwYWwgPSAncGF5cGFsJyxcbiAgICBDZCA9ICdjZCcsXG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgTW9uZXlNYXJrZXQgPSAnbW9uZXkgbWFya2V0JyxcbiAgICBQcmVwYWlkID0gJ3ByZXBhaWQnLFxuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWUgPSAnaG9tZScsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBNb3J0Z2FnZSA9ICdtb3J0Z2FnZScsXG4gICAgT3ZlcmRyYWZ0ID0gJ292ZXJkcmFmdCcsXG4gICAgTGluZU9mQ3JlZGl0ID0gJ2xpbmUgb2YgY3JlZGl0JyxcbiAgICBTdHVkZW50ID0gJ3N0dWRlbnQnLFxuICAgIENhc2hNYW5hZ2VtZW50ID0gJ2Nhc2ggbWFuYWdlbWVudCcsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIE11dHVhbEZ1bmQgPSAnbXV0dWFsIGZ1bmQnLFxuICAgIFJlY3VycmluZyA9ICdyZWN1cnJpbmcnLFxuICAgIFJld2FyZHMgPSAncmV3YXJkcycsXG4gICAgU2FmZURlcG9zaXQgPSAnc2FmZSBkZXBvc2l0JyxcbiAgICBTYXJzZXAgPSAnc2Fyc2VwJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogYGludmVzdG1lbnQ6YCBJbnZlc3RtZW50IGFjY291bnQgIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgYnJva2VyYWdlYDogQW4gaW52ZXN0bWVudCBhY2NvdW50LiBVc2VkIGZvciBgL2Fzc2V0cy9gIGVuZHBvaW50cyBvbmx5OyBvdGhlciBlbmRwb2ludHMgdXNlIGBpbnZlc3RtZW50YC4gIGBvdGhlcjpgIE5vbi1zcGVjaWZpZWQgYWNjb3VudCB0eXBlICBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRUeXBlIHtcbiAgICBJbnZlc3RtZW50ID0gJ2ludmVzdG1lbnQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIERlcG9zaXRvcnkgPSAnZGVwb3NpdG9yeScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGZvciBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgbWluX2xhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hY2NvdW50cy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQWNjb3VudHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYWNjb3VudHMvZ2V0YCBhbmQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBJZiBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3YXMgY2FsbGVkLCBlYWNoIGFjY291bnQgd2lsbCBpbmNsdWRlIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBwaHlzaWNhbCBtYWlsaW5nIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHByaW1hcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCB0aGUgYXBwbGljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9ucy9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoaXMgYXBwbGljYXRpb24gd2FzIGxpbmtlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGFwcGxpY2F0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbm5lY3RlZCBhcHAgc3RhdGluZyB3aHkgdGhleSB1c2UgdGhlaXIgcmVzcGVjdGl2ZSBlbmFibGVkIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVhc29uX2Zvcl9hY2Nlc3M6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgc2NoZW1hIGZvciBgL2FwcGxpY2F0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb25zL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVxdWVzdCBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEFzc2V0IFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB5b3UgZGV0ZXJtaW5lIGFuZCBzdWJtaXQgZm9yIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdG9yX2lkYCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRvcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byBnZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIEF1ZGl0IENvcHkgeW91IHdvdWxkIGxpa2UgdG8gcmV2b2tlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBdWRpdCBDb3B5IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBJdGVtcyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gVGhlIGBhc3NldHNgIHByb2R1Y3QgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgZm9yIHRoZSBJdGVtcyBkdXJpbmcgbGluazsgdGhlIEFzc2V0cyBwcm9kdWN0IGNhbm5vdCBiZSBhZGRlZCBhZnRlciBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBJZiB1c2luZyBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eSwgYGRheXNfcmVxdWVzdGVkYCBtdXN0IGJlIGF0IGxlYXN0IDYxIGZvciBuZXcgb3JpZ2luYXRpb25zIG9yIGF0IGxlYXN0IDMxIGZvciByZWZpbmFuY2luZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBiZSBub24tYG51bGxgLiBUaGUgb3B0aW9uYWwgYHVzZXJgIG9iamVjdCBpcyByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZVxcJ3MgRGF5IDEgQ2VydGFpbnR5IHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBBc3NldHMgd2ViaG9va3MsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RlZCBBc3NldCBSZXBvcnQgaXMgcmVhZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHVzZXI/OiBBc3NldFJlcG9ydFVzZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZmlsdGVyYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgQXNzZXQgUmVwb3J0LCBpZGVudGlmaWVkIGJ5IGBhY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfdG9fZXhjbHVkZTogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBgZmFsc2VgIG90aGVyd2lzZS4gVGhpcyBmaWVsZCBkZWZhdWx0cyB0byBgZmFsc2VgIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW5zaWdodHM/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBBc3NldFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYW4gQXNzZXQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgSXRlbeKAmXMgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBc3NldHM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEFzc2V0cz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm5lZCBieSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBNdXN0IGJlIGFuIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIGNhbm5vdCBiZSBgbnVsbGAuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBgb3B0aW9uc2AgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpbGwgYmUgdXNlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIEFzc2V0cyB3ZWJob29rcywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdGVkIEFzc2V0IFJlcG9ydCBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy8jY2F0ZWdvcnktb3ZlcnZpZXcpLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzLyNjYXRlZ29yeS1vdmVydmlldykuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCBpcyBpbiBiZXRhIGFuZCB3aWxsIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBjbGllbnQgaXMgYm90aCBlbnJvbGxlZCBpbiB0aGUgY2xvc2VkIGJldGEgcHJvZ3JhbSBhbmQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bSB7XG4gICAgRGlnaXRhbCA9ICdkaWdpdGFsJyxcbiAgICBQbGFjZSA9ICdwbGFjZScsXG4gICAgU3BlY2lhbCA9ICdzcGVjaWFsJyxcbiAgICBVbnJlc29sdmVkID0gJ3VucmVzb2x2ZWQnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25BbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25BbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2UsIGluIElTMCA4NjAxIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBkYXRlX3RyYW5zYWN0ZWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdXNlciBvYmplY3QgYWxsb3dzIHlvdSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIEFzc2V0IFJlcG9ydC4gQWxsIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFRoZSBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBhbmQgYHNzbmAgZmllbGRzIGFyZSByZXF1aXJlZCBpZiB5b3Ugd291bGQgbGlrZSB0aGUgUmVwb3J0IHRvIGJlIGVsaWdpYmxlIGZvciBGYW5uaWUgTWFl4oCZcyBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRVc2VyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmaXJzdCBuYW1lLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgZmlyc3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG1pZGRsZSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgbWlkZGxlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWUuICBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgU29jaWFsIFNlY3VyaXR5IE51bWJlci4gUmVxdWlyZWQgZm9yIHRoZSBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiAgRm9ybWF0OiBcXFwiZGRkLWRkLWRkZGRcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgYC9hc3NldF9yZXBvcnQvZ2V0YCBpcyByZWFkeSB0byBiZSBjYWxsZWQuICBJZiB5b3UgYXR0ZW1wdCB0byByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgYmVmb3JlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIHlvdeKAmWxsIHJlY2VpdmUgYSByZXNwb25zZSB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIDQwMCBhbmQgYSBQbGFpZCBlcnJvciBjb2RlIG9mIGBQUk9EVUNUX05PVF9SRUFEWWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgQVNTRVRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfaWRgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGAvYXNzZXRfcmVwb3J0L2dldGAgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudHNgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSBhbnkgYGFjY291bnRzYCBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRoZSBhcnJheSBmb3IgdGhhdCB0eXBlIHdpbGwgYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldE51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEFDSCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNIPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEFycmF5PE51bWJlcnNBQ0g+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEVGVCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzRUZUPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnQ6IEFycmF5PE51bWJlcnNFRlQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIElCQU4gbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw6IEFycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBCQUNTIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNCQUNTPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzOiBBcnJheTxOdW1iZXJzQkFDUz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudHNgIGZvciB3aGljaCBudW1iZXJzIGFyZSBiZWluZyByZXRyaWV2ZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEF1dGhHZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBpcyB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzLiBXZSByZWNvbW1lbmQgY29tbXVuaWNhdGluZyB0byB5b3VyIHVzZXJzIHdoZW4gdGhpcyBldmVudCBpcyByZWNlaXZlZCB0byBub3RpZnkgdGhlbSB0aGF0IHRoZWlyIGFjY291bnQgaXMgdmVyaWZpZWQgYW5kIHJlYWR5IGZvciB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIGJlY2F1c2UgYW4gYWNjb3VudCBpcyBvdmVyZHJhd24gb3IgYmVjYXVzZSBhbiBpbmVsaWdpYmxlIGFjY291bnQgaXMgdXNlZC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IFxcXCJSMDFcXFwiLCBcXFwiUjAyXFxcIiwgXFxcIlIwM1xcXCIsIFxcXCJSMDRcXFwiLCBcXFwiUjA2XFxcIiwg4oCcUjA44oCdLCAgXFxcIlIwOVxcXCIsIFxcXCJSMTNcXFwiLCBcXFwiUjE2XFxcIiwgXFxcIlIxN1xcXCIsIFxcXCJSMjBcXFwiLCBcXFwiUjIzXFxcIi4gVGhlc2UgcmV0dXJucyBoYXZlIGEgdHVybmFyb3VuZCB0aW1lIG9mIDIgYmFua2luZyBkYXlzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlza1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMC05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluIHRoZSBgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGVpZ2h0IHJpc2sgdGllcnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2NvcmVzOiAgIDE6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAlIC0gMC41JSAgIDI6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjUlIC0gMS41JSAgIDM6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxLjUlIC0gMyUgICA0OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMyUgLSA1JSAgIDU6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiA1JSAtIDEwJSAgIDY6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxMCUgLSAxNSUgICA3OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTUlIGFuZCA1MCUgICA4OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGdyZWF0ZXIgdGhhbiA1MCUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICByaXNrX3RpZXI6IG51bWJlcjtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhbmsgdHJhbnNmZXIgd2l0aGluIHRoZSBCYW5rIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzczogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdGhhdCBzaG91bGQgYmUgY3JlZGl0ZWQvZGViaXRlZCBmb3IgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBiYW5rIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJhbmtUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSB0YWcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgY3JlYXRlIHJlcXVlc3QuIFdpbGwgYmUgbnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiAtIFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgLSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgLSBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyAtIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIC0gTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZGlyZWN0aW9uOiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhdmFpbGFibGUgYmFsYW5jZSAtIHRoZSBzdW0gb2YgYWxsIHN1Y2Nlc3NmdWwgZGViaXQgdHJhbnNmZXIgYW1vdW50cyBtaW51cyBhbGwgY3JlZGl0IHRyYW5zZmVyIGFtb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHRyYW5zYWN0YWJsZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBtdWx0aXBsZSBvcmlnaW5hdGlvbiBhY2NvdW50cyBhcmUgYXZhaWxhYmxlLCBgb3JpZ2luYXRpb25fYWNjb3VudF9pZGAgbXVzdCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgZm9yIHdoaWNoIGJhbGFuY2Ugd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyQmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogQmFua1RyYW5zZmVyQmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBiYW5rIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgYmFuayB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBiYW5rIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCDigJMgc2hvdWxkIGJlIHNldCB0byBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgZGVzY3JpcHRpb24uIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogQW4gYXJiaXRyYXJ5IHN0cmluZyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGZvciBzdG9yYWdlIHdpdGggdGhlIGJhbmsgdHJhbnNmZXIuIE1heSBiZSB1cCB0byAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tX3RhZz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogLSBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIC0gT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIC0gTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgLSBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyAtIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXI6IGBvdXRib3VuZGAgZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzLCBvciBgaW5ib3VuZGAgZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB7XG4gICAgT3V0Ym91bmQgPSAnb3V0Ym91bmQnLFxuICAgIEluYm91bmQgPSAnaW5ib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgaW4gdGhlIEJhbmsgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV2ZW50LiBJRHMgYXJlIHNlcXVlbnRpYWwgdW5zaWduZWQgNjQtYml0IGludGVnZXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogQmFua1RyYW5zZmVyRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl90eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBiYW5rIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogQmFua1RyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICByZWNlaXZlcl9kZXRhaWxzOiBCYW5rVHJhbnNmZXJSZWNlaXZlckRldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIGFsbCB0cmFuc2FjdGlvbnMgdG8vZnJvbSBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBiYW5rIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl90eXBlPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdEJhbmtUcmFuc2ZlclR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBldmVudHMgYnkgZXZlbnQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGVzPzogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnRUeXBlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZnNldCBpbnRvIHRoZSBsaXN0IG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRpb24gYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciB0cmFuc2ZlcnMgZnJvbSBhIHNwZWNpZmljIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYDogZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzIGBpbmJvdW5kYDogZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdERpcmVjdGlvbkVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdEJhbmtUcmFuc2ZlclR5cGVFbnVtIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0RGlyZWN0aW9uRW51bSB7XG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IChsYXJnZXN0KSBgZXZlbnRfaWRgIGZldGNoZWQgdmlhIHRoZSBzeW5jIGVuZHBvaW50LCBvciAwIGluaXRpYWxseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgdGhpcyBiYW5rIHRyYW5zZmVyIHJlcHJlc2VudHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZXZlcnNlZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXZlcnNlZC4gIGByZWNlaXZlcl9wZW5kaW5nYDogVGhlIG1hdGNoaW5nIHRyYW5zZmVyIHdhcyBmb3VuZCBhcyBhIHBlbmRpbmcgdHJhbnNhY3Rpb24gaW4gdGhlIHJlY2VpdmVyXFwncyBhY2NvdW50ICBgcmVjZWl2ZXJfcG9zdGVkYDogVGhlIG1hdGNoaW5nIHRyYW5zZmVyIHdhcyBmb3VuZCBhcyBhIHBvc3RlZCB0cmFuc2FjdGlvbiBpbiB0aGUgcmVjZWl2ZXJcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCcsXG4gICAgUmVjZWl2ZXJQZW5kaW5nID0gJ3JlY2VpdmVyX3BlbmRpbmcnLFxuICAgIFJlY2VpdmVyUG9zdGVkID0gJ3JlY2VpdmVyX3Bvc3RlZCdcbn1cblxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIHR5cGUgb2YgdGhpcyB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV2ZXJzZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldmVyc2VkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbQmFuayBUcmFuc2ZlcnMgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy9iYW5rLXRyYW5zZmVycy8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGJhbmsgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcnM6IEFycmF5PEJhbmtUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50IChgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuIFZhbGlkIG9wdGlvbnMgYXJlIGBhY2hgLCBgc2FtZS1kYXktYWNoYCwgb3IgYHdpcmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFdpcmUgPSAnd2lyZSdcbn1cblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZGV0YWlscyBpZiB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50IGlzIGByZWNpZXZlcl9wZW5kaW5nYCBvciBgcmVjaWV2ZXJfcG9zdGVkYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclJlY2VpdmVyRGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNpZ24gb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGZvciB0aGUgcmVjZWl2ZXIgYmFuayBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjZWl2ZXIgZXZlbnQgYXQgdGhlIHRpbWUgdGhlIG1hdGNoaW5nIHRyYW5zYWN0aW9uIHdhcyBmb3VuZC4gQ2FuIGJlIGBwb3NpdGl2ZWAsIGBuZWdhdGl2ZWAsIG9yIG51bGwgaWYgdGhlIGJhbGFuY2Ugd2FzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyUmVjZWl2ZXJEZXRhaWxzXG4gICAgICovXG4gICAgYXZhaWxhYmxlX2JhbGFuY2U6IEJhbmtUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc0F2YWlsYWJsZUJhbGFuY2VFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc0F2YWlsYWJsZUJhbGFuY2VFbnVtIHtcbiAgICBQb3NpdGl2ZSA9ICdwb3NpdGl2ZScsXG4gICAgTmVnYXRpdmUgPSAnbmVnYXRpdmUnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcCBkZXNjcmliZXMgYSBzd2VlcCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3dlZXBBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHN3ZWVwX2FjY291bnQ6IEJhbmtUcmFuc2ZlclN3ZWVwQWNjb3VudDtcbn1cbi8qKlxuICogVGhlIGFjY291bnQgd2hlcmUgdGhlIGZ1bmRzIGFyZSBzd2VwdCB0by5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBBY2NvdW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwQWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IGZvciB3aGljaCBiYWxhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3dlZXA6IEJhbmtUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYW5rIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB0aGUgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlcuKAmXMgZnVsbCBsZWdhbCBuYW1lLiBJZiB0aGUgdHJhbnNmZXIgZGVzY3JpcHRpb24gaXMgYGNjZGAsIHRoaXMgc2hvdWxkIGJlIHRoZSBidXNpbmVzcyBuYW1lIG9mIHRoZSBhY2NvdW50IGhvbGRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlcuKAmXMgZW1haWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhvbGRlclxcJ3Mgcm91dGluZyBudW1iZXIuIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGluIHJlc3BvbnNlIGRhdGEuIERvIG5vdCBwcm92aWRlIHRoaXMgZmllbGQgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBiYW5rIHRyYW5zZmVyIGV2ZW50cyBhcmUgYXZhaWxhYmxlLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBDYXRlZ29yaWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NhdGVnb3JpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWVzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgdHJhbnNhY3Rpb24gY2F0ZWdvcmllcyB1c2VkIGJ5IFBsYWlkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeT59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNhdGVnb3JpZXM6IEFycmF5PENhdGVnb3J5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIGEgdHJhbnNhY3Rpb24gY2F0ZWdvcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZnlpbmcgbnVtYmVyIGZvciB0aGUgY2F0ZWdvcnkuIGBjYXRlZ29yeV9pZGAgaXMgYSBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lcmNoYW50IGNhdGVnb3J5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgcGxhY2VgIGZvciBwaHlzaWNhbCB0cmFuc2FjdGlvbnMgb3IgYHNwZWNpYWxgIGZvciBvdGhlciB0cmFuc2FjdGlvbnMgc3VjaCBhcyBiYW5rIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBncm91cDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgYGNhdGVnb3J5X2lkYCBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGhpZXJhcmNoeTogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IGFuZCBhc3NvY2lhdGVkIGBpdGVtX2lkYCB1c2VkIHRvIGlkZW50aWZ5IGEgc3BlY2lmaWMgSXRlbSBhbmQgZXJyb3Igd2hlbiBhIGJhdGNoIG9wZXJhdGlvbiBvcGVyYXRpbmcgb24gbXVsdGlwbGUgSXRlbXMgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yIGluIG9uZSBvZiB0aGUgSXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9ucy9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UgKHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLCBwbGVhc2UgdXNlIGxvZ29fdXJsKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbG9nbzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGFwcGxpY2F0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl91cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNvbm5lY3RlZCBhcHAgc3RhdGluZyB3aHkgdGhleSB1c2UgdGhlaXIgcmVzcGVjdGl2ZSBlbmFibGVkIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVhc29uX2Zvcl9hY2Nlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIChEZXByZWNhdGVkKSBBIGxpc3Qgb2YgZW51bXMgcmVwcmVzZW50aW5nIHRoZSBkYXRhIGNvbGxlY3RlZCBhbmQgcHJvZHVjdHMgZW5hYmxlZCBmb3IgdGhpcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcHJvZHVjdF9kYXRhX3R5cGVzOiBBcnJheTxDb25uZWN0ZWRBcHBsaWNhdGlvblByb2R1Y3REYXRhVHlwZXNFbnVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgc2NvcGVzPzogU2NvcGVzTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXF1ZXN0ZWRTY29wZXN9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcmVxdWVzdGVkX3Njb3Blcz86IFJlcXVlc3RlZFNjb3Blcztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBDb25uZWN0ZWRBcHBsaWNhdGlvblByb2R1Y3REYXRhVHlwZXNFbnVtIHtcbiAgICBCYWxhbmNlID0gJ0FDQ09VTlRfQkFMQU5DRScsXG4gICAgVXNlckluZm8gPSAnQUNDT1VOVF9VU0VSX0lORk8nLFxuICAgIFRyYW5zYWN0aW9ucyA9ICdBQ0NPVU5UX1RSQU5TQUNUSU9OUydcbn1cblxuLyoqXG4gKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ291bnRyeUNvZGUge1xuICAgIFVzID0gJ1VTJyxcbiAgICBHYiA9ICdHQicsXG4gICAgRXMgPSAnRVMnLFxuICAgIE5sID0gJ05MJyxcbiAgICBGciA9ICdGUicsXG4gICAgSWUgPSAnSUUnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjcmVkaXQgY2FyZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFyaW91cyBpbnRlcmVzdCByYXRlcyB0aGF0IGFwcGx5IHRvIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBUFI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYXByczogQXJyYXk8QVBSPjtcbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIGEgcGF5bWVudCBpcyBjdXJyZW50bHkgb3ZlcmR1ZS4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGR1ZSBkYXRlIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgZHVlIGRhdGUgaXMgYG51bGxgIGlmIGEgcGF5bWVudCBpcyBub3QgZXhwZWN0ZWQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZHVlX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RmlsdGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnRzLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWlucyBhIHJpc2sgc2NvcmUgYW5kIGEgcmlzayB0aWVyIHRoYXQgZXZhbHVhdGUgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIG9mIGFuIHVuYXV0aG9yaXplZCBkZWJpdC4gQ29tbW9uIHJldHVybiBjb2RlcyBpbiB0aGlzIGNhdGVnb3J5IGluY2x1ZGU6IOKAnFIwNeKAnSwgXFxcIlIwN1xcXCIsIFxcXCJSMTBcXFwiLCBcXFwiUjExXFxcIiwgXFxcIlIyOVxcXCIuIFRoZXNlIHJldHVybnMgdHlwaWNhbGx5IGhhdmUgYSByZXR1cm4gdGltZSBmcmFtZSBvZiB1cCB0byA2MCBjYWxlbmRhciBkYXlzLiBEdXJpbmcgdGhpcyBwZXJpb2QsIHRoZSBjdXN0b21lciBvZiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGNhbiBkaXNwdXRlIGEgdHJhbnNhY3Rpb24gYXMgdW5hdXRob3JpemVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2sge1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAwLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdGllciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9qZWN0ZWQgbGlrZWxpaG9vZCB0aGF0IHRoZSB0cmFuc2FjdGlvbiwgaWYgaW5pdGlhdGVkLCB3aWxsIGJlIHN1YmplY3QgdG8gYSByZXR1cm4uICBJbiB0aGUgYGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlza2Agb2JqZWN0LCB0aGVyZSBhcmUgZml2ZSByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDAlIC0gMC4wMiUgICAyOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDIlIC0gMC4wNSUgICAzOiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMDUlIC0gMC4xJSAgIDQ6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4xJSAtIDAuNSUgICA1OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gMC41JSBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICByaXNrX3RpZXI6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGRlZHVjdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZHVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgc3VidG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxUb3RhbD47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9uIGRhdGEgaXMgYXZhaWxhYmxlIGZvciBhbiBJdGVtLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGRldGVjdGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIHRoZSB3ZWJob29rIHJlbGF0ZXMgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB1c2VyXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2FsdC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudDogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF91c2VyOiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtIHtcbiAgICBVcyA9ICdVUycsXG4gICAgQ2EgPSAnQ0EnXG59XG5cbi8qKlxuICogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG9rZW4gZm9yIHRoZSB0YXJnZXQgSXRlbSwgdHlwaWNhbGx5IHByb3ZpZGVkIGluIHRoZSBJbXBvcnQgSXRlbSByZXNwb25zZS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWQgQWNjb3VudCBJRCB0aGF0IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGJhbmsgYWNjb3VudC4gVGhpcyBhY2NvdW50IHdpbGwgYmVjb21lIHRoZSByZWNpcGllbnQgZm9yIGEgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RDb3VudHJ5Q29kZUVudW0ge1xuICAgIFVzID0gJ1VTJyxcbiAgICBDYSA9ICdDQSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbiBpdGVtcyB0byB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSB1c2VyIHRvIHRoZWlyIFBheXJvbGwgUHJvdmlkZXIuIFRoZXNlIHRva2VucyBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIHNhbWUgY2xpZW50IGlkIGFzIHRoZSBvbmUgY3JlYXRpbmcgdGhlIHN3aXRjaCwgYW5kIGhhdmUgYWNjZXNzIHRvIHRoZSB0cmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faXRlbV9hY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGJhbmsgYWNjb3VudCB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSXRlbSB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9pdGVtX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5pdGlhbGl6ZWRgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgcHJvY2Vzc2luZ2Ag4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgLSBgY29tcGxldGVkYCDigJMgVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBlcnJvcmAg4oCTIFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXRlOiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5zdGFudGAg4oCTIFVzZXIgaW5zdGFudGx5IHN3aXRjaGVkIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGJhbmsgYWNjb3VudCBieSBjb25uZWN0aW5nIHRoZWlyIHBheXJvbGwgb3IgZW1wbG95ZXIgYWNjb3VudC4gIC0gYG1haWxgIOKAkyBVc2VyIHJlcXVlc3RlZCB0aGF0IFBsYWlkIGNvbnRhY3QgdGhlaXIgZW1wbG95ZXIgYnkgbWFpbCB0byBtYWtlIHRoZSBkaXJlY3QgZGVwb3NpdCBzd2l0Y2guICAtIGBwZGZgIOKAkyBVc2VyIGdlbmVyYXRlZCBhIFBERiBvciBlbWFpbCB0byBiZSBzZW50IHRvIHRoZWlyIGVtcGxveWVyIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC5cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2l0Y2hfbWV0aG9kPzogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgZ29lcyB0byBtdWx0aXBsZSBiYW5rcy4gV2hlbiBmYWxzZSwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgb25seSBnb2VzIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9oYXNfbXVsdGlwbGVfYWxsb2NhdGlvbnM6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdGFyZ2V0IGFjY291bnQgaXMgYWxsb2NhdGVkIHRoZSByZW1haW5kZXIgb2YgZGlyZWN0IGRlcG9zaXQgYWZ0ZXIgYWxsIG90aGVyIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBkZWR1Y3RlZC4gV2hlbiBgZmFsc2VgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBpcyBhbGxvY2F0ZWQgYXMgYSBwZXJjZW50IG9yIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcjogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhIHBlcmNlbnRhZ2Ugb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgb3IgaWYgYGlzX2FsbG9jYXRlZF9yZW1haW5kZXJgIGlzIHRydWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyY2VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbGxhciBhbW91bnQgb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhbiBhbW91bnQgb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY3JlYXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNvbXBsZXRlZC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jb21wbGV0ZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW0ge1xuICAgIEluaXRpYWxpemVkID0gJ2luaXRpYWxpemVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICAgIEVycm9yID0gJ2Vycm9yJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtIHtcbiAgICBJbnN0YW50ID0gJ2luc3RhbnQnLFxuICAgIE1haWwgPSAnbWFpbCcsXG4gICAgUGRmID0gJ3BkZicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIkRFUE9TSVRfU1dJVENIXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBcXFwiU1dJVENIX1NUQVRFX1VQREFURVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlLCBvciBzdGF0dXMsIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gIGBpbml0aWFsaXplZGA6IFRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSB1c2VyIGVudGVyaW5nIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBzdWJtaXQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBgcHJvY2Vzc2luZ2A6IFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgYGNvbXBsZXRlZGA6IFRoZSB1c2VyXFwncyBlbXBsb3llciBoYXMgZnVsZmlsbGVkIGFuZCBjb21wbGV0ZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBgZXJyb3JgOiBUaGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtEZXBvc2l0IFN3aXRjaCBBUEkgcmVmZXJlbmNlXSgvZG9jcy9hcGkvcHJvZHVjdHMjZGVwb3NpdF9zd2l0Y2hnZXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSb3V0aW5nIG51bWJlciBmb3IgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnQsIGFzIGl0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSBlbmQgdXNlciBpbiB0aGUgRGVwb3NpdCBTd2l0Y2ggaW50ZXJmYWNlLiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIG5hbWUgdXNlZCBpbiBvbmxpbmUgYmFua2luZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZTogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRBY2NvdW50U3VidHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRBY2NvdW50U3VidHlwZUVudW0ge1xuICAgIENoZWNraW5nID0gJ2NoZWNraW5nJyxcbiAgICBTYXZpbmdzID0gJ3NhdmluZ3MnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBnaXZlbiBuYW1lIChmaXJzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmFtaWx5IG5hbWUgKGxhc3QgbmFtZSkgb2YgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuIFRoZSBlbmRwb2ludCBjYW4gYWNjZXB0IGEgdmFyaWV0eSBvZiBwaG9uZSBudW1iZXIgZm9ybWF0cywgaW5jbHVkaW5nIEUuMTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXhwYXllciBJRCBvZiB0aGUgdXNlciwgZ2VuZXJhbGx5IHRoZWlyIFNTTiwgRUlOLCBvciBUSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICB0YXhfcGF5ZXJfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogRGVwb3NpdCBzd2l0Y2ggdG9rZW4sIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rIGZvciB0aGUgRGVwb3NpdCBTd2l0Y2ggcHJvZHVjdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHBpcmF0aW9uIHRpbWUgb2YgdGhlIHRva2VuLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX3Rva2VuX2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudHMtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdG9yeUZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBwYXljaGVjayAoZm9yIGV4YW1wbGUsIHRoZSBhbW91bnQgZGlzdHJpYnV0ZWQgdG8gYSBzcGVjaWZpYyBjaGVja2luZyBhY2NvdW50LCBvciB0byBhIHJldGlyZW1lbnQgcGxhbikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXN0cmlidXRpb25EZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFuayBhY2NvdW50IChlLmcuIENoZWNraW5nIG9yIFNhdmluZ3MpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGJhbmtfYWNjb3VudF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayB0aGF0IHRoZSBwYXltZW50IGlzIGJlaW5nIGRlcG9zaXRlZCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgYmFua19uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uIHR5cGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBtZXRhZGF0YSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgdXBsb2FkZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudE1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3Npbmcgc3RhdHVzIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHRoYXQgaXMgYWxzbyBwcmVzZW50IGluIHRoZSBwYXlzdHViIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCBhIGJyZWFrZG93biBvZiBlYXJuaW5ncyBvbiBhIHBheXN0dWIgYW5kIHRoZSB0b3RhbCBlYXJuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5ncyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEVhcm5pbmdzVG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbHM/OiBBcnJheTxFYXJuaW5nc1RvdGFsPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGFuIGVhcm5pbmcgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFYXJuaW5nc1RvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY2Fub25pY2FsX2Rlc2NyaXB0aW9uPzogRWFybmluZ3NUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uRW51bTtcbiAgICAvKipcbiAgICAgKiBUZXh0IG9mIHRoZSBsaW5lIGl0ZW0gYXMgcHJpbnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9ob3Vycz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfcmF0ZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRWFybmluZ3NUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uRW51bSB7XG4gICAgQm9udXMgPSAnQm9udXMnLFxuICAgIENvbW1pc3Npb24gPSAnQ29tbWlzc2lvbicsXG4gICAgT3ZlcnRpbWUgPSAnT3ZlcnRpbWUnLFxuICAgIFBhaWRUaW1lT2ZmID0gJ1BhaWQgVGltZSBPZmYnLFxuICAgIFJlZ3VsYXJQYXkgPSAnUmVndWxhciBQYXknLFxuICAgIFZhY2F0aW9uID0gJ1ZhY2F0aW9uJyxcbiAgICBFbXBsb3llZU1lZGljYXJlID0gJ0VtcGxveWVlIE1lZGljYXJlJyxcbiAgICBGaWNhID0gJ0ZJQ0EnLFxuICAgIFNvY2lhbFNlY3VyaXR5RW1wbG95ZWVUYXggPSAnU29jaWFsIFNlY3VyaXR5IEVtcGxveWVlIFRheCcsXG4gICAgTWVkaWNhbCA9ICdNZWRpY2FsJyxcbiAgICBWaXNpb24gPSAnVmlzaW9uJyxcbiAgICBEZW50YWwgPSAnRGVudGFsJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW1haWwgYWRkcmVzc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbWFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgZW1haWwgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBlbWFpbCBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgZW1haWwgYWNjb3VudCBhcyBkZXNjcmliZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbWFpbFxuICAgICAqL1xuICAgIHR5cGU6IEVtYWlsVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRW1haWxUeXBlRW51bSB7XG4gICAgUHJpbWFyeSA9ICdwcmltYXJ5JyxcbiAgICBTZWNvbmRhcnkgPSAnc2Vjb25kYXJ5JyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgYWRkcmVzczogUGF5c3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTWFyaXRhbCBzdGF0dXMgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgbWFyaXRhbF9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklEfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIHRheHBheWVyX2lkPzogVGF4cGF5ZXJJRDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YU51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M6IEFkZHJlc3NEYXRhTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbnVtYmVyIGZyb20gMCB0byAxIGluZGljYXRpbmcgUGxhaWRcXCdzIGxldmVsIG9mIGNvbmZpZGVuY2UgaW4gdGhlIHBhaXJpbmcgYmV0d2VlbiB0aGUgZW1wbG95ZXIgYW5kIHRoZSBpbnN0aXR1dGlvbiAobm90IHlldCBpbXBsZW1lbnRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX3Njb3JlOiBudW1iZXI7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9lbXBsb3llcnMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgbmFtZSB0byBiZSBzZWFyY2hlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIHByb2R1Y3RzIHRoZSByZXR1cm5lZCBlbXBsb3llcnMgc2hvdWxkIHN1cHBvcnQuIEN1cnJlbnRseSwgdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBgXFxcImRlcG9zaXRfc3dpdGNoXFxcImAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveWVycy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1wbG95ZXJzIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWEuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbXBsb3llcnM6IEFycmF5PEVtcGxveWVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZW1wbG95bWVudCBkZXRhaWxzIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBhbm51YWxfc2FsYXJ5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIERhdGUgb24gd2hpY2ggdGhlIGVtcGxveWVlIHdhcyBoaXJlZCwgaW4gdGhlIFlZWVktTU0tREQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgaGlyZV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBwYXltZW50IG9wdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gcmVxdWVzdCByZWZ1bmQgZGV0YWlscyBmcm9tIHRoZSBwYXllZVxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgU3VwcG9ydCB2YXJpZXMgYmV0d2VlbiBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCB3aWxsIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLiAgSWYgcmVmdW5kIGRldGFpbHMgY291bGQgYmUgcmV0cmlldmVkLCB0aGV5IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gSWYgcHJvdmlkZWQsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgYmFjcz86IFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIGFjY291bnQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgRU1JIGFjY291bnQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGVtaV9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGJhY3M6IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbD86IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIZWFsdGhJbmNpZGVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aEluY2lkZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaW5jaWRlbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBvbiB0aGUgaGVhbHRoIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNpZGVudFVwZGF0ZT59XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgaW5jaWRlbnRfdXBkYXRlczogQXJyYXk8SW5jaWRlbnRVcGRhdGU+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYmFsYW5jZSBoZWxkIGJ5IGFuIGFjY291bnQgaW4gdGhlIHBhc3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSGlzdG9yaWNhbEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGNhbGN1bGF0ZWQgaGlzdG9yaWNhbCBiYWxhbmNlLCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudCwgY2FsY3VsYXRlZCBmcm9tIHRoZSBgY3VycmVudGAgYmFsYW5jZSBpbiB0aGUgYGJhbGFuY2VgIG9iamVjdCBieSBzdWJ0cmFjdGluZyBpbmZsb3dzIGFuZCBhZGRpbmcgYmFjayBvdXRmbG93cyBhY2NvcmRpbmcgdG8gdGhlIHBvc3RlZCBkYXRlIG9mIGVhY2ggdHJhbnNhY3Rpb24uICBJZiB0aGUgYWNjb3VudCBoYXMgYW55IHBlbmRpbmcgdHJhbnNhY3Rpb25zLCBoaXN0b3JpY2FsIGJhbGFuY2UgYW1vdW50cyBvbiBvciBhZnRlciB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgcGVuZGluZyB0cmFuc2FjdGlvbiBtYXkgZGlmZmVyIGlmIHJldHJpZXZlZCBpbiBzdWJzZXF1ZW50IEFzc2V0IFJlcG9ydHMgYXMgYSByZXN1bHQgb2YgdGhvc2UgcGVuZGluZyB0cmFuc2FjdGlvbnMgcG9zdGluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcsIHVuZmV0Y2hlZCB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGhvbGRpbmcsIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29zdCBiYXNpcyBvZiB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgY29zdF9iYXNpczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBzZWN1cml0eSBpcyBhbiBvcHRpb24sIGBxdWFudGl0eWAgd2lsbCByZWZsZWN0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3B0aW9ucyAodHlwaWNhbGx5IHRoZSBudW1iZXIgb2YgY29udHJhY3RzIG11bHRpcGxpZWQgYnkgMTAwKSwgbm90IHRoZSBudW1iZXIgb2YgY29udHJhY3RzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgb3IgdXBkYXRlZCBob2xkaW5ncyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LiBUaGUgd2ViaG9vayB0eXBpY2FsbHkgZmlyZXMgb25jZSBwZXIgZGF5LCBhZnRlciBtYXJrZXQgY2xvc2UsIGluIHJlc3BvbnNlIHRvIGFueSBuZXdseSBhZGRlZCBob2xkaW5ncyBvciBwcmljZSBjaGFuZ2VzIHRvIGV4aXN0aW5nIGhvbGRpbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYEhPTERJTkdTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2hvbGRpbmdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1cGRhdGVkIGhvbGRpbmdzIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXBkYXRlZF9ob2xkaW5nczogbnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBob2xkaW5ncyBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ3NPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmdzT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGF0IHdoaWNoIGBpbnN0aXR1dGlvbl9wcmljZWAgd2FzIGN1cnJlbnQuIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlX2FzX29mPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBob2xkaW5nLiBNdWx0aXBsZSBjb3N0IGJhc2lzIHZhbHVlcyBmb3IgdGhlIHNhbWUgc2VjdXJpdHkgcHVyY2hhc2VkIGF0IGRpZmZlcmVudCBwcmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGNvc3RfYmFzaXM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHRoZSBhc3NldCBoZWxkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIHZhbGlkIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VjdXJpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHNlY3VyaXR5OiBTZWN1cml0eU92ZXJyaWRlO1xufVxuLyoqXG4gKiBJZGVudGl0eUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2lkZW50aXR5L2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGl0eUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIElkZW50aXR5IGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRJZGVudGl0eT59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudElkZW50aXR5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VXBkYXRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgdXBkYXRlIHdhcyBwdWJsaXNoZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtIHtcbiAgICBJbnZlc3RpZ2F0aW5nID0gJ0lOVkVTVElHQVRJTkcnLFxuICAgIElkZW50aWZpZWQgPSAnSURFTlRJRklFRCcsXG4gICAgU2NoZWR1bGVkID0gJ1NDSEVEVUxFRCcsXG4gICAgUmVzb2x2ZWQgPSAnUkVTT0xWRUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYnJlYWtkb3duIG9mIHRoZSBkaWZmZXJlbnQgaW5jb21lIHR5cGVzIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGluY29tZS4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6ICAgYFxcXCJyZWd1bGFyXFxcImA6IHJlZ3VsYXIgaW5jb21lICAgYFxcXCJvdmVydGltZVxcXCJgOiBvdmVydGltZSBpbmNvbWUgICAgYFxcXCJib251c1xcXCJgOiBib251cyBpbmNvbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBJbmNvbWVCcmVha2Rvd25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgaG91cmx5IHJhdGUgYXQgd2hpY2ggdGhlIGluY29tZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBob3VycyBsb2dnZWQgZm9yIHRoaXMgaW5jb21lIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHBheSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEluY29tZUJyZWFrZG93blR5cGVFbnVtIHtcbiAgICBCb251cyA9ICdib251cycsXG4gICAgT3ZlcnRpbWUgPSAnb3ZlcnRpbWUnLFxuICAgIFJlZ3VsYXIgPSAncmVndWxhcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJpZmllZCBmaWVsZHMgZnJvbSBhIHBheXN0dWIgdmVyaWZpY2F0aW9uLiBBbGwgZmllbGRzIGFyZSBwcm92aWRlZCBhcyByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU6IEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVtcGxveWVlX25hbWU6IEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9ncm9zc19pbmNvbWU6IFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB5dGRfbmV0X2luY29tZTogWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBwcm9qZWN0ZWRfd2FnZTogUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB2ZXJpZmllZF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25EYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGVuZHBvaW50IHRvIHdoaWNoIFBsYWlkIHNob3VsZCBzZW5kIHdlYmhvb2tzIHJlbGF0ZWQgdG8gdGhlIHByb2dyZXNzIG9mIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHViL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uIGZvciB3aGljaCB0byBnZXQgcGF5c3R1YiBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uIGZvciB3aGljaCB0byBnZXQgcGF5c3R1YiBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yj59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXlzdHViczogQXJyYXk8UGF5c3R1Yj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE/OiBBcnJheTxEb2N1bWVudE1ldGFkYXRhPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUmVxdWVzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uUmVmcmVzaFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3JlZnJlc2hfc3RhdHVzOiBWZXJpZmljYXRpb25SZWZyZXNoU3RhdHVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSBoYXMgY2hhbmdlZC4gSXQgd2lsbCB0eXBpY2FsbHkgdGFrZSBzZXZlcmFsIG1pbnV0ZXMgZm9yIHRoaXMgd2ViaG9vayB0byBmaXJlIGFmdGVyIHRoZSBlbmQgdXNlciBoYXMgdXBsb2FkZWQgdGhlaXIgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBcXFwiSU5DT01FXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYGluY29tZV92ZXJpZmljYXRpb25gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgb2YgdGhlIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSB3aG9zZSBzdGF0dXMgaXMgYmVpbmcgcmVwb3J0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGluY29tZSB2ZXJpZmljYXRpb24gc3RhdHVzIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1VQTE9BRF9FUlJPUmA6IEFuIHVwbG9hZCBlcnJvciBvY2N1cnJlZCB3aGVuIHRoZSBlbmQgdXNlciBhdHRlbXB0ZWQgdG8gdXBsb2FkIHRoZWlyIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfSU5WQUxJRF9UWVBFYDogVGhlIGVuZCB1c2VyIGF0dGVtcHRlZCB0byB1cGxvYWQgdmVyaWZpY2F0aW9uIGRvY3VtZW50YXRpb24gaW4gYW4gdW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19ET0NVTUVOVF9SRUpFQ1RFRGA6IFRoZSBkb2N1bWVudGF0aW9uIHVwbG9hZGVkIGJ5IHRoZSBlbmQgdXNlciB3YXMgcmVjb2duaXplZCBhcyBhIHN1cHBvcnRlZCBmaWxlIGZvcm1hdCwgYnV0IG5vdCByZWNvZ25pemVkIGFzIGEgdmFsaWQgcGF5c3R1Yi4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfRkFJTEVEYDogQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gYXR0ZW1wdGluZyB0byBwcm9jZXNzIHRoZSB2ZXJpZmljYXRpb24gZG9jdW1lbnRhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3N1bW1hcnkvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9zdW1tYXJ5L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGluY29tZSBzdW1tYXJpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc3VtbWFyaWVzOiBBcnJheTxJbmNvbWVTdW1tYXJ5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0YXhmb3Jtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VGF4Zm9ybT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXhmb3JtczogQXJyYXk8VGF4Zm9ybT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbldlYmhvb2tTdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbldlYmhvb2tTdGF0dXNcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYGluZmxvd19tb2RlbGAgYWxsb3dzIHlvdSB0byBtb2RlbCBhIHRlc3QgYWNjb3VudCB0aGF0IHJlY2VpdmVzIHJlZ3VsYXIgaW5jb21lIG9yIG1ha2UgcmVndWxhciBwYXltZW50cyBvbiBhIGxvYW4uIEFueSB0cmFuc2FjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBgaW5mbG93X21vZGVsYCB3aWxsIGFwcGVhciBpbiBhZGRpdGlvbiB0byByYW5kb21seSBnZW5lcmF0ZWQgdGVzdCBkYXRhIG9yIHRyYW5zYWN0aW9ucyBzcGVjaWZpZWQgYnkgYG92ZXJyaWRlX2FjY291bnRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5mbG93TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZsb3dNb2RlbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogSW5mbG93IG1vZGVsLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBub25lYDogTm8gaW5jb21lIGBtb250aGx5LWluY29tZWA6IEluY29tZSBvY2N1cnMgb25jZSBwZXIgbW9udGggYG1vbnRobHktYmFsYW5jZS1wYXltZW50YDogUGF5cyBvZmYgdGhlIGJhbGFuY2Ugb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aCBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgOiBNYWtlcyBhbiBpbnRlcmVzdC1vbmx5IHBheW1lbnQgb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gTm90ZSB0aGF0IGFjY291bnQgdHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzIHdpbGwgYWNjcnVlIGludGVyZXN0IGluIHRoZSBTYW5kYm94LiBUaGUgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIHN1YnR5cGUgYGNyZWRpdGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgaW5jb21lIHBlciBtb250aC4gVGhpcyB2YWx1ZSBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIGluY29tZV9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgYmV0d2VlbiAxIGFuZCAyOCwgb3IgYGxhc3RgIG1lYW5pbmcgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggdGhlIGluY29tZSB0cmFuc2FjdGlvbiB3aWxsIGFwcGVhci4gVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgcGF5bWVudF9kYXlfb2ZfbW9udGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBiYWxhbmNlIGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHN0YXRlbWVudF9kYXlfb2ZfbW9udGg6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBpbml0aWFsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbml0aWFsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOSVRJQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3LCB1bmZldGNoZWQgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgcmVsYXRpbmcgdG8gYSBzcGVjaWZpYyBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIFBsYWlkIHByb2R1Y3RzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uIE5vdGUgdGhhdCBvbmx5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgSW5zdGFudCBBdXRoIHdpbGwgcmV0dXJuIGBhdXRoYCBpbiB0aGUgcHJvZHVjdCBhcnJheTsgaW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IGxpc3QgYGF1dGhgIG1heSBzdGlsbCBzdXBwb3J0IG90aGVyIEF1dGggbWV0aG9kcyBzdWNoIGFzIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgVmVyaWZpY2F0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0Z1bGwgQXV0aCBjb3ZlcmFnZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgY291bnRyeSBjb2RlcyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBpbnN0aXR1dGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJpbWFyeSBjb2xvciB1c2VkIGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcHJpbWFyeV9jb2xvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQmFzZTY0IGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RpdHV0aW9uXFwncyBsb2dvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBhcnRpYWwgbGlzdCBvZiByb3V0aW5nIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi4gVGhpcyBsaXN0IGlzIHByb3ZpZGVkIGZvciB0aGUgcHVycG9zZSBvZiBsb29raW5nIHVwIGluc3RpdHV0aW9ucyBieSByb3V0aW5nIG51bWJlci4gSXQgaXMgbm90IGNvbXByZWhlbnNpdmUgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkIGFzIGEgY29tcGxldGUgbGlzdCBvZiByb3V0aW5nIG51bWJlcnMgZm9yIGFuIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyczogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIGlzIHByaW1hcmlseSByZWxldmFudCB0byBpbnN0aXR1dGlvbnMgd2l0aCBFdXJvcGVhbiBjb3VudHJ5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25NZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBpbmNsdWRlX3N0YXR1c2Agb3B0aW9uIHNldCB0byB0cnVlLiBOb3RlIHRoYXQgaW5zdGl0dXRpb24gc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpdGVtX2xvZ2luczogUHJvZHVjdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfdXBkYXRlczogUHJvZHVjdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBhdXRoOiBQcm9kdWN0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGJhbGFuY2U6IFByb2R1Y3RTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaWRlbnRpdHk6IFByb2R1Y3RTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfdXBkYXRlczogUHJvZHVjdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllc191cGRhdGVzPzogUHJvZHVjdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllcz86IFByb2R1Y3RTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBQcm9kdWN0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIERldGFpbHMgb2YgcmVjZW50IGhlYWx0aCBpbmNpZGVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGVhbHRoSW5jaWRlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGhlYWx0aF9pbmNpZGVudHM/OiBBcnJheTxIZWFsdGhJbmNpZGVudD4gfCBudWxsO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHRvIGdldCBkZXRhaWxzIGFib3V0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2YgUGxhaWQtc3VwcG9ydGVkIGNvdW50cnkgY29kZXMgdGhpcyBpbnN0aXR1dGlvbiBzdXBwb3J0cywgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybiBhbiBpbnN0aXR1dGlvblxcJ3MgbG9nbywgYnJhbmQgY29sb3IsIGFuZCBVUkwuIFdoZW4gYXZhaWxhYmxlLCB0aGUgYmFua1xcJ3MgbG9nbyBpcyByZXR1cm5lZCBhcyBhIGJhc2U2NCBlbmNvZGVkIDE1MngxNTIgUE5HLCB0aGUgYnJhbmQgY29sb3IgaXMgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RpdHV0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfc3RhdHVzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogSW5zdGl0dXRpb247XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIEluc3RpdHV0aW9ucyB0byBza2lwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIFBsYWlkLXN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzIHRoaXMgaW5zdGl0dXRpb24gc3VwcG9ydHMsIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoaWNoIHByb2R1Y3RzIHRoZXkgc3VwcG9ydC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIHJvdXRpbmcgbnVtYmVycyB0byBmaWx0ZXIgaW5zdGl0dXRpb25zLiBUaGUgcmVzcG9uc2Ugd2lsbCBvbmx5IHJldHVybiBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCBhbGwgb2YgdGhlIHJvdXRpbmcgbnVtYmVycyBpbiB0aGUgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBMaW1pdCByZXN1bHRzIHRvIGluc3RpdHV0aW9ucyB3aXRoIG9yIHdpdGhvdXQgT0F1dGggbG9naW4gZmxvd3MuIFRoaXMgaXMgcHJpbWFyaWx5IHJlbGV2YW50IHRvIGluc3RpdHV0aW9ucyB3aXRoIEV1cm9wZWFuIGNvdW50cnkgY29kZXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2F1dGg/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm4gdGhlIGluc3RpdHV0aW9uXFwncyBob21lcGFnZSBVUkwsIGxvZ28gYW5kIHByaW1hcnkgYnJhbmQgY29sb3IuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEksIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFBsYWlkIEluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgaW5zdGl0dXRpb25zIGJ5IHZhcmlvdXMgUGF5bWVudCBJbml0aWF0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnkuIEluc3RpdHV0aW9ucyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBxdWVyeSBhcmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgc3VwcG9ydCBhbGwgcHJvZHVjdHMgbGlzdGVkIGluIGBwcm9kdWN0c2AuIFByb3ZpZGUgYG51bGxgIHRvIGdldCBpbnN0aXR1dGlvbnMgcmVnYXJkbGVzcyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMuIE5vdGUgdGhhdCB3aGVuIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBpZiB5b3UgYXJlIGVuYWJsZWQgZm9yIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQgZXZlbiBpZiBgYXV0aGAgaXMgbm90IHByZXNlbnQgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIFBsYWlkLXN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzIHRoaXMgaW5zdGl0dXRpb24gc3VwcG9ydHMsIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gVGhpcyBpcyBwcmltYXJpbHkgcmVsZXZhbnQgdG8gaW5zdGl0dXRpb25zIHdpdGggRXVyb3BlYW4gY291bnRyeSBjb2Rlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL3NlYXJjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaW5zdGl0dXRpb25zIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uczogQXJyYXk8SW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudHMtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudFRyYW5zYWN0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEludmVzdG1lbnQgdHJhbnNhY3Rpb24sIHVuaXF1ZSBhY3Jvc3MgYWxsIFBsYWlkIHRyYW5zYWN0aW9ucy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGVnYWN5IGZpZWxkIGZvcm1lcmx5IHVzZWQgaW50ZXJuYWxseSBieSBQbGFpZCB0byBpZGVudGlmeSBjZXJ0YWluIGNhbmNlbGVkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhbmNlbF90cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhZ2FpbnN0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gcG9zdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHNlY3VyaXR5X2lkYCB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGlzIHJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLCBvciB0cmFuc2FjdGVkIGRhdGUgZm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb27igJlzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6IGBidXlgOiBCdXlpbmcgYW4gaW52ZXN0bWVudCBgc2VsbGA6IFNlbGxpbmcgYW4gaW52ZXN0bWVudCBgY2FuY2VsYDogQSBjYW5jZWxsYXRpb24gb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uIGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHdoaWNoIG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlciAgRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEZvciBkZXNjcmlwdGlvbnMgb2YgcG9zc2libGUgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtJbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2ludmVzdG1lbnQtdHJhbnNhY3Rpb24tdHlwZXMtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIENhbmNlbCA9ICdjYW5jZWwnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgRmVlID0gJ2ZlZScsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGVFbnVtIHtcbiAgICBBY2NvdW50RmVlID0gJ2FjY291bnQgZmVlJyxcbiAgICBBc3NpZ25tZW50ID0gJ2Fzc2lnbm1lbnQnLFxuICAgIEJ1eSA9ICdidXknLFxuICAgIEJ1eVRvQ292ZXIgPSAnYnV5IHRvIGNvdmVyJyxcbiAgICBDb250cmlidXRpb24gPSAnY29udHJpYnV0aW9uJyxcbiAgICBEZXBvc2l0ID0gJ2RlcG9zaXQnLFxuICAgIERpc3RyaWJ1dGlvbiA9ICdkaXN0cmlidXRpb24nLFxuICAgIERpdmlkZW5kID0gJ2RpdmlkZW5kJyxcbiAgICBEaXZpZGVuZFJlaW52ZXN0bWVudCA9ICdkaXZpZGVuZCByZWludmVzdG1lbnQnLFxuICAgIEV4ZXJjaXNlID0gJ2V4ZXJjaXNlJyxcbiAgICBFeHBpcmUgPSAnZXhwaXJlJyxcbiAgICBGdW5kRmVlID0gJ2Z1bmQgZmVlJyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgSW50ZXJlc3RSZWNlaXZhYmxlID0gJ2ludGVyZXN0IHJlY2VpdmFibGUnLFxuICAgIEludGVyZXN0UmVpbnZlc3RtZW50ID0gJ2ludGVyZXN0IHJlaW52ZXN0bWVudCcsXG4gICAgTGVnYWxGZWUgPSAnbGVnYWwgZmVlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdsb2FuIHBheW1lbnQnLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW4gPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpblJlaW52ZXN0bWVudCA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgTWFuYWdlbWVudEZlZSA9ICdtYW5hZ2VtZW50IGZlZScsXG4gICAgTWFyZ2luRXhwZW5zZSA9ICdtYXJnaW4gZXhwZW5zZScsXG4gICAgTWVyZ2VyID0gJ21lcmdlcicsXG4gICAgTWlzY2VsbGFuZW91c0ZlZSA9ICdtaXNjZWxsYW5lb3VzIGZlZScsXG4gICAgTm9uUXVhbGlmaWVkRGl2aWRlbmQgPSAnbm9uLXF1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgTm9uUmVzaWRlbnRUYXggPSAnbm9uLXJlc2lkZW50IHRheCcsXG4gICAgUGVuZGluZ0NyZWRpdCA9ICdwZW5kaW5nIGNyZWRpdCcsXG4gICAgUGVuZGluZ0RlYml0ID0gJ3BlbmRpbmcgZGViaXQnLFxuICAgIFF1YWxpZmllZERpdmlkZW5kID0gJ3F1YWxpZmllZCBkaXZpZGVuZCcsXG4gICAgUmViYWxhbmNlID0gJ3JlYmFsYW5jZScsXG4gICAgUmV0dXJuT2ZQcmluY2lwYWwgPSAncmV0dXJuIG9mIHByaW5jaXBhbCcsXG4gICAgU2VsbCA9ICdzZWxsJyxcbiAgICBTZWxsU2hvcnQgPSAnc2VsbCBzaG9ydCcsXG4gICAgU2hvcnRUZXJtQ2FwaXRhbEdhaW4gPSAnc2hvcnQtdGVybSBjYXBpdGFsIGdhaW4nLFxuICAgIFNob3J0VGVybUNhcGl0YWxHYWluUmVpbnZlc3RtZW50ID0gJ3Nob3J0LXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgU3Bpbk9mZiA9ICdzcGluIG9mZicsXG4gICAgU3BsaXQgPSAnc3BsaXQnLFxuICAgIFN0b2NrRGlzdHJpYnV0aW9uID0gJ3N0b2NrIGRpc3RyaWJ1dGlvbicsXG4gICAgVGF4ID0gJ3RheCcsXG4gICAgVGF4V2l0aGhlbGQgPSAndGF4IHdpdGhoZWxkJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgVHJhbnNmZXJGZWUgPSAndHJhbnNmZXIgZmVlJyxcbiAgICBUcnVzdEZlZSA9ICd0cnVzdCBmZWUnLFxuICAgIFVucXVhbGlmaWVkR2FpbiA9ICd1bnF1YWxpZmllZCBnYWluJyxcbiAgICBXaXRoZHJhd2FsID0gJ3dpdGhkcmF3YWwnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgb3IgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNhbmNlbGVkIHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGNhbmNlbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgcmVjZW50IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAgd2hlbiBmZXRjaGluZyB0cmFuc2FjdGlvbiBoaXN0b3J5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgYmVpbmcgZmV0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBBbGwgc2VjdXJpdGllcyBmb3Igd2hpY2ggdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIHRyYW5zYWN0aW9uIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb25zIGJlaW5nIGZldGNoZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxcJ1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBsaXN0IG9mIGludmVzdG1lbnRzIHRyYW5zYWN0aW9ucyBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9uXFwncyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBNdXN0IGJlIHBvc2l0aXZlIGlmIHRoZSB0eXBlIGlzIGEgYnV5IGFuZCBuZWdhdGl2ZSBpZiB0aGUgdHlwZSBpcyBhIHNlbGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21iaW5lZCB2YWx1ZSBvZiBhbGwgZmVlcyBhcHBsaWVkIHRvIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGZlZXM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGludmVzdG1lbnQgdHJhbnNhY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGBidXlgOiBCdXlpbmcgYW4gaW52ZXN0bWVudCBgc2VsbGA6IFNlbGxpbmcgYW4gaW52ZXN0bWVudCBgY2FzaGA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uIGBmZWVgOiBBIGZlZSBvbiB0aGUgYWNjb3VudCBgdHJhbnNmZXJgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk/OiBTZWN1cml0eU92ZXJyaWRlO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW0ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3MgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgYXZhaWxhYmxlX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgaGF2ZSBiZWVuIGJpbGxlZCBmb3IgdGhlIEl0ZW0uIE5vdGUgLSBgYmlsbGVkX3Byb2R1Y3RzYCBpcyBwb3B1bGF0ZWQgaW4gYWxsIGVudmlyb25tZW50cyBidXQgb25seSByZXF1ZXN0cyBpbiBQcm9kdWN0aW9uIGFyZSBiaWxsZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBiaWxsZWRfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgUkZDIDMzMzkgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBjb25zZW50IHByb3ZpZGVkIGJ5IHRoZSBlbmQgdXNlciB3aWxsIGV4cGlyZS4gVXBvbiBjb25zZW50IGV4cGlyYXRpb24sIHRoZSBpdGVtIHdpbGwgZW50ZXIgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZS4gVG8gY2lyY3VtdmVudCB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIGFuZCBtYWludGFpbiBjb250aW51b3VzIGNvbnNlbnQsIHRoZSBlbmQgdXNlciBjYW4gcmVhdXRoZW50aWNhdGUgdmlhIExpbmvigJlzIHVwZGF0ZSBtb2RlIGluIGFkdmFuY2Ugb2YgdGhlIGNvbnNlbnQgZXhwaXJhdGlvbiB0aW1lLiAgTm90ZSAtIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgYmUgbnVsbC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdGhlIGNhc2UgZm9yIEl0ZW1zIHdpdGggc29tZSBmb3JtcyBvZiB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uLiAgYGJhY2tncm91bmRgIC0gSXRlbSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCAgYHVzZXJfcHJlc2VudF9yZXF1aXJlZGAgLSBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVfdHlwZTogSXRlbVVwZGF0ZVR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEl0ZW1VcGRhdGVUeXBlRW51bSB7XG4gICAgQmFja2dyb3VuZCA9ICdiYWNrZ3JvdW5kJyxcbiAgICBVc2VyUHJlc2VudFJlcXVpcmVkID0gJ3VzZXJfcHJlc2VudF9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXdfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMgZm9yIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29ubmVjdGVkIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbnM6IEFycmF5PENvbm5lY3RlZEFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogVXNlciBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLCBmb3IgY2xpZW50cyBtYWtpbmcgYSByZXF1ZXN0IHdpdGhvdXQgYW4gYGFjY2Vzc190b2tlbmAuIFRoaXMgaXMgb25seSBhbGxvd2VkIGZvciBzZWxlY3QgY2xpZW50cyBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIE1vc3QgY2xpZW50cyBzaG91bGQgY2FsbCAvaXRlbS9pbXBvcnQgdG8gb2J0YWluIGFuIGFjY2VzcyB0b2tlbiBiZWZvcmUgbWFraW5nIGEgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoIHtcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IHVzZXJuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUgaGFzaGVkIGJ5IEZJLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIGZpX3VzZXJuYW1lX2hhc2g/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbnMvbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY29wZXM6IFNjb3BlcztcbiAgICAvKipcbiAgICAgKiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCBkdXJpbmcgZW5yb2xsbWVudCwgdGhpcyBmaWVsZCBtdXN0IGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBzdGF0ZSBzZW50IHRvIHRoZSBwYXJ0bmVyIGluIHRoZSBPQXV0aCBMb2dpbiBVUkkuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgd2hlbiB0aGUgY29udGV4dCBpcyBgRU5ST0xMTUVOVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNDb250ZXh0fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29udGV4dDogU2NvcGVzQ29udGV4dDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdpdGggYW4gSXRlbS4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5r4oCZcyB1cGRhdGUgbW9kZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUVycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2dldGAgYW5kIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJdGVtU3RhdHVzTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1JbXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vaW1wb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwcm9kdWN0IHN0cmluZ3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGh9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9hdXRoOiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGNvbmZpZ3VyZSBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIGFuIEl0ZW0uIFBsYWlkIGZpcmVzIGEgd2ViaG9vayBpZiBjcmVkZW50aWFscyBmYWlsLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3Qgb2YgdXNlciBJRCBhbmQgYXV0aCB0b2tlbiBwYWlyLCBwZXJtaXR0aW5nIFBsYWlkIHRvIGFnZ3JlZ2F0ZSBhIHVzZXLigJlzIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoIHtcbiAgICAvKipcbiAgICAgKiBPcGFxdWUgdXNlciBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBdXRob3JpemF0aW9uIHRva2VuIFBsYWlkIHdpbGwgdXNlIHRvIGFnZ3JlZ2F0ZSB0aGlzIHVzZXLigJlzIGFjY291bnRzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICAgICAqL1xuICAgIGF1dGhfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2ltcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgb25jZSBQbGFpZCBjYWxjdWxhdGVzIGluY29tZSBmcm9tIGFuIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgYHB1YmxpY190b2tlbmAgZm9yIHRoZSBwYXJ0aWN1bGFyIEl0ZW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIGBwdWJsaWNfdG9rZW5gLCBvYnRhaW5lZCBmcm9tIHRoZSBMaW5rIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9yIGAvc2FuZGJveC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCB2YWx1ZSBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIGZhaWxzIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB3ZWJob29rIGZpcmVkIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgd2ViaG9vayB3YXMgZmlyZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIHNlbnRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHdlYmhvb2sgY29kZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIGNvZGVfc2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogSXRlbVN0YXR1c0ludmVzdG1lbnRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgbGFzdF93ZWJob29rPzogSXRlbVN0YXR1c0xhc3RXZWJob29rIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgbGFzdF9zdWNjZXNzZnVsX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFtKV1QgbGlicmFyaWVzXShodHRwczovL2p3dC5pby8jbGlicmFyaWVzLWlvKSB0byB2ZXJpZnkgUGxhaWQgd2ViaG9va3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldLUHVibGljS2V5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSldLUHVibGljS2V5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWxnIG1lbWJlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBmYW1pbHkgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgYWxnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNydiBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBjdXJ2ZSB1c2VkIHdpdGggdGhlIGtleS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBjcnY6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga2lkIChLZXkgSUQpIG1lbWJlciBjYW4gYmUgdXNlZCB0byBtYXRjaCBhIHNwZWNpZmljIGtleS4gVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGluc3RhbmNlLCB0byBjaG9vc2UgYW1vbmcgYSBzZXQgb2Yga2V5cyB3aXRoaW4gdGhlIEpXSyBkdXJpbmcga2V5IHJvbGxvdmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGtpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBrdHkgKGtleSB0eXBlKSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LCBzdWNoIGFzIFJTQSBvciBFQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBrdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlIChwdWJsaWMga2V5IHVzZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGludGVuZGVkIHVzZSBvZiB0aGUgcHVibGljIGtleS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICB1c2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgeCBtZW1iZXIgY29udGFpbnMgdGhlIHggY29vcmRpbmF0ZSBmb3IgdGhlIGVsbGlwdGljIGN1cnZlIHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgeSBtZW1iZXIgY29udGFpbnMgdGhlIHkgY29vcmRpbmF0ZSBmb3IgdGhlIGVsbGlwdGljIGN1cnZlIHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSBleHBpcmVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBKV1QgSGVhZGVyLCB1c2VkIGZvciB3ZWJob29rIHZhbGlkYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldUSGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSldUSGVhZGVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV1RIZWFkZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBvZiB0eXBlIGBMSUFCSUxJVElFU2AgYW5kIGNvZGUgYERFRkFVTFRfVVBEQVRFYCB3aWxsIGJlIGZpcmVkIHdoZW4gbmV3IG9yIHVwZGF0ZWQgbGlhYmlsaXRpZXMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGEgbGlhYmlsaXRpZXMgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSUFCSUxJVElFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYFxcJ3MgZm9yIGFjY291bnRzIHRoYXQgY29udGFpbiBuZXcgbGlhYmlsaXRpZXMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX25ld19saWFiaWxpdGllczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBrZXlzIG9mIGBhY2NvdW50X2lkYFxcJ3MgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgbGlhYmlsaXRpZXMgZmllbGRzIHRoYXQgY2hhbmdlZC4gIEV4YW1wbGU6IGB7IFxcXCJYTUJ2dnlNR1ExVW9MYktCeW9NcUgzblhNajg0QUxTZEU1QjU4XFxcIjogW1xcXCJwYXN0X2Ftb3VudF9kdWVcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2xpYWJpbGl0aWVzOiB7IFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZz47IH07XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvbGlhYmlsaXRpZXMvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgYG9wdGlvbnNgIGNhbm5vdCBiZSBudWxsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBMaWFiaWxpdGllc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpYWJpbGl0aWVzT2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXM6IExpYWJpbGl0aWVzT2JqZWN0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBsaWFiaWxpdHkgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNyZWRpdCBhY2NvdW50cyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0Q2FyZExpYWJpbGl0eT59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzT2JqZWN0XG4gICAgICovXG4gICAgY3JlZGl0OiBBcnJheTxDcmVkaXRDYXJkTGlhYmlsaXR5PiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1vcnRnYWdlIGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxNb3J0Z2FnZUxpYWJpbGl0eT59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzT2JqZWN0XG4gICAgICovXG4gICAgbW9ydGdhZ2U6IEFycmF5PE1vcnRnYWdlTGlhYmlsaXR5PiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0dWRlbnQgbG9hbiBhY2NvdW50cyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U3R1ZGVudExvYW4+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIHN0dWRlbnQ6IEFycmF5PFN0dWRlbnRMb2FuPiB8IG51bGw7XG59XG4vKipcbiAqIFVzZWQgdG8gY29uZmlndXJlIFNhbmRib3ggdGVzdCBkYXRhIGZvciB0aGUgTGlhYmlsaXRpZXMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdHlPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgbGlhYmlsaXR5IG9iamVjdCwgZWl0aGVyIGBjcmVkaXRgIG9yIGBzdHVkZW50YC4gTW9ydGdhZ2VzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiB0aGUgY3VzdG9tIFNhbmRib3guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1cmNoYXNlIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBGb3Igc2ltcGxpY2l0eSwgdGhpcyBpcyB0aGUgb25seSBpbnRlcmVzdCByYXRlIHVzZWQgdG8gY2FsY3VsYXRlIGludGVyZXN0IGNoYXJnZXMuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwdXJjaGFzZV9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY2FzaCBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGNhc2hfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbGFuY2UgdHJhbnNmZXIgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBiYWxhbmNlX3RyYW5zZmVyX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBzcGVjaWFsIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc3BlY2lhbF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGxhc3RfcGF5bWVudF9hbW91bnRgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgbWluaW11bV9wYXltZW50X2Ftb3VudGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAgb3IgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgaXNfb3ZlcmR1ZWAgZmllbGRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIGxvYW4gcHJpbmNpcGFsLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHByaW5jaXBhbDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcmVzdCByYXRlIG9uIHRoZSBsb2FuIGFzIGEgcGVyY2VudGFnZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBub21pbmFsX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgaW50ZXJlc3QgY2FwaXRhbGl6YXRpb24gYmVnaW5zIGF0IHRoZSBnaXZlbiBudW1iZXIgb2YgbW9udGhzIGFmdGVyIGxvYW4gb3JpZ2luYXRpb24uIEJ5IGRlZmF1bHQgaW50ZXJlc3QgaXMgbmV2ZXIgY2FwaXRhbGl6ZWQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaW50ZXJlc3RfY2FwaXRhbGl6YXRpb25fZ3JhY2VfcGVyaW9kX21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb2RlbDogU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbDtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGV4cGVjdGVkX3BheW9mZl9kYXRlYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBleHBlY3RlZF9wYXlvZmZfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgZ3VhcmFudG9yYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBndWFyYW50b3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGlzX2ZlZGVyYWxgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpc19mZWRlcmFsOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgbG9hbl9uYW1lYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsb2FuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwYXltZW50X3JlZmVyZW5jZV9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UFNMRlN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwc2xmX3N0YXR1czogUFNMRlN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLmRlc2NyaXB0aW9uYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbl9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcmVwYXltZW50X3BsYW4udHlwZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBgXFxcImV4dGVuZGVkIGdyYWR1YXRlZFxcXCJgLCBgXFxcImV4dGVuZGVkIHN0YW5kYXJkXFxcImAsIGBcXFwiZ3JhZHVhdGVkXFxcImAsIGBcXFwiaW5jb21lLWNvbnRpbmdlbnQgcmVwYXltZW50XFxcImAsIGBcXFwiaW5jb21lLWJhc2VkIHJlcGF5bWVudFxcXCJgLCBgXFxcImludGVyZXN0IG9ubHlcXFwiYCwgYFxcXCJvdGhlclxcXCJgLCBgXFxcInBheSBhcyB5b3UgZWFyblxcXCJgLCBgXFxcInJldmlzZWQgcGF5IGFzIHlvdSBlYXJuXFxcImAsIG9yIGBcXFwic3RhbmRhcmRcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHNlcXVlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2VxdWVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogQWRkcmVzcztcbn1cbi8qKlxuICogQnkgZGVmYXVsdCwgTGluayB3aWxsIHByb3ZpZGUgbGltaXRlZCBhY2NvdW50IGZpbHRlcmluZzogaXQgd2lsbCBvbmx5IGRpc3BsYXkgSW5zdGl0dXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBhbGwgcHJvZHVjdHMgc3VwcGxpZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLCBhbmQsIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIHdpbGwgYWxzbyBmaWx0ZXIgb3V0IGFjY291bnRzIG90aGVyIHRoYW4gYGNoZWNraW5nYCBhbmQgYHNhdmluZ3NgIGFjY291bnRzIG9uIHRoZSBBY2NvdW50IFNlbGVjdCBwYW5lLiBZb3UgY2FuIGZ1cnRoZXIgbGltaXQgdGhlIGFjY291bnRzIHNob3duIGluIExpbmsgYnkgdXNpbmcgYGFjY291bnRfZmlsdGVyc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBzaG93biBpbiBMaW5rLiBPbmx5IHRoZSBzcGVjaWZpZWQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gVGhpcyBmaWx0ZXJpbmcgYXBwbGllcyB0byBib3RoIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3IChpZiBlbmFibGVkKSBhbmQgdGhlIEluc3RpdHV0aW9uIFNlbGVjdCB2aWV3LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgc2VsZWN0ZWQgc3VidHlwZXMgd2lsbCBiZSBvbWl0dGVkIGZyb20gTGluay4gVG8gaW5kaWNhdGUgdGhhdCBhbGwgc3VidHlwZXMgc2hvdWxkIGJlIHNob3duLCB1c2UgdGhlIHZhbHVlIGBcXFwiYWxsXFxcImAuIElmIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBmaWx0ZXIgaXMgdXNlZCwgYW55IGFjY291bnQgdHlwZSBmb3Igd2hpY2ggYSBmaWx0ZXIgaXMgbm90IHNwZWNpZmllZCB3aWxsIGJlIGVudGlyZWx5IG9taXR0ZWQgZnJvbSBMaW5rLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudHMtc2NoZW1hKS4gIEZvciBpbnN0aXR1dGlvbnMgdXNpbmcgT0F1dGgsIHRoZSBmaWx0ZXIgd2lsbCBub3QgYWZmZWN0IHRoZSBsaXN0IG9mIGFjY291bnRzIHNob3duIGJ5IHRoZSBiYW5rIGluIHRoZSBPQXV0aCB3aW5kb3cuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBsb2FuPzogTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIGFwcGxpY2F0aW9uLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIExpbmsuIE1heGltdW0gbGVuZ3RoIG9mIDMwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhbmd1YWdlIHRoYXQgTGluayBzaG91bGQgYmUgZGlzcGxheWVkIGluLiAgU3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IC0gRW5nbGlzaCAoYFxcJ2VuXFwnYCkgLSBGcmVuY2ggKGBcXCdmclxcJ2ApIC0gU3BhbmlzaCAoYFxcJ2VzXFwnYCkgLSBEdXRjaCAoYFxcJ25sXFwnYCkgIFdoZW4gdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIHRoZSBsYW5ndWFnZSBjb25maWd1cmVkIGhlcmUgbXVzdCBtYXRjaCB0aGUgc2V0dGluZyBpbiB0aGUgY3VzdG9taXphdGlvbiwgb3IgdGhlIGN1c3RvbWl6YXRpb24gd2lsbCBub3QgYmUgYXBwbGllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIFBsYWlkLXN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbnN0aXR1dGlvbnMgZnJvbSBhbGwgbGlzdGVkIGNvdW50cmllcyB3aWxsIGJlIHNob3duLiAgU3VwcG9ydGVkIGNvdW50cnkgY29kZXMgYXJlOiBgVVNgLCBgQ0FgLCBgRVNgLCBgRlJgLCBgR0JgLCBgSUVgLCBgTkxgLiAgSWYgTGluayBpcyBsYXVuY2hlZCB3aXRoIG11bHRpcGxlIGNvdW50cnkgY29kZXMsIG9ubHkgcHJvZHVjdHMgdGhhdCB5b3UgYXJlIGVuYWJsZWQgZm9yIGluIGFsbCBjb3VudHJpZXMgd2lsbCBiZSB1c2VkIGJ5IExpbmsuIE5vdGUgdGhhdCB3aGlsZSBhbGwgY291bnRyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gU2FuZGJveCBhbmQgRGV2ZWxvcG1lbnQsIGluIFByb2R1Y3Rpb24gb25seSBVUyBhbmQgQ2FuYWRhIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFRvIGdhaW4gYWNjZXNzIHRvIEV1cm9wZWFuIGluc3RpdHV0aW9ucyBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudCwgW2ZpbGUgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiBJZiB5b3UgaW5pdGlhbGl6ZSB3aXRoIGEgRXVyb3BlYW4gY291bnRyeSBjb2RlLCB5b3VyIHVzZXJzIHdpbGwgc2VlIHRoZSBFdXJvcGVhbiBjb25zZW50IHBhbmVsIGR1cmluZyB0aGUgTGluayBmbG93LiAgSWYgdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIG1ha2Ugc3VyZSB0aGUgY291bnRyeSBjb2RlcyBpbiB0aGUgY3VzdG9taXphdGlvbiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgaW4gYGNvdW50cnlfY29kZXNgLiBJZiBib3RoIGBjb3VudHJ5X2NvZGVzYCBhbmQgYSBMaW5rIGN1c3RvbWl6YXRpb24gYXJlIHVzZWQsIHRoZSB2YWx1ZSBpbiBgY291bnRyeV9jb2Rlc2AgbWF5IG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiB0aGUgY3VzdG9taXphdGlvbi4gIElmIHVzaW5nIHRoZSBBdXRoIGZlYXR1cmVzIEluc3RhbnQgTWF0Y2gsIFNhbWUtZGF5IE1pY3JvLWRlcG9zaXRzLCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMsIGBjb3VudHJ5X2NvZGVzYCBtdXN0IGJlIHNldCB0byBgW1xcJ1VTXFwnXWAuXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcjtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gdXNlLiBJZiBsYXVuY2hpbmcgTGluayBpbiB1cGRhdGUgbW9kZSwgc2hvdWxkIGJlIG9taXR0ZWQ7IHJlcXVpcmVkIG90aGVyd2lzZS4gVmFsaWQgcHJvZHVjdHMgYXJlOiAgYHRyYW5zYWN0aW9uc2AsIGBhdXRoYCwgYGlkZW50aXR5YCwgYGFzc2V0c2AsIGBpbnZlc3RtZW50c2AsIGBsaWFiaWxpdGllc2AsIGBwYXltZW50X2luaXRpYXRpb25gLCBgZGVwb3NpdF9zd2l0Y2hgLCBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGFsaXphdGlvbiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluaXRpYWxpemVkIHdoZW4gYW55IG90aGVyIHByb2R1Y3QgaXMgaW5pdGlhbGl6ZWQuICBPbmx5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgKmFsbCogcmVxdWVzdGVkIHByb2R1Y3RzIHdpbGwgYmUgc2hvd24gaW4gTGluazsgdG8gbWF4aW1pemUgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgbGlzdGVkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgbWluaW1hbCBwcm9kdWN0IHNldCByZXF1aXJlZCBmb3IgeW91ciB1c2UgY2FzZS4gQWRkaXRpb25hbCBwcm9kdWN0cyBjYW4gYmUgYWRkZWQgYWZ0ZXIgTGluayBpbml0aWFsaXphdGlvbiBieSBjYWxsaW5nIHRoZSByZWxldmFudCBlbmRwb2ludHMuIEZvciBkZXRhaWxzIGFuZCBleGNlcHRpb25zLCBzZWUgW0Nob29zaW5nIHdoZW4gdG8gaW5pdGlhbGl6ZSBwcm9kdWN0c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2Jlc3QtcHJhY3RpY2VzLyNjaG9vc2luZy13aGVuLXRvLWluaXRpYWxpemUtcHJvZHVjdHMpLiAgTm90ZSB0aGF0LCB1bmxlc3MgeW91IGhhdmUgb3B0ZWQgdG8gZGlzYWJsZSBJbnN0YW50IE1hdGNoIHN1cHBvcnQsIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgSW5zdGFudCBNYXRjaCB3aWxsIGFsc28gYmUgc2hvd24gaW4gTGluayBpZiBgYXV0aGAgaXMgc3BlY2lmaWVkIGFzIGEgcHJvZHVjdCwgZXZlbiB0aG91Z2ggdGhlc2UgaW5zdGl0dXRpb25zIGRvIG5vdCBjb250YWluIGBhdXRoYCBpbiB0aGVpciBwcm9kdWN0IGFycmF5LiAgSW4gUHJvZHVjdGlvbiwgeW91IHdpbGwgYmUgYmlsbGVkIGZvciBlYWNoIHByb2R1Y3QgdGhhdCB5b3Ugc3BlY2lmeSB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBOb3RlIHRoYXQgYSBwcm9kdWN0IGNhbm5vdCBiZSByZW1vdmVkIGZyb20gYW4gSXRlbSBvbmNlIHRoZSBJdGVtIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhhdCBwcm9kdWN0LiBUbyBzdG9wIGJpbGxpbmcgb24gYW4gSXRlbSBmb3Igc3Vic2NyaXB0aW9uLWJhc2VkIHByb2R1Y3RzLCBzdWNoIGFzIExpYWJpbGl0aWVzLCBJbnZlc3RtZW50cywgYW5kIFRyYW5zYWN0aW9ucywgcmVtb3ZlIHRoZSBJdGVtIHZpYSBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIFVSTCB0byB3aGljaCBhbnkgd2ViaG9va3Mgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSB0byB1cGRhdGUsIHVzZWQgd2hlbiB1cGRhdGluZyBvciBtb2RpZnlpbmcgYW4gZXhpc3RpbmcgYGFjY2Vzc190b2tlbmAuIFVzZWQgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB1cGRhdGUgbW9kZSwgd2hlbiBjb21wbGV0aW5nIHRoZSBTYW1lLWRheSAobWFudWFsKSBNaWNyby1kZXBvc2l0IGZsb3csIG9yIChvcHRpb25hbGx5KSB3aGVuIGluaXRpYWxpemluZyBMaW5rIGFzIHBhcnQgb2YgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoVUsgYW5kIEV1cm9wZSkgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBMaW5rIGN1c3RvbWl6YXRpb24gZnJvbSB0aGUgUGxhaWQgRGFzaGJvYXJkIHRvIGJlIGFwcGxpZWQgdG8gTGluay4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBkZWZhdWx0YCBjdXN0b21pemF0aW9uIHdpbGwgYmUgdXNlZC4gV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGluIHRoZSBjdXN0b21pemF0aW9uIG11c3QgbWF0Y2ggdGhlIGxhbmd1YWdlIHNlbGVjdGVkIHZpYSB0aGUgYGxhbmd1YWdlYCBwYXJhbWV0ZXIsIGFuZCB0aGUgY291bnRyaWVzIGluIHRoZSBjdXN0b21pemF0aW9uIHNob3VsZCBtYXRjaCB0aGUgY291bnRyeSBjb2RlcyBzZWxlY3RlZCB2aWEgYGNvdW50cnlfY29kZXNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2N1c3RvbWl6YXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSSSBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBhIHVzZXIgc2hvdWxkIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIHZpYSBhIHdlYnZpZXcuIFRoZSBgcmVkaXJlY3RfdXJpYCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFdoZW4gdXNlZCBpbiBQcm9kdWN0aW9uIG9yIERldmVsb3BtZW50LCBtdXN0IGJlIGFuIGh0dHBzIFVSSS4gVG8gc3BlY2lmeSBhbnkgc3ViZG9tYWluLCB1c2UgYCpgIGFzIGEgd2lsZGNhcmQgY2hhcmFjdGVyLCBlLmcuIGBodHRwczovL18qLmV4YW1wbGUuY29tL29hdXRoLmh0bWxgLiBJZiBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIGlzIHNwZWNpZmllZCwgdGhpcyBmaWVsZCBzaG91bGQgYmUgbGVmdCBibGFuay4gIE5vdGUgdGhhdCBhbnkgcmVkaXJlY3QgVVJJIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCByZWRpcmVjdCBVUklzIGxpc3QgaW4gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBcXCdzIEFuZHJvaWQgcGFja2FnZS4gUmVxdWlyZWQgaWYgdXNpbmcgdGhlIGBsaW5rX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgb24gQW5kcm9pZC4gV2hlbiBjcmVhdGluZyBhIGBsaW5rX3Rva2VuYCBmb3IgaW5pdGlhbGl6aW5nIExpbmsgb24gb3RoZXIgcGxhdGZvcm1zLCB0aGlzIGZpZWxkIG11c3QgYmUgbGVmdCBibGFuay4gQW55IHBhY2thZ2UgbmFtZSBzcGVjaWZpZWQgaGVyZSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgQW5kcm9pZCBwYWNrYWdlIG5hbWVzIHNldHRpbmcgb24gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW5kcm9pZF9wYWNrYWdlX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkFjY291bnRGaWx0ZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogTGlua1Rva2VuQWNjb3VudEZpbHRlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkVVQ29uZmlnfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXVfY29uZmlnPzogTGlua1Rva2VuRVVDb25maWc7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgY2VydGFpbiBFdXJvcGUtb25seSBjb25maWd1cmF0aW9ucywgYXMgd2VsbCBhcyBjZXJ0YWluIGxlZ2FjeSB1c2UgY2FzZXMgaW4gb3RoZXIgcmVnaW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaW5pdGlhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2h9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoO1xufVxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgb25seSBkaXNwbGF5IGFjY291bnQgdHlwZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuICBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudHMtc2NoZW1hKS4gIEZvciBpbnN0aXR1dGlvbnMgdXNpbmcgT0F1dGgsIHRoZSBmaWx0ZXIgd2lsbCBub3QgYWZmZWN0IHRoZSBsaXN0IG9mIGluc3RpdHV0aW9ucyBvciBhY2NvdW50cyBzaG93biBieSB0aGUgYmFuayBpbiB0aGUgT0F1dGggd2luZG93LiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXMge1xuICAgIC8qKlxuICAgICAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9O1xuICAgIC8qKlxuICAgICAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfTtcbiAgICAvKipcbiAgICAgKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGxvYW4/OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfTtcbiAgICAvKipcbiAgICAgKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50c1xuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfTtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQXV0aCBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBvbmx5IHJlcXVpcmVkIGlmIHVzaW5nIHRoZSBGbGV4aWJsZSBBdXRoIHByb2R1Y3QgKGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YSkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGgge1xuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb25hbCBBdXRoIGZsb3cgdG8gdXNlLiBDdXJyZW50bHkgb25seSB1c2VkIHRvIGVuYWJsZSBGbGV4aWJsZSBBdXRoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgZmxvd190eXBlOiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aEZsb3dUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aEZsb3dUeXBlRW51bSB7XG4gICAgRmxleGlibGVBdXRoID0gJ0ZMRVhJQkxFX0FVVEgnXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgRGVwb3NpdCBTd2l0Y2ggKGJldGEpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGRlcG9zaXRfc3dpdGNoYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaCB7XG4gICAgLyoqXG4gICAgICogVGhlIGBkZXBvc2l0X3N3aXRjaF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEluY29tZSAoYmV0YSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIG9mIHRoZSB2ZXJpZmljYXRpb24gaW5zdGFuY2UsIGFzIHByb3ZpZGVkIGJ5IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfaWRgIG9mIGFuIGFzc2V0IHJlcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGFzIHByb3ZpZGVkIGJ5IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFByb3ZpZGluZyBhbiBgYXNzZXRfcmVwb3J0X2lkYCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSB1c2VyIHRocm91Z2ggYSBzdHJlYW1saW5lZCBmbG93LiBJZiBwcm92aWRlZCwgdGhlIGJhbmsgbGlua2luZyBmbG93IHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgcGF5bWVudF9pbml0aWF0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHByb3ZpZGVkIGJ5IHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXIgd2hvIHdpbGwgYmUgbGlua2luZyB0aGVpciBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLiBJdCBpcyBjdXJyZW50bHkgdXNlZCBhcyBhIG1lYW5zIG9mIHNlYXJjaGluZyBsb2dzIGZvciB0aGUgZ2l2ZW4gdXNlciBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZnVsbCBsZWdhbCBuYW1lLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIHVzZWQgaW4gdGhlIFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpIHRvIGFzc29jaWF0ZSBJdGVtcyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXQuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCByZXF1aXJlZCB0byBlbmFibGUgdGhlIFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBwaG9uZSBudW1iZXIgd2FzIHZlcmlmaWVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUaGg6bW06c3NaYCkuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCByZXF1aXJlZCB0byBlbmFibGUgYW55IFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhIHBob25lIG51bWJlciB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyX3ZlcmlmaWVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwsIGJ1dCByZXF1aXJlZCB0byBlbmFibGUgdGhlIFtwcmUtYXV0aGVudGljYXRlZCByZXR1cm5pbmcgdXNlciBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIvI2VuYWJsaW5nLXRoZS1yZXR1cm5pbmctdXNlci1leHBlcmllbmNlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIGVtYWlsIGFkZHJlc3Mgd2FzIHZlcmlmaWVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUaGg6bW06c3NaYCkuIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgdXNlZCBpbiB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuICAgT25seSBwYXNzIGEgdmVyaWZpY2F0aW9uIHRpbWUgZm9yIGFuIGVtYWlsIGFkZHJlc3MgdGhhdCB5b3UgaGF2ZSB2ZXJpZmllZC4gSWYgeW91IGhhdmUgcGVyZm9ybWVkIHZlcmlmaWNhdGlvbiBidXQgZG9u4oCZdCBoYXZlIHRoZSB0aW1lLCB5b3UgbWF5IHN1cHBseSBhIHNpZ25hbCB2YWx1ZSBvZiB0aGUgc3RhcnQgb2YgdGhlIFVOSVggZXBvY2guICAgRXhhbXBsZTogYDIwMjAtMDEtMDFUMDA6MDA6MDBaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc192ZXJpZmllZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcImRkZC1kZC1kZGRkXFxcIi4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCBhbmQgd2lsbCBzdXBwb3J0IG5vdC15ZXQtaW1wbGVtZW50ZWQgZnVuY3Rpb25hbGl0eSBmb3IgbmV3IHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcInl5eXktbW0tZGRcXFwiLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCB3aWxsIHN1cHBvcnQgbm90LXlldC1pbXBsZW1lbnRlZCBmdW5jdGlvbmFsaXR5IGZvciBuZXcgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgbGlua190b2tlbmAgY3JlYXRlZCB0byBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIHRoYXQgd2lsbCBiZSBleGNoYW5nZWQgZm9yIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgNCBob3Vycy4gQSBgbGlua190b2tlbmAgY3JlYXRlZCBmb3IgYW4gZXhpc3RpbmcgSXRlbSAoc3VjaCBhcyB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gIGJ5IGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlKSBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEVVIGZsb3dzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWcge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgb3BlbiBMaW5rIHdpdGhvdXQgYW4gaW5pdGlhbCBVSS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuRVVDb25maWdcbiAgICAgKi9cbiAgICBoZWFkbGVzcz86IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBhcmd1bWVudHMgb3JpZ2luYWxseSBwcm92aWRlZCB0byB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvZHVjdHNgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5pdGlhbF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgd2ViaG9va2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY291bnRyeV9jb2Rlc2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIGBsYW5ndWFnZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEZpbHRlcnNSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IEFjY291bnRGaWx0ZXJzUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWRpcmVjdF91cmlgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X25hbWVgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIExpbmtUb2tlbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbkZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5GaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudHMtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbkZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbGF0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbG9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBkZWZpbmVkIHN0b3JlIG51bWJlciB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBzdG9yZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbXVsdGktZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzIHRvIHVzZSB3aXRoIHRoaXMgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1GQVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1GQSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSBgZGV2aWNlYCwgYHNlbGVjdGlvbnNgLCBvciBgcXVlc3Rpb25zYC4gIElmIHZhbHVlIGlzIGBkZXZpY2VgLCB0aGUgTUZBIGFuc3dlciBpcyBgMTIzNGAuICBJZiB2YWx1ZSBpcyBgc2VsZWN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzIGFsd2F5cyB0aGUgZmlyc3Qgb3B0aW9uLiAgSWYgdmFsdWUgaXMgYHF1ZXN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzICBgYW5zd2VyXzxpPl88aj5gIGZvciB0aGUgai10aCBxdWVzdGlvbiBpbiB0aGUgaS10aCByb3VuZCwgc3RhcnRpbmcgZnJvbSAwLiBGb3IgZXhhbXBsZSwgdGhlIGFuc3dlciB0byB0aGUgZmlyc3QgcXVlc3Rpb24gaW4gdGhlIHNlY29uZCByb3VuZCBpcyBgYW5zd2VyXzFfMGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2YgcXVlc3Rpb25zLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBxdWVzdGlvbnMgcGVyIHJvdW5kLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIElmIHZhbHVlIG9mIHR5cGUgaXMgYHNlbGVjdGlvbnNgLCBkZWZhdWx0IHZhbHVlIGlzIDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25zX3Blcl9yb3VuZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2Ygc2VsZWN0aW9ucywgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbnNgLiBEZWZhdWx0cyB0byAxLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYXZhaWxhYmxlIGFuc3dlcnMgcGVyIHF1ZXN0aW9uLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uYC4gRGVmYXVsdHMgdG8gMi4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uc19wZXJfcXVlc3Rpb246IG51bWJlcjtcbn1cbi8qKlxuICogQWxsb3dzIHNwZWNpZnlpbmcgdGhlIG1ldGFkYXRhIG9mIHRoZSB0ZXN0IGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIGxpbWl0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXI7XG59XG4vKipcbiAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuICBFcnJvciBmaWVsZHMgd2lsbCBiZSBgbnVsbGAgaWYgbm8gZXJyb3IgaGFzIG9jY3VycmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb2RlbEVycm9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxFcnJvciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuIFNhZmUgZm9yIHByb2dyYW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb2RlbEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogTW9kZWxFcnJvckVycm9yVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb2RlbEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb2RlbEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3QsIHRvIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZyBwdXJwb3Nlcy4gVGhpcyBmaWVsZCB3aWxsIGJlIG9taXR0ZWQgaW4gZXJyb3JzIHByb3ZpZGVkIGJ5IHdlYmhvb2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluIHRoZSBBc3NldHMgcHJvZHVjdCwgYSByZXF1ZXN0IGNhbiBwZXJ0YWluIHRvIG1vcmUgdGhhbiBvbmUgSXRlbS4gSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZm9yIHN1Y2ggYSByZXF1ZXN0LCBgY2F1c2VzYCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBlcnJvcnMgY29udGFpbmluZyBhIGJyZWFrZG93biBvZiB0aGVzZSBlcnJvcnMgb24gdGhlIGluZGl2aWR1YWwgSXRlbSBsZXZlbCwgaWYgYW55IGNhbiBiZSBpZGVudGlmaWVkLiAgYGNhdXNlc2Agd2lsbCBvbmx5IGJlIHByb3ZpZGVkIGZvciB0aGUgYGVycm9yX3R5cGVgIGBBU1NFVF9SRVBPUlRfRVJST1JgLlxuICAgICAqIEB0eXBlIHtBcnJheTxhbnk+fVxuICAgICAqIEBtZW1iZXJvZiBNb2RlbEVycm9yXG4gICAgICovXG4gICAgY2F1c2VzPzogQXJyYXk8YW55PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLiBUaGlzIHdpbGwgb25seSBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keSB3aGVuIHRoZSBlcnJvciBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB2aWEgYSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBkb2N1bWVudGF0aW9uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdWdnZXN0ZWQgc3RlcHMgZm9yIHJlc29sdmluZyB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb2RlbEVycm9yXG4gICAgICovXG4gICAgc3VnZ2VzdGVkX2FjdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBNb2RlbEVycm9yRXJyb3JUeXBlRW51bSB7XG4gICAgSW52YWxpZFJlcXVlc3QgPSAnSU5WQUxJRF9SRVFVRVNUJyxcbiAgICBJbnZhbGlkUmVzdWx0ID0gJ0lOVkFMSURfUkVTVUxUJyxcbiAgICBJbnZhbGlkSW5wdXQgPSAnSU5WQUxJRF9JTlBVVCcsXG4gICAgSW5zdGl0dXRpb25FcnJvciA9ICdJTlNUSVRVVElPTl9FUlJPUicsXG4gICAgUmF0ZUxpbWl0RXhjZWVkZWQgPSAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgQXBpRXJyb3IgPSAnQVBJX0VSUk9SJyxcbiAgICBJdGVtRXJyb3IgPSAnSVRFTV9FUlJPUicsXG4gICAgQXNzZXRSZXBvcnRFcnJvciA9ICdBU1NFVF9SRVBPUlRfRVJST1InLFxuICAgIFJlY2FwdGNoYUVycm9yID0gJ1JFQ0FQVENIQV9FUlJPUicsXG4gICAgT2F1dGhFcnJvciA9ICdPQVVUSF9FUlJPUicsXG4gICAgUGF5bWVudEVycm9yID0gJ1BBWU1FTlRfRVJST1InLFxuICAgIEJhbmtUcmFuc2ZlckVycm9yID0gJ0JBTktfVFJBTlNGRVJfRVJST1InXG59XG5cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGludGVyZXN0IHJhdGUgZm9yIHRoZSBtb3J0Z2FnZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGVyY2VudGFnZSB2YWx1ZSAoaW50ZXJlc3QgcmF0ZSBvZiBjdXJyZW50IG1vcnRnYWdlLCBub3QgQVBSKSBvZiBpbnRlcmVzdCBwYXlhYmxlIG9uIGEgbG9hbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICAgICAqL1xuICAgIHBlcmNlbnRhZ2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgaW50ZXJlc3QgY2hhcmdlZCAoZml4ZWQgb3IgdmFyaWFibGUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIG1vcnRnYWdlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCB0aGF0IHRoaXMgbGlhYmlsaXR5IGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBsb2FuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBvdXRzdGFuZGluZyBhbW91bnQgY2hhcmdlZCBmb3IgbGF0ZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgY3VycmVudF9sYXRlX2ZlZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgaGVsZCBpbiBlc2Nyb3cgdG8gcGF5IHRheGVzIGFuZCBpbnN1cmFuY2Ugb24gYmVoYWxmIG9mIHRoZSBib3Jyb3dlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGVzY3Jvd19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciBoYXMgcHJpdmF0ZSBtb3J0Z2FnZSBpbnN1cmFuY2UgaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wbWk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciB3aWxsIHBheSBhIHBlbmFsdHkgZm9yIGVhcmx5IHBheW9mZiBvZiBtb3J0Z2FnZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBoYXNfcHJlcGF5bWVudF9wZW5hbHR5OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9ydGdhZ2VJbnRlcmVzdFJhdGV9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaW50ZXJlc3RfcmF0ZTogTW9ydGdhZ2VJbnRlcmVzdFJhdGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGxvYW4sIGZvciBleGFtcGxlIGBjb252ZW50aW9uYWxgLCBgZml4ZWRgLCBvciBgdmFyaWFibGVgLiBUaGlzIGZpZWxkIGlzIHByb3ZpZGVkIGRpcmVjdGx5IGZyb20gdGhlIGxvYW4gc2VydmljZXIgYW5kIGRvZXMgbm90IGhhdmUgYW4gZW51bWVyYXRlZCBzZXQgb2YgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90eXBlX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZ1bGwgZHVyYXRpb24gb2YgbW9ydGdhZ2UgYXMgYXQgb3JpZ2luYXRpb24gKGUuZy4gYDEwIHllYXJgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxvYW5fdGVybTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPcmlnaW5hbCBkYXRlIG9uIHdoaWNoIG1vcnRnYWdlIGlzIGR1ZSBpbiBmdWxsLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG1hdHVyaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbmV4dCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9tb250aGx5X3BheW1lbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1ZSBkYXRlIGZvciB0aGUgbmV4dCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fcHJpbmNpcGFsX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbG9hbiAocHJpbmNpcGFsICsgaW50ZXJlc3QpIHBhc3QgZHVlIGZvciBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgcGFzdF9kdWVfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwcm9wZXJ0eV9hZGRyZXNzOiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfaW50ZXJlc3RfcGFpZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgWVREIHByaW5jaXBhbCBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgeXRkX3ByaW5jaXBhbF9wYWlkOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmaWVsZHMgZGVzY3JpYmluZyBwcm9wZXJ0eSBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpdmUgb3IgbmluZSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgKGV4YW1wbGUgXFxcIk5DXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgKGV4YW1wbGUgXFxcIjU2NCBNYWluIFN0cmVldCwgQXB0IDE1XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldCBwYXkgYW1vdW50IG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXRQYXkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxEaXN0cmlidXRpb25EZXRhaWxzPn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgZGlzdHJpYnV0aW9uX2RldGFpbHM/OiBBcnJheTxEaXN0cmlidXRpb25EZXRhaWxzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWx9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIHRvdGFsPzogVG90YWw7XG59XG4vKipcbiAqIEFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmllciBudW1iZXIgZGF0YSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdGVzdCBhY2NvdW50LiBBbGwgdmFsdWVzIGFyZSBvcHRpb25hbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgdXNlZCBmb3IgdGhlIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2hfd2lyZV9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgZWZ0X2JyYW5jaGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9pbnN0aXR1dGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFRlQgYnJhbmNoIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfaW5zdGl0dXRpb25gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnRfYnJhbmNoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJhbmsgaWRlbnRpZmllciBjb2RlIChCSUMpLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGludGVybmF0aW9uYWxfaWJhbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWxfYmljPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IG51bWJlciAoSUJBTikuIElmIG5vIGFjY291bnQgbnVtYmVyIGlzIHNwZWNpZmllZCB2aWEgYGFjY291bnRgLCB3aWxsIGFsc28gYmUgdXNlZCBhcyB0aGUgYWNjb3VudCBudW1iZXIgYnkgZGVmYXVsdC4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBpbnRlcm5hdGlvbmFsX2JpY2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWxfaWJhbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBCQUNTIHNvcnQgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzX3NvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVVMgYWNjb3VudCB2aWEgQUNIIG9yIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQUNIIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnQuICBOb3RlIHRoYXQgd2hlbiB1c2luZyBPQXV0aCB3aXRoIENoYXNlIEJhbmsgKGBpbnNfNTZgKSwgQ2hhc2Ugd2lsbCBpc3N1ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZXNlIHRva2VuaXplZCBudW1iZXJzIHNob3VsZCB3b3JrIGlkZW50aWNhbGx5IHRvIG5vcm1hbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZSBkaWdpdHMgcmV0dXJuZWQgaW4gdGhlIG1hc2sgZmllbGQgd2lsbCBjb250aW51ZSB0byByZWZsZWN0IHRoZSBhY3R1YWwgYWNjb3VudCBudW1iZXIsIHJhdGhlciB0aGFuIHRoZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXIuIElmIGEgdXNlciByZXZva2VzIHRoZWlyIHBlcm1pc3Npb25zIHRvIHlvdXIgYXBwLCB0aGUgdG9rZW5pemVkIG51bWJlcnMgd2lsbCBjb250aW51ZSB0byB3b3JrIGZvciBBQ0ggZGVwb3NpdHMsIGJ1dCBub3Qgd2l0aGRyYXdhbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gSWYgdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfNTZgLCB0aGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBhY2NvdW50YCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudCwgaWYgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0hOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0hOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnQuICBOb3RlIHRoYXQgd2hlbiB1c2luZyBPQXV0aCB3aXRoIENoYXNlIEJhbmsgKGBpbnNfNTZgKSwgQ2hhc2Ugd2lsbCBpc3N1ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZXNlIHRva2VuaXplZCBudW1iZXJzIHNob3VsZCB3b3JrIGlkZW50aWNhbGx5IHRvIG5vcm1hbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIFRoZSBkaWdpdHMgcmV0dXJuZWQgaW4gdGhlIG1hc2sgZmllbGQgd2lsbCBjb250aW51ZSB0byByZWZsZWN0IHRoZSBhY3R1YWwgYWNjb3VudCBudW1iZXIsIHJhdGhlciB0aGFuIHRoZSB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXIuIElmIGEgdXNlciByZXZva2VzIHRoZWlyIHBlcm1pc3Npb25zIHRvIHlvdXIgYXBwLCB0aGUgdG9rZW5pemVkIG51bWJlcnMgd2lsbCBjb250aW51ZSB0byB3b3JrIGZvciBBQ0ggZGVwb3NpdHMsIGJ1dCBub3Qgd2l0aGRyYXdhbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBJZiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc181NmAsIHRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGFjY291bnRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHJvdXRpbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQsIGlmIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCQUNTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNCQUNTIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIHNvcnQgY29kZSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIHNvcnQgY29kZSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgc29ydF9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIENhbmFkaWFuIGJhbmsgYWNjb3VudCB2aWEgRUZULlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzRUZUXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0VGVCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGluc3RpdHV0aW9uIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGJyYW5jaCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGJyYW5jaDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0VGVE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0VGVE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGluc3RpdHV0aW9uIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYnJhbmNoIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBicmFuY2g6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYW5rIElkZW50aWZpZXIgQ29kZSAoQklDKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYW5rIElkZW50aWZpZXIgQ29kZSAoQklDKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIGBpbnZlc3RtZW50OmAgSW52ZXN0bWVudCBhY2NvdW50ICBgY3JlZGl0OmAgQ3JlZGl0IGNhcmQgIGBkZXBvc2l0b3J5OmAgRGVwb3NpdG9yeSBhY2NvdW50ICBgbG9hbjpgIExvYW4gYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogRGF0YSB0byB1c2UgdG8gc2V0IHZhbHVlcyBvZiB0ZXN0IGFjY291bnRzLiBTb21lIHZhbHVlcyBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgYW5kIHdpbGwgaW5zdGVhZCB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSBvdGhlciB0ZXN0IGRhdGEgaW4gb3JkZXIgdG8gYWNoaWV2ZSBtb3JlIGNvbnNpc3RlbnQsIHJlYWxpc3RpYyB0ZXN0IGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVycmlkZUFjY291bnRzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3ZlcnJpZGVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHR5cGU6IE92ZXJyaWRlQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIHN0YXJ0IHdpdGggdGhpcyBhbW91bnQgYXMgdGhlIGN1cnJlbnQgYmFsYW5jZS4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBhbHdheXMgaGF2ZSB0aGlzIGFtb3VudCBhcyBpdHMgIGF2YWlsYWJsZSBiYWxhbmNlLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQgYmFsYW5jZSBvciBjaGFuZ2VzIGluIHRyYW5zYWN0aW9ucyBvdmVyIHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGZvcmNlX2F2YWlsYWJsZV9iYWxhbmNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSVNPLTQyMTcgY3VycmVuY3kgY29kZS4gSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgYmUgZGVub21pbmF0ZWQgaW4gdGhlIGdpdmVuIGN1cnJlbmN5LiBUcmFuc2FjdGlvbnMgd2lsbCBhbHNvIGJlIGluIHRoaXMgY3VycmVuY3kgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG1ldGE6IE1ldGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb25PdmVycmlkZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvbGRpbmdzT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBob2xkaW5ncz86IEhvbGRpbmdzT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9ucz86IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpZGVudGl0eTogT3duZXJPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBsaWFiaWxpdHk6IExpYWJpbGl0eU92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmZsb3dNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGluZmxvd19tb2RlbDogSW5mbG93TW9kZWw7XG59XG4vKipcbiAqIERhdGEgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gT25seSB0aGUgYG5hbWVzYCBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3duZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGVzZSBzaG91bGQgYWx3YXlzIGJlIHRoZSBuYW1lcyBvZiBpbmRpdmlkdWFscywgZXZlbiBmb3IgYnVzaW5lc3MgYWNjb3VudHMuIElmIHRoZSBuYW1lIG9mIGEgYnVzaW5lc3MgaXMgcmVwb3J0ZWQsIHBsZWFzZSBjb250YWN0IFBsYWlkIFN1cHBvcnQuIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gQW55IGZpZWxkcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZGVmYXVsdCBTYW5kYm94IGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lck92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJPdmVycmlkZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGVzZSBzaG91bGQgYWx3YXlzIGJlIHRoZSBuYW1lcyBvZiBpbmRpdmlkdWFscywgZXZlbiBmb3IgYnVzaW5lc3MgYWNjb3VudHMuIE5vdGUgdGhhdCB0aGUgc2FtZSBuYW1lIGRhdGEgd2lsbCBiZSB1c2VkIGZvciBhbGwgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PFBob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxFbWFpbD47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgdmFyaW91cyBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHVkZW50XFwncyBlbGlnaWJpbGl0eSBpbiB0aGUgUHVibGljIFNlcnZpY2UgTG9hbiBGb3JnaXZlbmVzcyBwcm9ncmFtLiBUaGlzIGlzIG9ubHkgcmV0dXJuZWQgaWYgdGhlIGluc3RpdHV0aW9uIGlzIEZlZGxvYW4gKGBpbnNfMTE2NTI3YCkuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQU0xGU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUFNMRlN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVzdGltYXRlZCBkYXRlIGJvcnJvd2VyIHdpbGwgaGF2ZSBjb21wbGV0ZWQgMTIwIHF1YWxpZnlpbmcgbW9udGhseSBwYXltZW50cy4gUmV0dXJuZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgZXN0aW1hdGVkX2VsaWdpYmlsaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUFNMRlN0YXR1c1xuICAgICAqL1xuICAgIHBheW1lbnRzX21hZGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBxdWFsaWZ5aW5nIHBheW1lbnRzIHJlbWFpbmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfcmVtYWluaW5nOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbW9uZXRhcnkgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgbnVtZXJpY2FsIGFtb3VudCBvZiBhIHNwZWNpZmljIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3VycmVuY3kgY29kZSwgZS5nLiBVU0RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlGcmVxdWVuY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlGcmVxdWVuY3kge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5RnJlcXVlbmN5XG4gICAgICovXG4gICAgdmFsdWU6IFBheUZyZXF1ZW5jeVZhbHVlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5RnJlcXVlbmN5VmFsdWVFbnVtIHtcbiAgICBNb250aGx5ID0gJ21vbnRobHknLFxuICAgIFNlbWltb250aGx5ID0gJ3NlbWltb250aGx5JyxcbiAgICBXZWVrbHkgPSAnd2Vla2x5JyxcbiAgICBCaXdlZWtseSA9ICdiaXdlZWtseScsXG4gICAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIHN0YXJ0IGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXguXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXQgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwYXltZW50LiBGb3Igc3RhbmRpbmcgb3JkZXJzLCBgXFxcIkdCUFxcXCJgIG11c3QgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50XG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRBbW91bnRDdXJyZW5jeUVudW0ge1xuICAgIEdicCA9ICdHQlAnLFxuICAgIEV1ciA9ICdFVVInXG59XG5cbi8qKlxuICogVGhlIG9wdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIHBheW1lbnQgcmVjaXBpZW50LiBUaGlzIG9iamVjdCBpcyBub3QgY3VycmVudGx5IHJlcXVpcmVkIHRvIG1ha2UgcGF5bWVudHMgZnJvbSBVSyBpbnN0aXR1dGlvbnMgYW5kIHNob3VsZCBub3QgYmUgcG9wdWxhdGVkLCB0aG91Z2ggbWF5IGJlIG5lY2Vzc2FyeSBmb3IgZnV0dXJlIEV1cm9wZWFuIGV4cGFuc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBsZW5ndGggMS0yIHJlcHJlc2VudGluZyB0aGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDcwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgMzUgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAxNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyB3aGF0IHNwZWNpZmljIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMgd2hlbiBtYWtpbmcgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnRzIGZyb20gYSBkaWZmZXJlbnQgY291bnRyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX2ludGVybmF0aW9uYWxfcGF5bWVudHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBtYXBwaW5nIG9mIGN1cnJlbmN5IHRvIG1heGltdW0gcGF5bWVudCBhbW91bnQgKGRlbm9taW5hdGVkIGluIHRoZSBzbWFsbGVzdCB1bml0IG9mIGN1cnJlbmN5KSBzdXBwb3J0ZWQgYnkgdGhlIGluc2l0dXRpb24uICBFeGFtcGxlOiBge1xcXCJHQlBcXFwiOiBcXFwiMTAwMDBcXFwifWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4aW11bV9wYXltZW50X2Ftb3VudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHJldHVybmluZyByZWZ1bmQgZGV0YWlscyB3aGVuIGluaXRpYXRpbmcgYSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfcmVmdW5kX2RldGFpbHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhbmRpbmdfb3JkZXJfbWV0YWRhdGE6IFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIHBheW1lbnQuICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBhbGwgcGF5bWVudHMuIEl0IGluZGljYXRlcyB0aGF0IHRoZSBwYXltZW50IGlzIHdhaXRpbmcgb24gdXNlciBpbnB1dCB0byBjb250aW51ZSBwcm9jZXNzaW5nLiBBIHBheW1lbnQgbWF5IHJlLWVudGVyIHRoaXMgc3RhdGUgbGF0ZXIgb24gaWYgZnVydGhlciBpbnB1dCBpcyBuZWVkZWQuICBgUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBwYXltZW50IHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiAgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQgYW5kIGlzIGNvbnNpZGVyZWQgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy4gIGBQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFNgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuICBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCB0byBiZSBpbml0aWF0ZWQuIFRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlIG9uY2UgdGhlIHJvb3QgY2F1c2UgaXMgcmVzb2x2ZWQuICBgUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIGJsb2NrZWQuIFRoaXMgaXMgYSByZXRyeWFibGUgZXJyb3IuICBgUEFZTUVOVF9TVEFUVVNfVU5LTk9XTmA6IFRoZSBwYXltZW50IHN0YXR1cyBpcyB1bmtub3duLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBiYWNzOiBTZW5kZXJCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgc2VuZGVyLCBpZiBzcGVjaWZpZWQgaW4gdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgYWNjb3VudCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBFTUkgYWNjb3VudCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBlbWlfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzRW51bSB7XG4gICAgSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTklUSUFURUQnLFxuICAgIENvbXBsZXRlZCA9ICdQQVlNRU5UX1NUQVRVU19DT01QTEVURUQnLFxuICAgIEluc3VmZmljaWVudEZ1bmRzID0gJ1BBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EUycsXG4gICAgRmFpbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0ZBSUxFRCcsXG4gICAgQmxvY2tlZCA9ICdQQVlNRU5UX1NUQVRVU19CTE9DS0VEJyxcbiAgICBVbmtub3duID0gJ1BBWU1FTlRfU1RBVFVTX1VOS05PV04nXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgKHNpbmNlIG5vdCBhbGwgaW5zdGl0dXRpb25zIHN1cHBvcnQgdGhlbSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGb3IgYSBwYXltZW50IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQsIHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIHZhbHVlOiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoZSBpbml0aWFsIHBoYXNlIG9mIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VTdGF0dXNFbnVtIHtcbiAgICBQYXltZW50U3RhdHVzSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJ1xufVxuXG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcmV0dXJuZWQgZnJvbSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBwYXltZW50LiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgYWxsIHBheW1lbnRzLiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGF5bWVudCBpcyB3YWl0aW5nIG9uIHVzZXIgaW5wdXQgdG8gY29udGludWUgcHJvY2Vzc2luZy4gQSBwYXltZW50IG1heSByZS1lbnRlciB0aGlzIHN0YXRlIGxhdGVyIG9uIGlmIGZ1cnRoZXIgaW5wdXQgaXMgbmVlZGVkLiAgYFBBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkIGFuZCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlLiAgYFBBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRGA6IEluZGljYXRlcyB0aGF0IHRoZSBzdGFuZGluZyBvcmRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIGZvciBzdGFuZGluZyBvcmRlcnMuICBgUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFBBWU1FTlRfU1RBVFVTX0ZBSUxFRGA6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgdG8gYmUgaW5pdGlhdGVkLiBUaGlzIGVycm9yIGlzIHJldHJ5YWJsZSBvbmNlIHRoZSByb290IGNhdXNlIGlzIHJlc29sdmVkLiAgYFBBWU1FTlRfU1RBVFVTX0JMT0NLRURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBibG9ja2VkLiBUaGlzIGlzIGEgcmV0cnlhYmxlIGVycm9yLiAgYFBBWU1FTlRfU1RBVFVTX1VOS05PV05gOiBUaGUgcGF5bWVudCBzdGF0dXMgaXMgdW5rbm93bi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX3VwZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFjczogU2VuZGVyQkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHNlbmRlciwgaWYgc3BlY2lmaWVkIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgYWNjb3VudCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBFTUkgYWNjb3VudCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtaV9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VTdGF0dXNFbnVtIHtcbiAgICBJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lORycsXG4gICAgSW5pdGlhdGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRCcsXG4gICAgQ29tcGxldGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRCcsXG4gICAgSW5zdWZmaWNpZW50RnVuZHMgPSAnUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTJyxcbiAgICBGYWlsZWQgPSAnUEFZTUVOVF9TVEFUVVNfRkFJTEVEJyxcbiAgICBCbG9ja2VkID0gJ1BBWU1FTlRfU1RBVFVTX0JMT0NLRUQnLFxuICAgIFVua25vd24gPSAnUEFZTUVOVF9TVEFUVVNfVU5LTk9XTidcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGF5bWVudHMgdG8gcmV0dXJuLiBJZiBgY291bnRgIGlzIG5vdCBzcGVjaWZpZWQsIGEgbWF4aW11bSBvZiAxMCBwYXltZW50cyB3aWxsIGJlIHJldHVybmVkLCBiZWdpbm5pbmcgd2l0aCB0aGUgbW9zdCByZWNlbnQgcGF5bWVudCBiZWZvcmUgdGhlIGN1cnNvciAoaWYgc3BlY2lmaWVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gXFxcIjIwMTktMTItMDZUMjI6MzU6NDlaXFxcIikuIE9ubHkgcGF5bWVudHMgY3JlYXRlZCBiZWZvcmUgdGhlIGN1cnNvciB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYGNsaWVudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUGF5bWVudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblBheW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSB0aGF0LCB3aGVuIHVzZWQgYXMgdGhlIG9wdGlvbmFsIGBjdXJzb3JgIHBhcmFtZXRlciB0byBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgLCB3aWxsIHJldHVybiB0aGUgbmV4dCB1bnJldHVybmVkIHBheW1lbnQgYXMgaXRzIGZpcnN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcmV0dXJuZWQgZnJvbSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIGBwYXltZW50X3Rva2VuYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIHRoZSBwYXltZW50IGluaXRpYXRpb24gZmxvd1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIHRva2VuIHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuIEEgYHBheW1lbnRfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgMTUgbWludXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF90b2tlbl9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiByZWNpcGllbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIHJlY2lwaWVudCB0aGF0IHRoaXMgcmVjaXBpZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIEVNSSByZWNpcGllbnQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBlbWlfcmVjaXBpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC4gSWYgQkFDUyBkYXRhIGlzIG5vdCBwcm92aWRlZCwgYW4gSUJBTiBpcyByZXF1aXJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSByZWNpcGllbnQgdGhhdCB0aGlzIHJlY2lwaWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBFTUkgcmVjaXBpZW50IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWlfcmVjaXBpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IHJlY2lwaWVudHMgY3JlYXRlZCBmb3IgUGF5bWVudCBJbml0aWF0aW9uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB2YWxpZCBQYXltZW50IEluaXRpYXRpb24gc3RhbmRpbmcgb3JkZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIGNsb3NlZC1lbmRlZCBzdGFuZGluZyBvcmRlcnMgYnkgcHJvdmlkaW5nIGFuIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX2VuZF9kYXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGBNT05USExZYCBzdGFuZGluZyBvcmRlcnMuIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBuZWdhdGl2ZSBpbnRlZ2VycyAoLTEgdG8gLTUpIGZvciBzZXR0aW5nIHVwIGEgYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX25lZ2F0aXZlX2V4ZWN1dGlvbl9kYXlzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgdmFsaWQgc3RhbmRpbmcgb3JkZXIgaW50ZXJ2YWxzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICB2YWxpZF9zdGFuZGluZ19vcmRlcl9pbnRlcnZhbHM6IEFycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gaW50ZXItYmFuayB0cmFuc2ZlcnMuIElmIHRoZSB0cmFuc2FjdGlvbiB3YXMgbm90IGFuIGludGVyLWJhbmsgdHJhbnNmZXIsIGFsbCBmaWVsZHMgd2lsbCBiZSBgbnVsbGAuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoZSBgcGF5bWVudF9tZXRhYCBrZXkgd2lsbCBhbHdheXMgYXBwZWFyLCBidXQgbm8gZGF0YSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudE1ldGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50TWV0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSBudW1iZXIgc3VwcGxpZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBQUEQgSUQgZm9yIHRoZSBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBwZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNmZXJzLCB0aGUgcGFydHkgdGhhdCBpcyByZWNlaXZpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnR5IGluaXRpYXRpbmcgYSB3aXJlIHRyYW5zZmVyLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGEgd2lyZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIGJ5X29yZGVyX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHBheWluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0cmFuc2ZlciwgZS5nLiBcXCdBQ0hcXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0aG9kOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXltZW50IHByb2Nlc3NvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9jZXNzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlYXNvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBpbnRlcnZhbCBvZiB0aGUgcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTY2hlZHVsZUludGVydmFsIHtcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBoYXMgY2hhbmdlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfSU5JVElBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVlNRU5UX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIGZvciB0aGUgcGF5bWVudCBiZWluZyB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyBzdGF0dXMgb2YgdGhlIHBheW1lbnQuICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBhbGwgcGF5bWVudHMuIEl0IGluZGljYXRlcyB0aGF0IHRoZSBwYXltZW50IGlzIHdhaXRpbmcgb24gdXNlciBpbnB1dCB0byBjb250aW51ZSBwcm9jZXNzaW5nLiBBIHBheW1lbnQgbWF5IHJlLWVudGVyIHRoaXMgc3RhdGUgbGF0ZXIgb24gaWYgZnVydGhlciBpbnB1dCBpcyBuZWVkZWQuICBgUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBwYXltZW50IHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiAgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQgYW5kIGlzIGNvbnNpZGVyZWQgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy4gIGBQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFNgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuICBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCB0byBiZSBpbml0aWF0ZWQuIFRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlIG9uY2UgdGhlIHJvb3QgY2F1c2UgaXMgcmVzb2x2ZWQuICBgUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIGJsb2NrZWQuIFRoaXMgaXMgYSByZXRyeWFibGUgZXJyb3IuICBgUEFZTUVOVF9TVEFUVVNfVU5LTk9XTmA6IFRoZSBwYXltZW50IHN0YXR1cyBpcyB1bmtub3duLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3BheW1lbnRfc3RhdHVzOiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va05ld1BheW1lbnRTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmV2aW91cyBzdGF0dXMgb2YgdGhlIHBheW1lbnQuICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBhbGwgcGF5bWVudHMuIEl0IGluZGljYXRlcyB0aGF0IHRoZSBwYXltZW50IGlzIHdhaXRpbmcgb24gdXNlciBpbnB1dCB0byBjb250aW51ZSBwcm9jZXNzaW5nLiBBIHBheW1lbnQgbWF5IHJlLWVudGVyIHRoaXMgc3RhdGUgbGF0ZXIgb24gaWYgZnVydGhlciBpbnB1dCBpcyBuZWVkZWQuICBgUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBwYXltZW50IHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiAgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWF0ZWQgYW5kIGlzIGNvbnNpZGVyZWQgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy4gIGBQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFNgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuICBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCB0byBiZSBpbml0aWF0ZWQuIFRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlIG9uY2UgdGhlIHJvb3QgY2F1c2UgaXMgcmVzb2x2ZWQuICBgUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIGJsb2NrZWQuIFRoaXMgaXMgYSByZXRyeWFibGUgZXJyb3IuICBgUEFZTUVOVF9TVEFUVVNfVU5LTk9XTmA6IFRoZSBwYXltZW50IHN0YXR1cyBpcyB1bmtub3duLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb2xkX3BheW1lbnRfc3RhdHVzOiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va09sZFBheW1lbnRTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHdoZW4gY3JlYXRpbmcgdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9yZWZlcmVuY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGBzdGFydF9kYXRlYCBwcm92aWRlZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIGEgc3RhbmRpbmcgb3JkZXIuIElmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYWxfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCBvciBpZiB0aGUgcGF5bWVudCBpcyBub3QgYSBzdGFuZGluZyBvcmRlciwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgdXBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rTmV3UGF5bWVudFN0YXR1c0VudW0ge1xuICAgIElucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCcsXG4gICAgUHJvY2Vzc2luZyA9ICdQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HJyxcbiAgICBJbml0aWF0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEJyxcbiAgICBJbnN1ZmZpY2llbnRGdW5kcyA9ICdQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFMnLFxuICAgIEZhaWxlZCA9ICdQQVlNRU5UX1NUQVRVU19GQUlMRUQnLFxuICAgIEJsb2NrZWQgPSAnUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRCcsXG4gICAgVW5rbm93biA9ICdQQVlNRU5UX1NUQVRVU19VTktOT1dOJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va09sZFBheW1lbnRTdGF0dXNFbnVtIHtcbiAgICBJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lORycsXG4gICAgSW5pdGlhdGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRCcsXG4gICAgQ29tcGxldGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRCcsXG4gICAgSW5zdWZmaWNpZW50RnVuZHMgPSAnUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTJyxcbiAgICBGYWlsZWQgPSAnUEFZTUVOVF9TVEFUVVNfRkFJTEVEJyxcbiAgICBCbG9ja2VkID0gJ1BBWU1FTlRfU1RBVFVTX0JMT0NLRUQnLFxuICAgIFVua25vd24gPSAnUEFZTUVOVF9TVEFUVVNfVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIGVuZCB1c2VyXFwncyBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zPzogRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZG9jX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVhcm5pbmdzPzogRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBQYXlzdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50RGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfZGV0YWlscz86IEVtcGxveW1lbnREZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXRQYXl9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBuZXRfcGF5PzogTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlQZXJpb2REZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIHBheXN0dWJfZGV0YWlscz86IFBheXN0dWJEZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgaW5jb21lX2JyZWFrZG93bjogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YllURERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICB5dGRfZWFybmluZ3M6IFBheXN0dWJZVEREZXRhaWxzO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3RlZCBzdHJlZXQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RyZWV0IGFkZHJlc3MgbGluZSAxLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgbGluZTE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGxpbmUyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdGF0ZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uLCBhcyBwcm92aWRlZCBvbiB0aGUgcGF5c3R1Yi4gRm9yIGV4YW1wbGU6IGBcXFwiNDAxKGspXFxcImAsIGBcXFwiRklDQSBNRUQgVEFYXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBkZWR1Y3Rpb24gaXMgcHJlLXRheDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICBpc19wcmV0YXg6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGV0YWlscyB0aGF0IGNhbiBiZSBmb3VuZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQmVnaW5uaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmRpbmcgZGF0ZSBvZiB0aGUgcGF5IHBlcmlvZCBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2VuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQYXkgZGF0ZSBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgdGhhdCBnZW5lcmF0ZWQgdGhlIHBheXN0dWIsIGUuZy4gQURQXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlzdHViX3Byb3ZpZGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIHRoZSBlbXBsb3llZSBpcyBwYWlkLiBQb3NzaWJsZSB2YWx1ZXM6IGBNT05USExZYCwgYEJJLVdFRUtMWWAsIGBXRUVLTFlgLCBgU0VNSS1NT05USExZYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlzdHViRGV0YWlsc1BheUZyZXF1ZW5jeUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5c3R1YkRldGFpbHNQYXlGcmVxdWVuY3lFbnVtIHtcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEJpV2Vla2x5ID0gJ0JJLVdFRUtMWScsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSS1NT05USExZJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJBZGRyZXNzO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIGluY29tZSBlYXJuZWQgeWVhciB0byBkYXRlLCBhcyBiYXNlZCBvbiBwYXlzdHViIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJZVEREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YllURERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBncm9zcyBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgbmV0ICh0YWtlIGhvbWUpIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgbmV0X2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVt4oCZcyBhY2Nlc3MgY29uc2VudCBpcyBleHBpcmluZyBpbiA3IGRheXMuIFNvbWUgSXRlbXMgaGF2ZSBleHBsaWNpdCBleHBpcmF0aW9uIHRpbWVzIGFuZCB3ZSB0cnkgdG8gcmVsYXkgdGhpcyB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBzZXJ2aWNlIGRpc3J1cHRpb24uIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQRU5ESU5HX0VYUElSQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgSXRlbVxcJ3MgYWNjZXNzIGNvbnNlbnQgd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcGhvbmUgbnVtYmVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBob25lTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICBkYXRhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHBob25lIG51bWJlciBhcyB0aGUgcHJpbWFyeSBudW1iZXIgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IFBob25lTnVtYmVyVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGhvbmVOdW1iZXJUeXBlRW51bSB7XG4gICAgSG9tZSA9ICdob21lJyxcbiAgICBXb3JrID0gJ3dvcmsnLFxuICAgIE9mZmljZSA9ICdvZmZpY2UnLFxuICAgIE1vYmlsZSA9ICdtb2JpbGUnLFxuICAgIE1vYmlsZTEgPSAnbW9iaWxlMScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQcm9jZXNzb3JOdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbn1cbi8qKlxuICogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBiYW5rIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgYmFuayB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBiYW5rIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCDigJMgc2hvdWxkIGJlIHNldCB0byBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgZGVzY3JpcHRpb24uIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogQW4gYXJiaXRyYXJ5IHN0cmluZyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGZvciBzdG9yYWdlIHdpdGggdGhlIGJhbmsgdHJhbnNmZXIuIE1heSBiZSB1cCB0byAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tX3RhZz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogLSBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIC0gT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIC0gTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgLSBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyAtIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudElkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudElkZW50aXR5O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpZGVudGlmeWluZyBudW1iZXJzIHVzZWQgZm9yIG1ha2luZyBlbGVjdHJvbmljIHRyYW5zZmVycyB0byBhbmQgZnJvbSB0aGUgYGFjY291bnRgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSB0aGUgYGFjY291bnRgIGZvciB3aGljaCBhdXRoIGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkLCBhIG51bGwgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yTnVtYmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0FDSE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBhY2g/OiBOdW1iZXJzQUNITnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzRUZUTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGVmdD86IE51bWJlcnNFRlROdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw/OiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0JBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgYmFjcz86IE51bWJlcnNCQUNTTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgaW4gTGlua1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNlbnQgdG8gU3RyaXBlIGZvciB1c2UgaW4gbWFraW5nIEFQSSBjYWxscyB0byBQbGFpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmlwZV9iYW5rX2FjY291bnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB5b3UgYXJlIGludGVncmF0aW5nIHdpdGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yOiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFByb2Nlc3NvckVudW0ge1xuICAgIEFjaHEgPSAnYWNocScsXG4gICAgQWxwYWNhID0gJ2FscGFjYScsXG4gICAgQXN0cmEgPSAnYXN0cmEnLFxuICAgIENoZWNrID0gJ2NoZWNrJyxcbiAgICBDaGVja2Jvb2sgPSAnY2hlY2tib29rJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBEcml2ZXdlYWx0aCA9ICdkcml2ZXdlYWx0aCcsXG4gICAgRHdvbGxhID0gJ2R3b2xsYScsXG4gICAgR2FsaWxlbyA9ICdnYWxpbGVvJyxcbiAgICBMaXRoaWMgPSAnbGl0aGljJyxcbiAgICBNb2Rlcm5UcmVhc3VyeSA9ICdtb2Rlcm5fdHJlYXN1cnknLFxuICAgIE1vb3YgPSAnbW9vdicsXG4gICAgT2Nyb2x1cyA9ICdvY3JvbHVzJyxcbiAgICBQcmltZVRydXN0ID0gJ3ByaW1lX3RydXN0JyxcbiAgICBSaXplID0gJ3JpemUnLFxuICAgIFNpbGFNb25leSA9ICdzaWxhX21vbmV5JyxcbiAgICBTYnZBcGkgPSAnc2J2X2FwaScsXG4gICAgVHJlYXN1cnlQcmltZSA9ICd0cmVhc3VyeV9wcmltZScsXG4gICAgVW5pdCA9ICd1bml0JyxcbiAgICBWZXN0YSA9ICd2ZXN0YScsXG4gICAgVm9wYXkgPSAndm9wYXknLFxuICAgIFd5cmUgPSAnd3lyZSdcbn1cblxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vY3JlYXRlYCBhbmQgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9jZXNzb3JfdG9rZW5gIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBieSB0aGUgUGxhaWQgcGFydG5lciB0byBtYWtlIEFQSSByZXF1ZXN0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHByb2R1Y3QgYWNjZXNzIGJlaW5nIHJlcXVlc3RlZC4gVXNlZCB0byBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBhY3Jvc3MgYWxsIGFjY291bnRzLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYWxsIHByb2R1Y3RzIGFsbG93ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0QWNjZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gc3RhdGVtZW50cy4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gdGhlIElkZW50aXR5IHByb2R1Y3QgKG5hbWUsIGVtYWlsLCBwaG9uZSwgYWRkcmVzcykuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBhY2NvdW50IG51bWJlciBkZXRhaWxzLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0cmFuc2FjdGlvbiBkZXRhaWxzLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXR1cyBoZWFsdGggb2YgYSByZXF1ZXN0IHR5cGUuIEF1dGggcmVxdWVzdHMsIEJhbGFuY2UgcmVxdWVzdHMsIElkZW50aXR5IHJlcXVlc3RzLCBJbnZlc3RtZW50cyByZXF1ZXN0cywgTGlhYmlsaXRpZXMgcmVxdWVzdHMsIFRyYW5zYWN0aW9ucyB1cGRhdGVzLCBJbnZlc3RtZW50cyB1cGRhdGVzLCBMaWFiaWxpdGllcyB1cGRhdGVzLCBhbmQgSXRlbSBsb2dpbnMgZWFjaCBoYXZlIHRoZWlyIG93biBzdGF0dXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYEhFQUxUSFlgOiB0aGUgbWFqb3JpdHkgb2YgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERFR1JBREVEYDogb25seSBzb21lIHJlcXVlc3RzIGFyZSBzdWNjZXNzZnVsIGBET1dOYDogYWxsIHJlcXVlc3RzIGFyZSBmYWlsaW5nXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIHN0YXR1czogUHJvZHVjdFN0YXR1c1N0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0dGVkIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdGF0dXMgY2hhbmdlIGZvciB0aGUgaW5zdGl0dXRpb24uIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c19jaGFuZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c0JyZWFrZG93bn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogUHJvZHVjdFN0YXR1c0JyZWFrZG93bjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzU3RhdHVzRW51bSB7XG4gICAgSGVhbHRoeSA9ICdIRUFMVEhZJyxcbiAgICBEZWdyYWRlZCA9ICdERUdSQURFRCcsXG4gICAgRG93biA9ICdET1dOJ1xufVxuXG4vKipcbiAqIEEgZGV0YWlsZWQgYnJlYWtkb3duIG9mIHRoZSBpbnN0aXR1dGlvblxcJ3MgcGVyZm9ybWFuY2UgZm9yIGEgcmVxdWVzdCB0eXBlLiBUaGUgdmFsdWVzIGZvciBgc3VjY2Vzc2AsIGBlcnJvcl9wbGFpZGAsIGFuZCBgZXJyb3JfaW5zdGl0dXRpb25gIHN1bSB0byAxLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93biB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgc3VjY2Vzc2Z1bCwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgc3VjY2VzczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpbnRlcm5hbCBQbGFpZCBpc3N1ZSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX3BsYWlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGlzc3VlIGluIHRoZSBpbnN0aXR1dGlvblxcJ3Mgc3lzdGVtLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9pbnN0aXR1dGlvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVmcmVzaF9pbnRlcnZhbGAgbWF5IGJlIGBERUxBWUVEYCBvciBgU1RPUFBFRGAgZXZlbiB3aGVuIHRoZSBzdWNjZXNzIHJhdGUgaXMgaGlnaC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHJldHVybmVkIGZvciBUcmFuc2FjdGlvbnMgc3RhdHVzIGJyZWFrZG93bnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHJlZnJlc2hfaW50ZXJ2YWw/OiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bSB7XG4gICAgTm9ybWFsID0gJ05PUk1BTCcsXG4gICAgRGVsYXllZCA9ICdERUxBWUVEJyxcbiAgICBTdG9wcGVkID0gJ1NUT1BQRUQnXG59XG5cbi8qKlxuICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgYW4gaW5zdGl0dXRpb24gY2FuIHN1cHBvcnQuIEFsbCBJdGVtcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYXQgbGVhc3Qgb25lIHByb2R1Y3QuIFRoZSBCYWxhbmNlIHByb2R1Y3QgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdHMge1xuICAgIEFzc2V0cyA9ICdhc3NldHMnLFxuICAgIEF1dGggPSAnYXV0aCcsXG4gICAgQmFsYW5jZSA9ICdiYWxhbmNlJyxcbiAgICBJZGVudGl0eSA9ICdpZGVudGl0eScsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIExpYWJpbGl0aWVzID0gJ2xpYWJpbGl0aWVzJyxcbiAgICBQYXltZW50SW5pdGlhdGlvbiA9ICdwYXltZW50X2luaXRpYXRpb24nLFxuICAgIFRyYW5zYWN0aW9ucyA9ICd0cmFuc2FjdGlvbnMnLFxuICAgIENyZWRpdERldGFpbHMgPSAnY3JlZGl0X2RldGFpbHMnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbiA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uJyxcbiAgICBEZXBvc2l0U3dpdGNoID0gJ2RlcG9zaXRfc3dpdGNoJyxcbiAgICBTdGFuZGluZ09yZGVycyA9ICdzdGFuZGluZ19vcmRlcnMnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogVGhlIHJlcXVlc3Qgd2FzIGZsYWdnZWQgYnkgUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSwgYW5kIHJlcXVpcmVzIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uIHRvIGVuc3VyZSB0aGV5IGFyZSBub3QgYSBib3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNhcHRjaGFSZXF1aXJlZEVycm9yIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBSRUNBUFRDSEFfRVJST1JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9SRVFVSVJFRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDQwMFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBodHRwX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byBzb2x2ZSBhIEdvb2dsZSByZUNBUFRDSEEgY2hhbGxlbmdlIGluIHRoZSBMaW5rIFJlY2FwdGNoYSBwYW5lLiBJZiB0aGV5IHNvbHZlIHRoZSBjaGFsbGVuZ2Ugc3VjY2Vzc2Z1bGx5LCB0aGUgdXNlclxcJ3MgcmVxdWVzdCBpcyByZXN1Ym1pdHRlZCBhbmQgdGhleSBhcmUgZGlyZWN0ZWQgdG8gdGhlIG5leHQgSXRlbSBjcmVhdGlvbiBzdGVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBsaW5rX3VzZXJfZXhwZXJpZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyBmcmF1ZCBzeXN0ZW0gZGV0ZWN0cyBhYnVzaXZlIHRyYWZmaWMgYW5kIGNvbnNpZGVycyBhIHZhcmlldHkgb2YgcGFyYW1ldGVycyB0aHJvdWdob3V0IEl0ZW0gY3JlYXRpb24gcmVxdWVzdHMuIFdoZW4gYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgcmlza3kgb3IgcG9zc2libHkgZnJhdWR1bGVudCwgTGluayBwcmVzZW50cyBhIHJlQ0FQVENIQSBmb3IgdGhlIHVzZXIgdG8gc29sdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGNvbW1vbl9jYXVzZXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaW5rIHdpbGwgYXV0b21hdGljYWxseSBndWlkZSB5b3VyIHVzZXIgdGhyb3VnaCByZUNBUFRDSEEgdmVyaWZpY2F0aW9uLiBBcyBhIGdlbmVyYWwgcnVsZSwgd2UgcmVjb21tZW5kIGluc3RydW1lbnRpbmcgYmFzaWMgZnJhdWQgbW9uaXRvcmluZyB0byBkZXRlY3QgYW5kIHByb3RlY3QgeW91ciB3ZWJzaXRlIGZyb20gc3BhbSBhbmQgYWJ1c2UuICBJZiB5b3VyIHVzZXIgY2Fubm90IHZlcmlmeSB0aGVpciBzZXNzaW9uLCBwbGVhc2Ugc3VibWl0IGEgU3VwcG9ydCB0aWNrZXQgd2l0aCB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzOiBgbGlua19zZXNzaW9uX2lkYCBvciBgcmVxdWVzdF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgdHJvdWJsZXNob290aW5nX3N0ZXBzOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgQkFDUyBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlLiBJZiBhbiBJQkFOIGlzIG5vdCBwcm92aWRlZCBvciBpZiB0aGlzIHJlY2lwaWVudCBuZWVkcyB0byBhY2NlcHQgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNpcGllbnRCQUNTIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNjb3BlIG9mIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBhY2NvdW50IGZlYXR1cmVzIG9yIGNvbnRlbnQgZnJvbSBhIENvbm5lY3RlZEFwcGxpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0ZWRTY29wZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0ZWRTY29wZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0QWNjZXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0ZWRTY29wZXNcbiAgICAgKi9cbiAgICByZXF1aXJlZF9wcm9kdWN0X2FjY2VzczogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgUmVxdWVzdGVkU2NvcGVzXG4gICAgICovXG4gICAgb3B0aW9uYWxfcHJvZHVjdF9hY2Nlc3M6IFByb2R1Y3RBY2Nlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIFJlcXVlc3RlZFNjb3Blc1xuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IEFjY291bnRGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTZWxlY3Rpb25DYXJkaW5hbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUmVxdWVzdGVkU2NvcGVzXG4gICAgICovXG4gICAgYWNjb3VudF9zZWxlY3Rpb25fY2FyZGluYWxpdHk6IEFjY291bnRTZWxlY3Rpb25DYXJkaW5hbGl0eTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgZmFpbGVkYCwgb3IgYHJldmVyc2VkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNmZXIgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHBlbmRpbmdgIC0tPiBgZmFpbGVkYCAgYHBlbmRpbmdgIC0tPiBgcG9zdGVkYCAgYHBvc3RlZGAgLS0+IGByZXZlcnNlZGAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogQmFua1RyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19ET0NVTUVOVF9SRUpFQ1RFRGA6IFRoZSBkb2N1bWVudGF0aW9uIHVwbG9hZGVkIGJ5IHRoZSBlbmQgdXNlciB3YXMgcmVjb2duaXplZCBhcyBhIHN1cHBvcnRlZCBmaWxlIGZvcm1hdCwgYnV0IG5vdCByZWNvZ25pemVkIGFzIGEgdmFsaWQgcGF5c3R1Yi4gIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfRkFJTEVEYDogQSBmYWlsdXJlIG9jY3VycmVkIHdoZW4gYXR0ZW1wdGluZyB0byBwcm9jZXNzIHRoZSB2ZXJpZmljYXRpb24gZG9jdW1lbnRhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIERvY3VtZW50UmVqZWN0ZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19ET0NVTUVOVF9SRUpFQ1RFRCcsXG4gICAgUHJvY2Vzc2luZ0ZhaWxlZCA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfRkFJTEVEJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIGB3ZWJob29rX2NvZGVgIGFyZSBzdXBwb3J0ZWQ6ICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RXZWJob29rQ29kZUVudW0ge1xuICAgIERlZmF1bHRVcGRhdGUgPSAnREVGQVVMVF9VUERBVEUnXG59XG5cbi8qKlxuICogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIGlzIGB0cnVlYCAgaWYgdGhlIHRlc3RgIHdlYmhvb2tfY29kZWAgIHdhcyBzdWNjZXNzZnVsbHkgZmlyZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2tfZmlyZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBjYWxsIHN1Y2NlZWRlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlc2V0X2xvZ2luOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IHdob3NlIHZlcmlmaWNhdGlvbiBzdGF0dXMgaXMgdG8gYmUgbW9kaWZpZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgdG8gc2V0IHRoZSBhY2NvdW50IHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnXG59XG5cbi8qKlxuICogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgc2FuZGJveC9vYXV0aC9zZWxlY3RfYWNjb3VudHNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgb2F1dGhfc3RhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIHNldCBvZiBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjb25maWd1cmluZyB0aGUgSXRlbS4gSWYgc3BlY2lmaWVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHByb2Nlc3NvciB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIGAvcHJvY2Vzc29yL2AgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSBJdGVtIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGluaXRpYWxseSBwdWxsIGZvciB0aGUgSXRlbS4gTWF5IGJlIGFueSBwcm9kdWN0cyB0aGF0IHRoZSBzcGVjaWZpZWQgYGluc3RpdHV0aW9uX2lkYCAgc3VwcG9ydHMuIFRoaXMgYXJyYXkgbWF5IG5vdCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5pdGlhbF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHdlYmhvb2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldyBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucztcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnMgaXMgYW4gb3B0aW9uYWwgc2V0IG9mIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbnMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgcmVjZW50IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHB1YmxpYyB0b2tlbiB0aGF0IGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGFjY2VzcyB0b2tlbiB1c2luZyBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBmYWlsZWRgLCBvciBgcmV2ZXJzZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldmVyc2VkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc2NvcGVzIG9iamVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY29wZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29wZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0QWNjZXNzfVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNcbiAgICAgKi9cbiAgICBwcm9kdWN0X2FjY2Vzcz86IFByb2R1Y3RBY2Nlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBY2Nlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEFjY291bnRBY2Nlc3M+O1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBuZXdseSBvcGVuZWQgYWNjb3VudHMgYXMgdGhleSBhcmUgb3BlbmVkLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNcbiAgICAgKi9cbiAgICBuZXdfYWNjb3VudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gaW5kaWNhdG9yIGZvciB3aGVuIHNjb3BlcyBhcmUgYmVpbmcgdXBkYXRlZC4gV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgdmlhIGVucm9sbG1lbnQgKGkuZS4gT0F1dGgpLCB0aGUgcGFydG5lciBtdXN0IHNlbmQgYEVOUk9MTE1FTlRgLiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCBpbiBhIHBvc3QtZW5yb2xsbWVudCB2aWV3LCB0aGUgcGFydG5lciBtdXN0IHNlbmQgYFBPUlRBTGAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTY29wZXNDb250ZXh0IHtcbiAgICBFbnJvbGxtZW50ID0gJ0VOUk9MTE1FTlQnLFxuICAgIFBvcnRhbCA9ICdQT1JUQUwnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0QWNjZXNzfVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIHByb2R1Y3RfYWNjZXNzPzogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFjY2Vzcz59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxBY2NvdW50QWNjZXNzPjtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gbmV3bHkgb3BlbmVkIGFjY291bnRzIGFzIHRoZXkgYXJlIG9wZW5lZC4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBuZXdfYWNjb3VudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIHNlY3VyaXR5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBQbGFpZC1zcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgc2VjdXJpdHksIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXRpZXMgd2l0aCBob2xkaW5ncy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgc2VjdXJpdHlfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNpbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY3VzaXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogNy1jaGFyYWN0ZXIgU0VET0wsIGFuIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gc2VjdXJpdGllcyBpbiB0aGUgVUsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWRvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGdpdmVuIHRvIHRoZSBzZWN1cml0eSBieSB0aGUgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZGAgaXMgcHJlc2VudCwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIFBsYWlkIGBpbnN0aXR1dGlvbl9pZGAgb2YgdGhlIGluc3RpdHV0aW9uIHRvIHdob20gdGhlIGlkZW50aWZpZXIgYmVsb25ncy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluIGNlcnRhaW4gY2FzZXMsIFBsYWlkIHdpbGwgcHJvdmlkZSB0aGUgSUQgb2YgYW5vdGhlciBzZWN1cml0eSB3aG9zZSBwZXJmb3JtYW5jZSByZXNlbWJsZXMgdGhpcyBzZWN1cml0eSwgdHlwaWNhbGx5IHdoZW4gdGhlIG9yaWdpbmFsIHNlY3VyaXR5IGhhcyBsb3cgdm9sdW1lLCBvciB3aGVuIGEgcHJpdmF0ZSBzZWN1cml0eSBjYW4gYmUgbW9kZWxlZCB3aXRoIGEgcHVibGljbHkgdHJhZGVkIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgcHJveHlfc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgc2VjdXJpdHksIHN1aXRhYmxlIGZvciBkaXNwbGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHnigJlzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdGllcywgYW5kIG90aGVyd2lzZSBhIHNob3J0IGlkZW50aWZpZXIgaWYgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCBhIHNlY3VyaXR5IGlzIGEgaGlnaGx5IGxpcXVpZCBhc3NldCBhbmQgY2FuIGJlIHRyZWF0ZWQgbGlrZSBjYXNoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGlzX2Nhc2hfZXF1aXZhbGVudDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcy4gIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzLiAgYG90aGVyYDogVW5rbm93biBvciBvdGhlciBpbnZlc3RtZW50IHR5cGVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaWNlIG9mIHRoZSBzZWN1cml0eSBhdCB0aGUgY2xvc2Ugb2YgdGhlIHByZXZpb3VzIHRyYWRpbmcgc2Vzc2lvbi4gYG51bGxgIGZvciBub24tcHVibGljIHNlY3VyaXRpZXMuIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgb3IgYSBjcnlwdG9jdXJyZW5jeSB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBkYWlseSBhbmQgd2lsbCBiZSBwcmljZWQgaW4gVVNELlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmeSB0aGUgc2VjdXJpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nIG9yIGludmVzdG1lbnQgdHJhbnNhY3Rpb24uIFdoZW4gaW5wdXR0aW5nIGN1c3RvbSBzZWN1cml0eSBkYXRhIHRvIHRoZSBTYW5kYm94LCBQbGFpZCB3aWxsIHBlcmZvcm0gcG9zdC1kYXRhLXJldHJpZXZhbCBub3JtYWxpemF0aW9uIGFuZCBlbnJpY2htZW50LiBUaGVzZSBwcm9jZXNzZXMgbWF5IGNhdXNlIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBTYW5kYm94IHRvIGJlIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBkYXRhIHlvdSBpbnB1dC4gQW4gSVNPLTQyMTcgY3VycmVuY3kgY29kZSBhbmQgYSBzZWN1cml0eSBpZGVudGlmaWVyIChgdGlja2VyX3N5bWJvbGAsIGBjdXNpcGAsIGBpc2luYCwgb3IgYHNlZG9sYCkgYXJlIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWN1cml0eU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogMTItY2hhcmFjdGVyIElTSU4sIGEgZ2xvYmFsbHkgdW5pcXVlIHNlY3VyaXRpZXMgaWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNpbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXNpcD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2Vkb2w/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgc2VjdXJpdHksIHN1aXRhYmxlIGZvciBkaXNwbGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbmRlckJBQ1NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRlckJBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VuZGVyQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIHN0dWRlbnQgbG9hbiBzZXJ2aWNlci4gVGhpcyBpcyBnZW5lcmFsbHkgdGhlIHJlbWl0dGFuY2UgYWRkcmVzcyB0byB3aGljaCBwYXltZW50cyBzaG91bGQgYmUgc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXJBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGRldmljZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgdGhhdCBpbml0aWF0ZWQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSB0aGF0IGluaXRpYXRlZCB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gXFxcIk1vemlsbGEvNS4wXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZXZpY2VcbiAgICAgKi9cbiAgICB1c2VyX2FnZW50Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGNvcmUgYXR0cmlidXRlcyBvYmplY3QgY29udGFpbnMgYWRkaXRpb25hbCBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXNzZXNzIHRoZSBBQ0ggcmV0dXJuIHJpc2ssIHN1Y2ggYXMgcGFzdCBBQ0ggcmV0dXJuIGV2ZW50cywgYmFsYW5jZS90cmFuc2FjdGlvbiBoaXN0b3J5LCB0aGUgSXRlbeKAmXMgY29ubmVjdGlvbiBoaXN0b3J5IGluIHRoZSBQbGFpZCBuZXR3b3JrLCBhbmQgaWRlbnRpdHkgY2hhbmdlIGhpc3RvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDcgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF83ZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX3NhdmluZ3Nfb3JfbW9uZXlfbWFya2V0X2FjY291bnQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIGFsbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIGFsbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5NXRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5NV9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5NXRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5NV9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHdpdGhpbiB0aGUgcGFzdCA5MCBkYXlzIHdoZW4gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgaGFkIGEgbmVnYXRpdmUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3dpdGhfbmVnYXRpdmVfYmFsYW5jZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAzMCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA5MF9lb2RfYmFsYW5jZV85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCAzMCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA2MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSAxMHRoIHBlcmNlbnRpbGUgb2YgdGhlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2Ugb3ZlciB0aGUgcGFzdCA5MCBkYXlzIG9mIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHAxMF9lb2RfYmFsYW5jZV85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEF2YWlsYWJsZSBiYWxhbmNlLCBhcyBvZiB0aGUgYGJhbGFuY2VfbGFzdF91cGRhdGVkYCB0aW1lLiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhdmFpbGFibGVfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ3VycmVudCBiYWxhbmNlLCBhcyBvZiB0aGUgYGJhbGFuY2VfbGFzdF91cGRhdGVkYCB0aW1lLiBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGN1cnJlbnRfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCBoYXMgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBiYWxhbmNlX2xhc3RfdXBkYXRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZHJlc3NfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgd2hvc2UgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB0byBiZSBtb2RpZmllZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBpcyB1c2VkIHRvIGNvcnJlbGF0ZSByZXF1ZXN0cyBieSBhIHVzZXIgd2l0aCBtdWx0aXBsZSBJdGVtcy4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxTY29yZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29yZXM6IFNpZ25hbFNjb3JlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvcmVfYXR0cmlidXRlczogU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcztcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcnNvbk5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHByZWZpeCAoZS5nLiBcXFwiTXIuXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgcHJlZml4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZ2l2ZW4gbmFtZS4gSWYgdGhlIHVzZXIgaGFzIGEgb25lLXdvcmQgbmFtZSwgaXQgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZhbWlseSBuYW1lIC8gc3VybmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgc3VmZml4IChlLmcuIFxcXCJJSVxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByZXR1cm4gY29kZSAoZS5nLiBcXFwiUjAxXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuX2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjb3Jlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjb3JlcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0N1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Jpc2s/OiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzaztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXIgaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gKGkuZS4sIHRoZSBhY2NvdW50IGhvbGRlcikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxVc2VyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGVyc29uTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBTaWduYWxQZXJzb25OYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTUxMjM0NTY3XFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogU2lnbmFsQWRkcmVzc0RhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZW1hIGJlbG93IGRlc2NyaWJlcyB0aGUgdmFyaW91cyBgdHlwZXNgIGFuZCBjb3JyZXNwb25kaW5nIGBzdWJ0eXBlc2AgdGhhdCBQbGFpZCByZWNvZ25pemVzIGFuZCByZXBvcnRzIGZvciBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVBY2NvdW50VHlwZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYWNjb3VudCB0eXBlIGhvbGRpbmcgY2FzaCwgaW4gd2hpY2ggZnVuZHMgYXJlIGRlcG9zaXRlZC4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgZGVwb3NpdG9yeWAgYWNjb3VudHMgYXJlOiBBdXRoLCBCYWxhbmNlLCBUcmFuc2FjdGlvbnMsIElkZW50aXR5LCBQYXltZW50IEluaXRpYXRpb24sIGFuZCBBc3NldHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY3JlZGl0IGNhcmQgdHlwZSBhY2NvdW50LiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBjcmVkaXRgIGFjY291bnRzIGFyZTogQmFsYW5jZSwgVHJhbnNhY3Rpb25zLCBJZGVudGl0eSwgYW5kIExpYWJpbGl0aWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGNyZWRpdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbG9hbiB0eXBlIGFjY291bnQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGxvYW5gIGFjY291bnRzIGFyZTogQmFsYW5jZSwgTGlhYmlsaXRpZXMsIGFuZCBUcmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgbG9hbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGludmVzdG1lbnQgYWNjb3VudC4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgaW52ZXN0bWVudGAgYWNjb3VudHMgYXJlOiBCYWxhbmNlIGFuZCBJbnZlc3RtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3RoZXIgb3IgdW5rbm93biBhY2NvdW50IHR5cGUuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYG90aGVyYCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIFRyYW5zYWN0aW9ucywgSWRlbnRpdHksIGFuZCBBc3NldHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgb3RoZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZvbGxvd2luZyBjdXJyZW5jeSBjb2RlcyBhcmUgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBzdXBwb3J0cyBhbGwgSVNPIDQyMTcgY3VycmVuY3kgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2Rlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIHZhbHVlcyBmb3IgaW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMuIE5vdGUgdGhhdCB0cmFuc2FjdGlvbnMgcmVwcmVzZW50aW5nIGluZmxvdyBvZiBjYXNoIHdpbGwgYXBwZWFyIGFzIG5lZ2F0aXZlIGFtb3VudHMsIG91dGZsb3cgb2YgY2FzaCB3aWxsIGFwcGVhciBhcyBwb3NpdGl2ZSBhbW91bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBCdXlpbmcgYW4gaW52ZXN0bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgYnV5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU2VsbGluZyBhbiBpbnZlc3RtZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBzZWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjYW5jZWxsYXRpb24gb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBjYW5jZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgY2FzaDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZlZXMgb24gdGhlIGFjY291bnQsIGUuZy4gY29tbWlzc2lvbiwgYm9va2tlZXBpbmcsIG9wdGlvbnMtcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGZlZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICB0cmFuc2Zlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc3R1ZGVudCBsb2FuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBsb2FuLiBGb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGJlIGEgbWFza2VkIHZlcnNpb24gb2YgdGhlIG51bWJlciAoZS5nLiwgdGhlIGxhc3QgNCBkaWdpdHMgaW5zdGVhZCBvZiB0aGUgZW50aXJlIG51bWJlcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXMgb24gd2hpY2ggbG9hbmVkIGZ1bmRzIHdlcmUgZGlzYnVyc2VkIG9yIHdpbGwgYmUgZGlzYnVyc2VkLiBUaGVzZSBhcmUgb2Z0ZW4gaW4gdGhlIHBhc3QuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGRpc2J1cnNlbWVudF9kYXRlczogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgc3R1ZGVudCBsb2FuIGlzIGV4cGVjdGVkIHRvIGJlIHBhaWQgb2ZmLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBleHBlY3RlZF9wYXlvZmZfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZ3VhcmFudG9yIG9mIHRoZSBzdHVkZW50IGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBndWFyYW50b3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZXN0IHJhdGUgb24gdGhlIGxvYW4gYXMgYSBwZXJjZW50YWdlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgaW50ZXJlc3RfcmF0ZV9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIGEgcGF5bWVudCBpcyBjdXJyZW50bHkgb3ZlcmR1ZS4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGxvYW4sIGUuZy4sIFxcXCJDb25zb2xpZGF0aW9uIExvYW5zXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zOiBTb21lIGluc3RpdHV0aW9ucyByZXF1aXJlIGEgbWluaW11bSBwYXltZW50IGFjcm9zcyBhbGwgbG9hbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgbnVtYmVyLiBPdXIgQVBJIHByZXNlbnRzIHRoYXQgc2FtZSBtaW5pbXVtIHBheW1lbnQgYW1vdW50IG9uIGVhY2ggbG9hbi4gVGhlIGluc3RpdHV0aW9ucyB0aGF0IGRvIHRoaXMgYXJlOiBHcmVhdCBMYWtlcyAoIGBpbnNfMTE2ODYxYCksIEZpcnN0bWFyayAoYGluc18xMTYyOTVgKSwgQ29tbW9uYm9uZCBGaXJzdG1hcmsgU2VydmljZXMgKGBpbnNfMTE2OTUwYCksIE5lbG5ldCAoYGluc18xMTY1MjhgKSwgRWRGaW5hbmNpYWwgU2VydmljZXMgKGBpbnNfMTE2MzA0YCksIEdyYW5pdGUgU3RhdGUgKGBpbnNfMTE2MzA4YCksIGFuZCBPa2xhaG9tYSBTdHVkZW50IExvYW4gQXV0aG9yaXR5IChgaW5zXzExNjk0NWApLiBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCApIHdpbGwgZGlzcGxheSBhcyAkMCBpZiB0aGVyZSBpcyBhbiBhdXRvcGF5IHByb2dyYW0gaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gQSBwYXltZW50IGlzIG5vdCBleHBlY3RlZCBpZiBgbG9hbl9zdGF0dXMudHlwZWAgaXMgYGRlZmVybWVudGAsIGBpbl9zY2hvb2xgLCBgY29uc29saWRhdGVkYCwgYHBhaWQgaW4gZnVsbGAsIG9yIGB0cmFuc2ZlcnJlZGAuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkb2xsYXIgYW1vdW50IG9mIHRoZSBhY2NydWVkIGludGVyZXN0IGJhbGFuY2UuIEZvciBTYWxsaWUgTWFlICggYGluc18xMTY5NDRgKSwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgbG9hbiwgc28gdGhpcyBmaWVsZCB3aWxsIHJldHVybiBhcyBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvdXRzdGFuZGluZ19pbnRlcmVzdF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IGFjY291bnQgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbG9hbiBmb3IgcGF5bWVudHMuIEluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgd2lsbCBtYXRjaCBhYGNjb3VudF9udW1iZXIsYCBidXQgaW4gc29tZSBpbnN0aXR1dGlvbnMsIHN1Y2ggYXMgR3JlYXQgTGFrZXMgKGBpbnNfMTE2ODYxYCksIGl0IHdpbGwgYmUgZGlmZmVyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHBzbGZfc3RhdHVzOiBQU0xGU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50UmVwYXltZW50UGxhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbjogU3R1ZGVudFJlcGF5bWVudFBsYW47XG4gICAgLyoqXG4gICAgICogVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgc3R1ZGVudCBsb2FuLiBIZWFydGxhbmQgRUNTSSAoYGluc18xMTY5NDhgKSBkb2VzIG5vdCBtYWtlIHRoaXMgZmllbGQgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VxdWVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlckFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHNlcnZpY2VyX2FkZHJlc3M6IFNlcnZpY2VyQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBpbnRlcmVzdCBwYWlkLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHl0ZF9pbnRlcmVzdF9wYWlkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIHRvIGRhdGUgKFlURCkgcHJpbmNpcGFsIHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX3ByaW5jaXBhbF9wYWlkOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBTdHVkZW50IGxvYW4gcmVwYXltZW50IGluZm9ybWF0aW9uIHVzZWQgdG8gY29uZmlndXJlIFNhbmRib3ggdGVzdCBkYXRhIGZvciB0aGUgTGlhYmlsaXRpZXMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyBgc3RhbmRhcmRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBiZWZvcmUgcmVwYXltZW50IHN0YXJ0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsXG4gICAgICovXG4gICAgbm9uX3JlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIG9mIHJlcGF5bWVudHMgYmVmb3JlIHRoZSBsb2FuIGlzIHBhaWQgb2ZmLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICByZXBheW1lbnRfbW9udGhzOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHVudGlsIHdoaWNoIHRoZSBsb2FuIHdpbGwgYmUgaW4gaXRzIGN1cnJlbnQgc3RhdHVzLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIHR5cGUgb2YgdGhlIHN0dWRlbnQgbG9hblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuU3RhdHVzXG4gICAgICovXG4gICAgdHlwZTogU3R1ZGVudExvYW5TdGF0dXNUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtIHtcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBDaGFyZ2VkT2ZmID0gJ2NoYXJnZWQgb2ZmJyxcbiAgICBDbGFpbSA9ICdjbGFpbScsXG4gICAgQ29uc29saWRhdGVkID0gJ2NvbnNvbGlkYXRlZCcsXG4gICAgRGVmZXJtZW50ID0gJ2RlZmVybWVudCcsXG4gICAgRGVsaW5xdWVudCA9ICdkZWxpbnF1ZW50JyxcbiAgICBEaXNjaGFyZ2VkID0gJ2Rpc2NoYXJnZWQnLFxuICAgIEV4dGVuc2lvbiA9ICdleHRlbnNpb24nLFxuICAgIEZvcmJlYXJhbmNlID0gJ2ZvcmJlYXJhbmNlJyxcbiAgICBJbkdyYWNlID0gJ2luIGdyYWNlJyxcbiAgICBJbk1pbGl0YXJ5ID0gJ2luIG1pbGl0YXJ5JyxcbiAgICBJblNjaG9vbCA9ICdpbiBzY2hvb2wnLFxuICAgIE5vdEZ1bGx5RGlzYnVyc2VkID0gJ25vdCBmdWxseSBkaXNidXJzZWQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYWlkSW5GdWxsID0gJ3BhaWQgaW4gZnVsbCcsXG4gICAgUmVmdW5kZWQgPSAncmVmdW5kZWQnLFxuICAgIFJlcGF5bWVudCA9ICdyZXBheW1lbnQnLFxuICAgIFRyYW5zZmVycmVkID0gJ3RyYW5zZmVycmVkJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcGF5bWVudCBwbGFuIGZvciB0aGUgc3R1ZGVudCBsb2FuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRSZXBheW1lbnRQbGFuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVwYXltZW50IHBsYW4gYXMgcHJvdmlkZWQgYnkgdGhlIHNlcnZpY2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRSZXBheW1lbnRQbGFuXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlcGF5bWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRSZXBheW1lbnRQbGFuXG4gICAgICovXG4gICAgdHlwZTogU3R1ZGVudFJlcGF5bWVudFBsYW5UeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtIHtcbiAgICBFeHRlbmRlZEdyYWR1YXRlZCA9ICdleHRlbmRlZCBncmFkdWF0ZWQnLFxuICAgIEV4dGVuZGVkU3RhbmRhcmQgPSAnZXh0ZW5kZWQgc3RhbmRhcmQnLFxuICAgIEdyYWR1YXRlZCA9ICdncmFkdWF0ZWQnLFxuICAgIEluY29tZUNvbnRpbmdlbnRSZXBheW1lbnQgPSAnaW5jb21lLWNvbnRpbmdlbnQgcmVwYXltZW50JyxcbiAgICBJbmNvbWVCYXNlZFJlcGF5bWVudCA9ICdpbmNvbWUtYmFzZWQgcmVwYXltZW50JyxcbiAgICBJbnRlcmVzdE9ubHkgPSAnaW50ZXJlc3Qtb25seScsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBheUFzWW91RWFybiA9ICdwYXkgYXMgeW91IGVhcm4nLFxuICAgIFJldmlzZWRQYXlBc1lvdUVhcm4gPSAncmV2aXNlZCBwYXkgYXMgeW91IGVhcm4nLFxuICAgIFN0YW5kYXJkID0gJ3N0YW5kYXJkJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheGZvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhmb3JtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0YXggZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4Zm9ybVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VzJ9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICB3Mj86IFcyO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRheHBheWVySUQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgSUQsIGUuZy4gXFwnU1NOXFwnXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExhc3QgNCBkaWdpdHMgb2YgdW5pcXVlIG51bWJlciBvZiBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICovXG4gICAgbGFzdF80X2RpZ2l0cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb25FbnVtO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKi9cbiAgICB5dGRfcGF5PzogUGF5O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb25FbnVtIHtcbiAgICBCb251cyA9ICdCb251cycsXG4gICAgQ29tbWlzc2lvbiA9ICdDb21taXNzaW9uJyxcbiAgICBPdmVydGltZSA9ICdPdmVydGltZScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUGFpZCBUaW1lIE9mZicsXG4gICAgUmVndWxhclBheSA9ICdSZWd1bGFyIFBheScsXG4gICAgVmFjYXRpb24gPSAnVmFjYXRpb24nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRW1wbG95ZWUgTWVkaWNhcmUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTb2NpYWwgU2VjdXJpdHkgRW1wbG95ZWUgVGF4JyxcbiAgICBNZWRpY2FsID0gJ01lZGljYWwnLFxuICAgIFZpc2lvbiA9ICdWaXNpb24nLFxuICAgIERlbnRhbCA9ICdEZW50YWwnXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy8jY2F0ZWdvcnktb3ZlcnZpZXcpLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzLyNjYXRlZ29yeS1vdmVydmlldykuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE6IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCBpcyBpbiBiZXRhIGFuZCB3aWxsIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBjbGllbnQgaXMgYm90aCBlbnJvbGxlZCBpbiB0aGUgY2xvc2VkIGJldGEgcHJvZ3JhbSBhbmQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFRyYW5zYWN0aW9uUGF5bWVudENoYW5uZWxFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIFVLIGluc3RpdHV0aW9ucy4gRm9yIGluc3RpdHV0aW9ucyBpbiBvdGhlciBjb3VudHJpZXMsIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIFVLIGluc3RpdHV0aW9ucy4gRm9yIGluc3RpdHV0aW9ucyBpbiBvdGhlciBjb3VudHJpZXMsIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvZGU6IFRyYW5zYWN0aW9uQ29kZSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgVUsgaW5zdGl0dXRpb25zLiBGb3IgaW5zdGl0dXRpb25zIGluIG90aGVyIGNvdW50cmllcywgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuICBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBVSyBpbnN0aXR1dGlvbnMuIEZvciBpbnN0aXR1dGlvbnMgaW4gb3RoZXIgY291bnRyaWVzLCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQWxsT2ZQYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSB0cmFuc2FjdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkJhc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHBvc3RlZCB0cmFuc2FjdGlvblxcJ3MgYXNzb2NpYXRlZCBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBTZWUgW0NhdGVnb3JpZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvI2NhdGVnb3J5LW92ZXJ2aWV3KS4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzLyNjYXRlZ29yeS1vdmVydmlldykuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgaXMgaW4gYmV0YSBhbmQgd2lsbCBiZSBvbWl0dGVkIHVubGVzcyB0aGUgY2xpZW50IGlzIGJvdGggZW5yb2xsZWQgaW4gdGhlIGNsb3NlZCBiZXRhIHByb2dyYW0gYW5kIGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIG9yaWdpbmFsX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bSB7XG4gICAgRGlnaXRhbCA9ICdkaWdpdGFsJyxcbiAgICBQbGFjZSA9ICdwbGFjZScsXG4gICAgU3BlY2lhbCA9ICdzcGVjaWFsJyxcbiAgICBVbnJlc29sdmVkID0gJ3VucmVzb2x2ZWQnXG59XG5cbi8qKlxuICogQW4gaWRlbnRpZmllciBjbGFzc2lmeWluZyB0aGUgdHJhbnNhY3Rpb24gdHlwZS4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIEV1cm9wZWFuIGluc3RpdHV0aW9ucy4gRm9yIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgYW5kIENhbmFkYSwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gYG51bGxgLiAgYGFkanVzdG1lbnQ6YCBCYW5rIGFkanVzdG1lbnQgIGBhdG06YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCB2aWEgYW4gYXV0b21hdGVkIHRlbGxlciBtYWNoaW5lICBgYmFuayBjaGFyZ2U6YCBDaGFyZ2Ugb3IgZmVlIGxldmllZCBieSB0aGUgaW5zdGl0dXRpb24gIGBiaWxsIHBheW1lbnRgOiBQYXltZW50IG9mIGEgYmlsbCAgYGNhc2g6YCBDYXNoIGRlcG9zaXQgb3Igd2l0aGRyYXdhbCAgYGNhc2hiYWNrOmAgQ2FzaCB3aXRoZHJhd2FsIHdoaWxlIG1ha2luZyBhIGRlYml0IGNhcmQgcHVyY2hhc2UgIGBjaGVxdWU6YCBEb2N1bWVudCBvcmRlcmluZyB0aGUgcGF5bWVudCBvZiBtb25leSB0byBhbm90aGVyIHBlcnNvbiBvciBvcmdhbml6YXRpb24gIGBkaXJlY3QgZGViaXQ6YCBBdXRvbWF0aWMgd2l0aGRyYXdhbCBvZiBmdW5kcyBpbml0aWF0ZWQgYnkgYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGBpbnRlcmVzdDpgIEludGVyZXN0IGVhcm5lZCBvciBpbmN1cnJlZCAgYHB1cmNoYXNlOmAgUHVyY2hhc2UgbWFkZSB3aXRoIGEgZGViaXQgb3IgY3JlZGl0IGNhcmQgIGBzdGFuZGluZyBvcmRlcjpgIFBheW1lbnQgaW5zdHJ1Y3RlZCBieSB0aGUgYWNjb3VudCBob2xkZXIgdG8gYSB0aGlyZCBwYXJ0eSBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwgIGB0cmFuc2ZlcjpgIFRyYW5zZmVyIG9mIG1vbmV5IGJldHdlZW4gYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uQ29kZSB7XG4gICAgQWRqdXN0bWVudCA9ICdhZGp1c3RtZW50JyxcbiAgICBBdG0gPSAnYXRtJyxcbiAgICBCYW5rQ2hhcmdlID0gJ2JhbmsgY2hhcmdlJyxcbiAgICBCaWxsUGF5bWVudCA9ICdiaWxsIHBheW1lbnQnLFxuICAgIENhc2ggPSAnY2FzaCcsXG4gICAgQ2FzaGJhY2sgPSAnY2FzaGJhY2snLFxuICAgIENoZXF1ZSA9ICdjaGVxdWUnLFxuICAgIERpcmVjdERlYml0ID0gJ2RpcmVjdCBkZWJpdCcsXG4gICAgSW50ZXJlc3QgPSAnaW50ZXJlc3QnLFxuICAgIFB1cmNoYXNlID0gJ3B1cmNoYXNlJyxcbiAgICBTdGFuZGluZ09yZGVyID0gJ3N0YW5kaW5nIG9yZGVyJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXRjaGVkIGRpcmVjdCBkZXBvc2l0IHRyYW5zYWN0aW9uIHVzZWQgdG8gdmVyaWZ5IGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25EYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25EYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlbmQgdXNlclxcJ3MgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgdG8gcG9wdWxhdGUgYXMgdGVzdCB0cmFuc2FjdGlvbiBkYXRhLiBJZiBub3Qgc3BlY2lmaWVkLCByYW5kb20gdHJhbnNhY3Rpb25zIHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbk92ZXJyaWRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIFRyYW5zYWN0aW9uIGRhdGVzIGluIHRoZSBwYXN0IG9yIHByZXNlbnQgd2lsbCByZXN1bHQgaW4gcG9zdGVkIHRyYW5zYWN0aW9uczsgdHJhbnNhY3Rpb24gZGF0ZXMgaW4gdGhlIGZ1dHVyZSB3aWxsIHJlc3VsdCBpbiBwZW5kaW5nIHRyYW5zYWN0aW9ucy4gVHJhbnNhY3Rpb25zIGluIFNhbmRib3ggd2lsbCBtb3ZlIGZyb20gcGVuZGluZyB0byBwb3N0ZWQgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBkYXRlIGhhcyBiZWVuIHJlYWNoZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZV9wb3N0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LiBDYW4gYmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgZm9ybWF0IGN1cnJlbmN5IGNvZGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgZmllbGQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gSWYgeW91IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgcGFyc2VkIGRhdGEgcHJvdmlkZWQsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgYGFjY291bnRzYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIHRyYW5zYWN0aW9ucyBhcmUgYmVpbmcgcmV0dXJuZWQuIEVhY2ggdHJhbnNhY3Rpb24gY2FuIGJlIG1hcHBlZCB0byBpdHMgY29ycmVzcG9uZGluZyBhY2NvdW50IHZpYSB0aGUgYGFjY291bnRfaWRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdHJhbnNhY3Rpb24ocykgZm9yIGFuIEl0ZW0gYXJlIGRlbGV0ZWQuIFRoZSBkZWxldGVkIHRyYW5zYWN0aW9uIElEcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHdlYmhvb2sgcGF5bG9hZC4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIGRlbGV0ZWQgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU19SRU1PVkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGB0cmFuc2FjdGlvbl9pZHNgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgcmVtb3ZlZF90cmFuc2FjdGlvbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIOKAnDEwLjAw4oCdKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXN0b20gdGFnIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgaW4gdGhlIGNyZWF0ZSByZXF1ZXN0LiBXaWxsIGJlIG51bGwgaWYgbm90IHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiAtIFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgLSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgLSBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyAtIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIC0gTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IFRyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVHJhbnNmZXJBdXRob3JpemF0aW9uIGNvbnRhaW5zIHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9uIGZvciBhIHByb3Bvc2VkIHRyYW5zZmVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgcmVwcmVzZW50aW5nIHdoZW4gdGhlIGF1dGhvcml6YXRpb24gd2FzIGNyZWF0ZWQsIGluIHRoZSBmb3JtYXQgXFxcIjIwMDYtMDEtMDJUMTU6MDQ6MDVaXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogIEEgZGVjaXNpb24gcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci4gIGBhcHByb3ZlZGAg4oCTIFRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgcmVjZWl2ZWQgdGhlIGVuZCB1c2VyXFwncyBjb25zZW50IGFuZCBoYXMgYmVlbiBhcHByb3ZlZCBmb3IgcHJvY2Vzc2luZy4gUGxhaWQgaGFzIGFsc28gcmV2aWV3ZWQgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGFuZCBoYXMgYXBwcm92ZWQgaXQgZm9yIHByb2Nlc3NpbmcuICAgYHBlcm1pdHRlZGAg4oCTIFBsYWlkIHdhcyB1bmFibGUgdG8gZmV0Y2ggdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGFwcHJvdmUgb3IgZGVjbGluZSB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuIFlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IGZ1cnRoZXIgcmV2aWV3IGlzIHJlY29tbWVuZGVkLiBQbGFpZCBpcyBhd2FpdGluZyBmdXJ0aGVyIGluc3RydWN0aW9ucyBmcm9tIHRoZSBjbGllbnQuICBgZGVjbGluZWRgIOKAkyBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25FbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIHByb3Bvc2VkX3RyYW5zZmVyOiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uRW51bSB7XG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIFBlcm1pdHRlZCA9ICdwZXJtaXR0ZWQnLFxuICAgIERlY2xpbmVkID0gJ2RlY2xpbmVkJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCDigJMgc2hvdWxkIGJlIHNldCB0byBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yaXphdGlvbiBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzczogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgYXV0aG9yaXphdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb247XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmF0aW9uYWxlIGZvciBQbGFpZFxcJ3MgZGVjaXNpb24gcmVnYXJkaW5nIGEgcHJvcG9zZWQgdHJhbnNmZXIuIFdpbGwgYmUgbnVsbCBmb3IgYGFwcHJvdmVkYCBkZWNpc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJhdGlvbmFsZSBmb3IgcGVybWl0dGluZyBvciBkZWNsaW5pbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYE5TRmAg4oCTIFRyYW5zYWN0aW9uIGxpa2VseSB0byByZXN1bHQgaW4gYSByZXR1cm4gZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBSSVNLYCAtIFRyYW5zYWN0aW9uIGlzIGhpZ2gtcmlzay4gIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCDigJMgSXRlbSBjcmVhdGVkIHZpYSBzYW1lLWRheSBtaWNybyBkZXBvc2l0cywgbGltaXRlZCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuIFBsYWlkIGNhbiBvbmx5IG9mZmVyIGBwZXJtaXR0ZWRgIGFzIGEgdHJhbnNhY3Rpb24gZGVjaXNpb24uICBgTE9HSU5fUkVRVUlSRURgIOKAkyBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBkdWUgdG8gSXRlbSBzdGFsZW5lc3MuIENhbiBiZSByZWN0aWZpZWQgdXNpbmcgTGluayB1cGRhdGUgbW9kZS4gIGBFUlJPUmAg4oCTIFVuYWJsZSB0byBjb2xsZWN0IHRoZSBhY2NvdW50IGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIGR1ZSB0byBhbiBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZUVudW07XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggYSBwZXJtaXR0ZWQgdHJhbnNmZXIgb3IgdHJhbnNmZXIgZGVjbGluZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlRW51bSB7XG4gICAgTnNmID0gJ05TRicsXG4gICAgUmlzayA9ICdSSVNLJyxcbiAgICBNYW51YWxseVZlcmlmaWVkSXRlbSA9ICdNQU5VQUxMWV9WRVJJRklFRF9JVEVNJyxcbiAgICBMb2dpblJlcXVpcmVkID0gJ0xPR0lOX1JFUVVJUkVEJyxcbiAgICBFcnJvciA9ICdFUlJPUidcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzczogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIOKAnDEwLjAw4oCdKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgdHJhbnNmZXIgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIOKAnDEwLjAw4oCdKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCDigJMgc2hvdWxkIGJlIHNldCB0byBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogQW4gYXJiaXRyYXJ5IHN0cmluZyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGZvciBzdG9yYWdlIHdpdGggdGhlIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tX3RhZz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogLSBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIC0gT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIC0gTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgLSBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyAtIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyB0cmFuc2Zlci4gSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBvcmlnaW5hdGlvbiBhY2NvdW50LCB0aGlzIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXI6IGBvdXRib3VuZGAgZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzLCBvciBgaW5ib3VuZGAgZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRGlyZWN0aW9uIHtcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC4gSURzIGFyZSBzZXF1ZW50aWFsIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZGlyZWN0aW9uOiBUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjZWl2ZXJEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgcmVjZWl2ZXJfZGV0YWlsczogVHJhbnNmZXJSZWNlaXZlckRldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZT86IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFRyYW5zZmVyVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGV2ZW50cyBieSBldmVudCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGVzPzogQXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXI6IGBvdXRib3VuZGA6IGZvciBBUEktaW5pdGlhdGVkIHRyYW5zZmVycyBgaW5ib3VuZGA6IGZvciBwYXltZW50cyByZWNlaXZlZCBieSB0aGUgRkJPIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0RGlyZWN0aW9uRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RUcmFuc2ZlclR5cGVFbnVtIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3REaXJlY3Rpb25FbnVtIHtcbiAgICBJbmJvdW5kID0gJ2luYm91bmQnLFxuICAgIE91dGJvdW5kID0gJ291dGJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9ldmVudHM6IEFycmF5PFRyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCB0aGlzIHRyYW5zZmVyIHJlcHJlc2VudHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZXZlcnNlZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXZlcnNlZC4gIGByZWNlaXZlcl9wZW5kaW5nYDogVGhlIG1hdGNoaW5nIHRyYW5zZmVyIHdhcyBmb3VuZCBhcyBhIHBlbmRpbmcgdHJhbnNhY3Rpb24gaW4gdGhlIHJlY2VpdmVyXFwncyBhY2NvdW50ICBgcmVjZWl2ZXJfcG9zdGVkYDogVGhlIG1hdGNoaW5nIHRyYW5zZmVyIHdhcyBmb3VuZCBhcyBhIHBvc3RlZCB0cmFuc2FjdGlvbiBpbiB0aGUgcmVjZWl2ZXJcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRXZlbnRUeXBlIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFJldmVyc2VkID0gJ3JldmVyc2VkJyxcbiAgICBSZWNlaXZlclBlbmRpbmcgPSAncmVjZWl2ZXJfcGVuZGluZycsXG4gICAgUmVjZWl2ZXJQb3N0ZWQgPSAncmVjZWl2ZXJfcG9zdGVkJ1xufVxuXG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgdHlwZSBvZiB0aGlzIHRyYW5zZmVyIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXZlcnNlZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldmVyc2VkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbQmFuayBUcmFuc2ZlcnMgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy9iYW5rLXRyYW5zZmVycy8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zZmVycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSBvcmlnaW5hdGVkIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyczogQXJyYXk8VHJhbnNmZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBWYWxpZCBvcHRpb25zIGFyZSBgYWNoYCBvciBgc2FtZS1kYXktYWNoYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnXG59XG5cbi8qKlxuICogVGhlIHJlY2VpdmVyIGRldGFpbHMgaWYgdGhlIHR5cGUgb2YgdGhpcyBldmVudCBpcyBgcmVjaWV2ZXJfcGVuZGluZ2Agb3IgYHJlY2lldmVyX3Bvc3RlZGAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjZWl2ZXJEZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2lnbiBvZiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgZm9yIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlciBldmVudCBhdCB0aGUgdGltZSB0aGUgbWF0Y2hpbmcgdHJhbnNhY3Rpb24gd2FzIGZvdW5kLiBDYW4gYmUgYHBvc2l0aXZlYCwgYG5lZ2F0aXZlYCwgb3IgbnVsbCBpZiB0aGUgYmFsYW5jZSB3YXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlOiBUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc0F2YWlsYWJsZUJhbGFuY2VFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyUmVjZWl2ZXJEZXRhaWxzQXZhaWxhYmxlQmFsYW5jZUVudW0ge1xuICAgIFBvc2l0aXZlID0gJ3Bvc2l0aXZlJyxcbiAgICBOZWdhdGl2ZSA9ICduZWdhdGl2ZScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDYWxpZm9ybmlhXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIChlLmcuLCBcXFwiVVNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIG9yIHByb3ZpbmNlIChlLmcuLCBcXFwiQ2FsaWZvcm5pYVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSAoZS5nLiwgXFxcIjk0MTAzXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIChlLmcuLCBcXFwiVVNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclVzZXJJblJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZSB8IG51bGw7XG59XG4vKipcbiAqIEN1c3RvbSB0ZXN0IGFjY291bnRzIGFyZSBjb25maWd1cmVkIHdpdGggYSBKU09OIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvcm11bGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzY2hlbWEgYmVsb3cuIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlBST0RVQ1RTX05PVF9TVVBQT1JURURcXFwiYCBgXFxcIlVTRVJfU0VUVVBfUkVRVUlSRURcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIGZvcmNlX2Vycm9yOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgIHdlYmhvb2sgaXMgZmlyZWQgdG8gd2hlbiBhbiBlbmQgdXNlciBoYXMgdXNlZCB0aGUgW215LnBsYWlkLmNvbSBwb3J0YWxdKGh0dHBzOi8vbXkucGxhaWQuY29tKSB0byByZXZva2UgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gT25jZSBhY2Nlc3MgdG8gYW4gSXRlbSBoYXMgYmVlbiByZXZva2VkLCBpdCBjYW5ub3QgYmUgcmVzdG9yZWQuIElmIHRoZSB1c2VyIHN1YnNlcXVlbnRseSByZXR1cm5zIHRvIHlvdXIgYXBwbGljYXRpb24sIGEgbmV3IEl0ZW0gbXVzdCBiZSBjcmVhdGVkIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2FzIG5vdCB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFmdGVyIHRlbiBkYXlzIHNpbmNlIHRoZSBhdXRvbWF0ZWQgbWljcm8tZGVwb3NpdCB3YXMgbWFkZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVkVSSUZJQ0FUSU9OX0VYUElSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2tcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcmlmaWNhdGlvbiByZWZyZXNoIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUNBVElPTl9SRUZSRVNIX1NUQVRVU19VU0VSX1BSRVNFTkNFX1JFUVVJUkVEXFxcImAgVXNlciBwcmVzZW5jZSBpcyByZXF1aXJlZCB0byByZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBWZXJpZmljYXRpb25SZWZyZXNoU3RhdHVzIHtcbiAgICBWZXJpZmljYXRpb25SZWZyZXNoU3RhdHVzVXNlclByZXNlbmNlUmVxdWlyZWQgPSAnVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRUQnXG59XG5cbi8qKlxuICogVGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJWRVJJRklFRFxcXCJgOiBUaGUgaW5mb3JtYXRpb24gd2FzIHN1Y2Nlc3NmdWxseSB2ZXJpZmllZC4gIGBcXFwiVU5WRVJJRklFRFxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIGhhcyBub3QgeWV0IGJlZW4gcGVyZm9ybWVkLiAgYFxcXCJORUVEU19JTkZPXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gd2FzIGF0dGVtcHRlZCBidXQgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gbWlzc2luZyBpbmZvcm1hdGlvbi4gIFxcXCJgVU5BQkxFX1RPX1ZFUklGWWBcXFwiOiBUaGUgdmVyaWZpY2F0aW9uIHdhcyBwZXJmb3JtZWQgYW5kIHRoZSBpbmZvcm1hdGlvbiBjb3VsZCBub3QgYmUgdmVyaWZpZWQuICBgXFxcIlVOS05PV05cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgaXMgdW5rbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgVmVyaWZpZWQgPSAnVkVSSUZJRUQnLFxuICAgIFVudmVyaWZpZWQgPSAnVU5WRVJJRklFRCcsXG4gICAgTmVlZHNJbmZvID0gJ05FRURTX0lORk8nLFxuICAgIFVuYWJsZVRvVmVyaWZ5ID0gJ1VOQUJMRV9UT19WRVJJRlknLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBXMiBpcyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIGluY29tZSBkYXRhIHRha2VuIGZyb20gYSBXMiB0YXggZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBQYXlzdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGVtcGxveWVlPzogRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCB5ZWFyIG9mIHRoZSBXMiBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHRheF95ZWFyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBlbXBsb3llZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb3IgRUlOLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHdhZ2VzX3RpcHNfb3RoZXJfY29tcD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gc29jaWFsIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgc2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIG1lZGljYXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfd2FnZXNfYW5kX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1lZGljYXJlIHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gc29jaWFsIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG9jYXRlZCB0aXBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYWxsb2NhdGVkX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENvbnRlbnRzIGZyb20gYm94IDkgb24gdGhlIFcyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94Xzk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZGVwZW5kZW50X2NhcmVfYmVuZWZpdHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5vbnF1YWxpZmllZCBwbGFucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG5vbnF1YWxpZmllZF9wbGFucz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFcyQm94MTI+fVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGJveF8xMj86IEFycmF5PFcyQm94MTI+O1xuICAgIC8qKlxuICAgICAqIFN0YXR1dG9yeSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgcmV0aXJlbWVudF9wbGFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlyZCBwYXJ0eSBzaWNrIHBheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3NpY2tfcGF5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPdGhlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIG90aGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+fVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHN0YXRlX2FuZF9sb2NhbF93YWdlcz86IEFycmF5PFcyU3RhdGVBbmRMb2NhbFdhZ2VzPjtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyQm94MTJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMkJveDEyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMkJveDEyXG4gICAgICovXG4gICAgY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVzIgQm94IDEyIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMkJveDEyXG4gICAgICovXG4gICAgYW1vdW50Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxpdHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhbiBBc3NldCBSZXBvcnQgdG8gYmUgcmV0dXJuZWQgd2l0aCBtaXNzaW5nIGFjY291bnQgb3duZXIgaW5mb3JtYXRpb24uIEluIHN1Y2ggY2FzZXMsIHRoZSBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FybmluZyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgdHlwZSwgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEFTU0VUX1JFUE9SVF9XQVJOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIEN1cnJlbnRseSwgdGhlIG9ubHkgcG9zc2libGUgd2FybmluZyBjb2RlIGlzIGBPV05FUlNfVU5BVkFJTEFCTEVgLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50LW93bmVyIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZTogV2FybmluZ1dhcm5pbmdDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F1c2V9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZTogQ2F1c2U7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FybmluZ1dhcm5pbmdDb2RlRW51bSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3Mgd2ViaG9vayBpcyB1cGRhdGVkLiBUaGlzIHdpbGwgYmUgc2VudCB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfd2ViaG9va191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgSUQgKCBga2lkYCApIGZyb20gdGhlIEpXVCBoZWFkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBrZXlfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtKV0tQdWJsaWNLZXl9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGtleTogSldLUHVibGljS2V5O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cblxuLyoqXG4gKiBQbGFpZEFwaSAtIGF4aW9zIHBhcmFtZXRlciBjcmVhdG9yXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQ6IGFzeW5jIChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FjY291bnRzQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzQmFsYW5jZUdldCcsICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JywgYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgICBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgYW55IGxpbmtlZCBJdGVtLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cywgaS5lLiBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCBiYWxhbmNlcyByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0OiBhc3luYyAoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYWNjb3VudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0dldCcsICdhY2NvdW50c0dldFJlcXVlc3QnLCBhY2NvdW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhY2NvdW50c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldDogYXN5bmMgKGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FwcGxpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXBwbGljYXRpb25HZXQnLCAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JywgYXBwbGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hcHBsaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUdldCcsICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmU6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNBc3NldHMtd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydENyZWF0ZScsICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXI6IGFzeW5jIChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0RmlsdGVyJywgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcsIGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiAgVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldDogYXN5bmMgKGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRHZXQnLCAnYXNzZXRSZXBvcnRHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQ6IGFzeW5jIChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UGRmR2V0JywgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlZnJlc2g6IGFzeW5jIChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UmVmcmVzaCcsICdhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZW1vdmU6IGFzeW5jIChhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UmVtb3ZlJywgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcsIGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgYXV0aGAgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgQWxzbyBub3RlIHRoYXQgYC9hdXRoL2dldGAgd2lsbCBub3QgcmV0dXJuIGRhdGEgZm9yIGFueSBuZXcgYWNjb3VudHMgb3BlbmVkIGFmdGVyIHRoZSBJdGVtIHdhcyBjcmVhdGVkLiBUbyBvYnRhaW4gZGF0YSBmb3IgbmV3IGFjY291bnRzLCBjcmVhdGUgYSBuZXcgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aEdldDogYXN5bmMgKGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aEdldCcsICdhdXRoR2V0UmVxdWVzdCcsIGF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0OiBhc3luYyAoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0JywgJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNhbmNlbDogYXN5bmMgKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQ2FuY2VsJywgJ2JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGU6IGFzeW5jIChiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNyZWF0ZScsICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0OiBhc3luYyAoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJFdmVudExpc3QnLCAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCBiYW5rIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmM6IGFzeW5jIChiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckV2ZW50U3luYycsICdiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JywgYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyR2V0OiBhc3luYyAoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJHZXQnLCAnYmFua1RyYW5zZmVyR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlckxpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2Zlckxpc3QnLCAnYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudDogYXN5bmMgKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQnLCAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwR2V0OiBhc3luYyAoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJTd2VlcEdldCcsICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBDYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldDogYXN5bmMgKGJvZHk6IG9iamVjdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdib2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXRlZ29yaWVzR2V0JywgJ2JvZHknLCBib2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jYXRlZ29yaWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChib2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBheW1lbnRUb2tlbjogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlYXRlUGF5bWVudFRva2VuJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB3aXRob3V0IHVzaW5nIFBsYWlkIEV4Y2hhbmdlXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZScsICdkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoR2V0OiBhc3luYyAoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoR2V0JywgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlOiBhc3luYyAoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUnLCAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWTigJlzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95ZXJzU2VhcmNoOiBhc3luYyAoZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3llcnNTZWFyY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdlbXBsb3llcnNTZWFyY2gnLCAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcsIGVtcGxveWVyc1NlYXJjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2VtcGxveWVycy9zZWFyY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5R2V0OiBhc3luYyAoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eUdldCcsICdpZGVudGl0eUdldFJlcXVlc3QnLCBpZGVudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGU6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIHBheXN0dWIgUERGIHRoYXQgdGhlIGVuZCB1c2VyIHVwbG9hZGVkIHZpYSBQYXlzdHViIEltcG9ydC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCB3aXRoIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZCcsICdpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gYSBzaW5nbGUgcGF5c3R1YiB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldCcsICdpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3JlZnJlc2hgIHJlZnJlc2hlcyBhIGdpdmVuIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2g6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblJlZnJlc2gnLCAnaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9zdW1tYXJ5L2dldGAgcmV0dXJucyBhIHZlcmlmaWNhdGlvbiBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHRoYXQgd2FzIHZlcmlmaWVkIGZvciBhbiBlbmQgdXNlci4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0JywgJ2luY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vc3VtbWFyeS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGF4Zm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncy4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldDogYXN5bmMgKGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zR2V0JywgJ2luc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zU2VhcmNoOiBhc3luYyAoaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNTZWFyY2gnLCAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcsIGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9zZWFyY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldDogYXN5bmMgKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQnLCAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGU6IGFzeW5jIChpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUnLCAnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QnLCBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3Q6IGFzeW5jIChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BcHBsaWNhdGlvbkxpc3QnLCAnaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUnLCAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbjogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUNyZWF0ZVB1YmxpY1Rva2VuJywgJ2l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1HZXQ6IGFzeW5jIChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1HZXQnLCAnaXRlbUdldFJlcXVlc3QnLCBpdGVtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgUGxhaWQgbmF0aXZlIGFjY291bnQgSUQgZm9yIHRoZSBhY2NvdW50IHRoZSB1c2VyIHdpbGwgc3dpdGNoIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIChgdGFyZ2V0X2FjY291bnRfaWRgKS5cbiAgICAgICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtSW1wb3J0OiBhc3luYyAoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1JbXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtSW1wb3J0JywgJ2l0ZW1JbXBvcnRSZXF1ZXN0JywgaXRlbUltcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vaW1wb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1JbXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtUHVibGljVG9rZW5FeGNoYW5nZScsICdpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QnLCBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gICBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgTm90ZSB0aGF0IGluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaXNzdWluZyBhbiBgL2l0ZW0vcmVtb3ZlYCAgcmVxdWVzdCB3aWxsIG5vdCBkZWNyZW1lbnQgeW91ciBsaXZlIGNyZWRlbnRpYWwgY291bnQuIFRvIGluY3JlYXNlIHlvdXIgY3JlZGVudGlhbCBhY2NvdW50IGluIERldmVsb3BtZW50LCBjb250YWN0IFN1cHBvcnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVJlbW92ZTogYXN5bmMgKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVJlbW92ZScsICdpdGVtUmVtb3ZlUmVxdWVzdCcsIGl0ZW1SZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcy8jaXRlbS13ZWJob29rLXVybC11cGRhdGVkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGU6IGFzeW5jIChpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1XZWJob29rVXBkYXRlJywgJ2l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCcsIGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaWFiaWxpdGllc0dldDogYXN5bmMgKGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlhYmlsaXRpZXNHZXQnLCAnbGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgbGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saWFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5DcmVhdGU6IGFzeW5jIChsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtUb2tlbkNyZWF0ZScsICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JywgbGlua1Rva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGluay90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHktY3JlYXRlZCBgbGlua190b2tlbmAgdXNpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50LiBJdCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldDogYXN5bmMgKGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua1Rva2VuR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua1Rva2VuR2V0JywgJ2xpbmtUb2tlbkdldFJlcXVlc3QnLCBsaW5rVG9rZW5HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL3Rva2VuL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIgb3IgR0JQLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgYW5kIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yaywgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgLyBFVVIuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKS4gIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3Q6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldDogYXN5bmMgKHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXV0aEdldCcsICdwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCcsIHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldDogYXN5bmMgKHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFsYW5jZUdldCcsICdwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCcsIHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlJywgJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldDogYXN5bmMgKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySWRlbnRpdHlHZXQnLCAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JywgcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEluY29tZUZpcmVXZWJob29rJywgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBDYWxsaW5nIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBUcmFuc2FjdGlvbnMgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbUZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbUZpcmVXZWJob29rJywgJ3NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW46IGFzeW5jIChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtUmVzZXRMb2dpbicsICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIE5vdGUgdGhhdCBub3QgYWxsIFBsYWlkIGRldmVsb3BlciBhY2NvdW50cyBhcmUgZW5hYmxlZCBmb3IgbWljcm8tZGVwb3NpdCBiYXNlZCB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdC4gWW91ciBhY2NvdW50IG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlIGluIG9yZGVyIHRvIHRlc3QgaXQgaW4gU2FuZGJveC4gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZXMgb3IgY2hlY2sgeW91ciBzdGF0dXMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgb3IgW3N1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIFN1cHBvcnQgdGlja2V0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcmVxdWVzdC1wcm9kdWN0LWFjY2VzcykuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1czogYXN5bmMgKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMnLCAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0Jywgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50czogYXN5bmMgKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdDogU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMnLCAnc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0Jywgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgICBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHVibGljVG9rZW5DcmVhdGUnLCAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLiBUaGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIGlmIGNhbGxlZCBhIHNlY29uZCB0aW1lIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGBpbml0aWF0ZWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRGVjaXNpb25SZXBvcnQ6IGFzeW5jIChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbERlY2lzaW9uUmVwb3J0JywgJ3NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcsIHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbEV2YWx1YXRlOiBhc3luYyAocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlcXVlc3RCb2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxFdmFsdWF0ZScsICdyZXF1ZXN0Qm9keScsIHJlcXVlc3RCb2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMjaW52ZXN0bWVudHMpIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjdHJhbnNhY3Rpb25zLWluaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1oaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQ6IGFzeW5jICh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0dldCcsICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGEgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI2RlbGV0ZWQtdHJhbnNhY3Rpb25zLWRldGVjdGVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAuICBBY2Nlc3MgdG8gYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaW4gUHJvZHVjdGlvbiBpcyBzcGVjaWZpYyB0byBjZXJ0YWluIHByaWNpbmcgcGxhbnMuIElmIHlvdSBjYW5ub3QgYWNjZXNzIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGluIFByb2R1Y3Rpb24sIFtjb250YWN0IFNhbGVzXShodHRwczovL3d3dy5wbGFpZC5jb20vY29udGFjdCkgZm9yIGFzc2lzdGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jICh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1JlZnJlc2gnLCAndHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdHJhbnNmZXIgZmFpbHVyZSByaXNrLiAgSW4gUGxhaWRcXCdzIHNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgZGVjbGluZWRfbnNmX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYGRlY2xpbmVkX3Jpc2tfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gcGVybWl0IGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gcGVybWl0IGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYExPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gIEFsbCB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbnMgb3RoZXIgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgd2lsbCByZXN1bHQgaW4gYSBkZWNpc2lvbiBvZiBwZXJtaXR0ZWQgYW5kIHJhdGlvbmFsZSBjb2RlIGBFUlJPUmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUnLCAndHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYW5jZWw6IGFzeW5jICh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FuY2VsJywgJ3RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNyZWF0ZScsICd0cmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdDogYXN5bmMgKHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJFdmVudExpc3QnLCAndHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JywgdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9ldmVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmM6IGFzeW5jICh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRTeW5jJywgJ3RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvc3luY2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckdldDogYXN5bmMgKHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJHZXQnLCAndHJhbnNmZXJHZXRSZXF1ZXN0JywgdHJhbnNmZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGlzdDogYXN5bmMgKHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMaXN0JywgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnLCB0cmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0OiBhc3luYyAod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0JywgJ3dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0Jywgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgUGxhaWRBcGlGcCA9IGZ1bmN0aW9uKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgY29uc3QgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvciA9IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgICBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgYW55IGxpbmtlZCBJdGVtLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cywgaS5lLiBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCBiYWxhbmNlcyByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNBc3NldHMtd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcykgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcykgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGF1dGhgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIEFsc28gbm90ZSB0aGF0IGAvYXV0aC9nZXRgIHdpbGwgbm90IHJldHVybiBkYXRhIGZvciBhbnkgbmV3IGFjY291bnRzIG9wZW5lZCBhZnRlciB0aGUgSXRlbSB3YXMgY3JlYXRlZC4gVG8gb2J0YWluIGRhdGEgZm9yIG5ldyBhY2NvdW50cywgY3JlYXRlIGEgbmV3IEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgYmFuayB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IENhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXRlZ29yaWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBwYXlzdHViIFBERiB0aGF0IHRoZSBlbmQgdXNlciB1cGxvYWRlZCB2aWEgUGF5c3R1YiBJbXBvcnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgd2l0aCB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIGEgc2luZ2xlIHBheXN0dWIgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoKGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaChpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9zdW1tYXJ5L2dldGAgcmV0dXJucyBhIHZlcmlmaWNhdGlvbiBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHRoYXQgd2FzIHZlcmlmaWVkIGZvciBhbiBlbmQgdXNlci4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0KGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldChpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRheGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgUGxhaWQgbmF0aXZlIGFjY291bnQgSUQgZm9yIHRoZSBhY2NvdW50IHRoZSB1c2VyIHdpbGwgc3dpdGNoIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIChgdGFyZ2V0X2FjY291bnRfaWRgKS5cbiAgICAgICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtSW1wb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgICBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MvI2l0ZW0td2ViaG9vay11cmwtdXBkYXRlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSIG9yIEdCUC4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIGFuZCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmssIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIC8gRVVSLiBGb3IgZGV0YWlscyBvbiBhbnkgcGF5bWVudCBsaW1pdHMgaW4gUHJvZHVjdGlvbiwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkuICBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gQ2FsbGluZyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgVHJhbnNhY3Rpb25zIGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIE5vdGUgdGhhdCBub3QgYWxsIFBsYWlkIGRldmVsb3BlciBhY2NvdW50cyBhcmUgZW5hYmxlZCBmb3IgbWljcm8tZGVwb3NpdCBiYXNlZCB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdC4gWW91ciBhY2NvdW50IG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlIGluIG9yZGVyIHRvIHRlc3QgaXQgaW4gU2FuZGJveC4gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZXMgb3IgY2hlY2sgeW91ciBzdGF0dXMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgb3IgW3N1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIFN1cHBvcnQgdGlja2V0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcmVxdWVzdC1wcm9kdWN0LWFjY2VzcykuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxvYmplY3Q+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC4gVGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciBpZiBjYWxsZWQgYSBzZWNvbmQgdGltZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIGZvciBgaW5pdGlhdGVkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cyNpbnZlc3RtZW50cykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjdHJhbnNhY3Rpb25zLWhpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjZGVsZXRlZC10cmFuc2FjdGlvbnMtZGV0ZWN0ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEFjY2VzcyB0byBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpbiBQcm9kdWN0aW9uIGlzIHNwZWNpZmljIHRvIGNlcnRhaW4gcHJpY2luZyBwbGFucy4gSWYgeW91IGNhbm5vdCBhY2Nlc3MgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaW4gUHJvZHVjdGlvbiwgW2NvbnRhY3QgU2FsZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9jb250YWN0KSBmb3IgYXNzaXN0YW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGRldGVybWluZSB0cmFuc2ZlciBmYWlsdXJlIHJpc2suICBJbiBQbGFpZFxcJ3Mgc2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGBkZWNsaW5lZF9uc2ZfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgZGVjbGluZWRfcmlza19nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgQWxsIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSB3aWxsIHJlc3VsdCBpbiBhIGRlY2lzaW9uIG9mIHBlcm1pdHRlZCBhbmQgcmF0aW9uYWxlIGNvZGUgYEVSUk9SYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgUGxhaWRBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFBsYWlkQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIGFueSBsaW5rZWQgSXRlbS4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMsIGkuZS4gYWNjb3VudHMgdGhhdCBhcmUgbm90IGNsb3NlZCBhbmQgYXJlIGNhcGFibGUgb2YgY2FycnlpbmcgYSBiYWxhbmNlLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgYmFsYW5jZXMgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFwcGxpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNBc3NldHMtd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiAgVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGF1dGhgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIEFsc28gbm90ZSB0aGF0IGAvYXV0aC9nZXRgIHdpbGwgbm90IHJldHVybiBkYXRhIGZvciBhbnkgbmV3IGFjY291bnRzIG9wZW5lZCBhZnRlciB0aGUgSXRlbSB3YXMgY3JlYXRlZC4gVG8gb2J0YWluIGRhdGEgZm9yIG5ldyBhY2NvdW50cywgY3JlYXRlIGEgbmV3IEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCBiYW5rIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBDYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWTigJlzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RW1wbG95ZXJzU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgaWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgcGF5c3R1YiBQREYgdGhhdCB0aGUgZW5kIHVzZXIgdXBsb2FkZWQgdmlhIFBheXN0dWIgSW1wb3J0LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZSBhdmFpbGFibGUgZm9yIGRvd25sb2FkIHdpdGggdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gYSBzaW5nbGUgcGF5c3R1YiB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaChpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoKGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3N1bW1hcnkvZ2V0YCByZXR1cm5zIGEgdmVyaWZpY2F0aW9uIHN1bW1hcnkgZm9yIHRoZSBpbmNvbWUgdGhhdCB3YXMgdmVyaWZpZWQgZm9yIGFuIGVuZCB1c2VyLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXQoaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldChpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRheGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBQbGFpZCBuYXRpdmUgYWNjb3VudCBJRCBmb3IgdGhlIGFjY291bnQgdGhlIHVzZXIgd2lsbCBzd2l0Y2ggdGhlaXIgZGlyZWN0IGRlcG9zaXQgdG8gKGB0YXJnZXRfYWNjb3VudF9pZGApLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcy8jaXRlbS13ZWJob29rLXVybC11cGRhdGVkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcmV2aW91c2x5LWNyZWF0ZWQgYGxpbmtfdG9rZW5gIHVzaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSIG9yIEdCUC4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIGFuZCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmssIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIC8gRVVSLiBGb3IgZGV0YWlscyBvbiBhbnkgcGF5bWVudCBsaW1pdHMgaW4gUHJvZHVjdGlvbiwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkuICBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nIG9yIHNhdmluZ3MgYWNjb3VudCB0aGF0XFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIENhbGxpbmcgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIFRyYW5zYWN0aW9ucyBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIE5vdGUgdGhhdCBub3QgYWxsIFBsYWlkIGRldmVsb3BlciBhY2NvdW50cyBhcmUgZW5hYmxlZCBmb3IgbWljcm8tZGVwb3NpdCBiYXNlZCB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdC4gWW91ciBhY2NvdW50IG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlIGluIG9yZGVyIHRvIHRlc3QgaXQgaW4gU2FuZGJveC4gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZXMgb3IgY2hlY2sgeW91ciBzdGF0dXMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgb3IgW3N1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIFN1cHBvcnQgdGlja2V0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcmVxdWVzdC1wcm9kdWN0LWFjY2VzcykuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8b2JqZWN0PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHJvY2Vzc29yX3Rva2VuYCBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElEIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHJvY2Vzc29yX3Rva2VuYCBjb3JyZXNwb25kcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiB1c2UgdGhpcyBgcHJvY2Vzc29yX3Rva2VuYCB3aXRoIHRoZSBgL3Byb2Nlc3Nvci9gIEFQSSBlbmRwb2ludHMgaW4gU2FuZGJveC4gWW91IGNhbiBhbHNvIHVzZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLiBUaGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIGlmIGNhbGxlZCBhIHNlY29uZCB0aW1lIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGBpbml0aWF0ZWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxFdmFsdWF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzI2ludmVzdG1lbnRzKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1pbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjZGVsZXRlZC10cmFuc2FjdGlvbnMtZGV0ZWN0ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEFjY2VzcyB0byBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpbiBQcm9kdWN0aW9uIGlzIHNwZWNpZmljIHRvIGNlcnRhaW4gcHJpY2luZyBwbGFucy4gSWYgeW91IGNhbm5vdCBhY2Nlc3MgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaW4gUHJvZHVjdGlvbiwgW2NvbnRhY3QgU2FsZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9jb250YWN0KSBmb3IgYXNzaXN0YW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdHJhbnNmZXIgZmFpbHVyZSByaXNrLiAgSW4gUGxhaWRcXCdzIHNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgZGVjbGluZWRfbnNmX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYGRlY2xpbmVkX3Jpc2tfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gcGVybWl0IGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gcGVybWl0IGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYExPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gIEFsbCB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbnMgb3RoZXIgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgd2lsbCByZXN1bHQgaW4gYSBkZWNpc2lvbiBvZiBwZXJtaXR0ZWQgYW5kIHJhdGlvbmFsZSBjb2RlIGBFUlJPUmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZVxuICogQGV4cG9ydFxuICogQGNsYXNzIFBsYWlkQXBpXG4gKiBAZXh0ZW5kcyB7QmFzZUFQSX1cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYWlkQXBpIGV4dGVuZHMgQmFzZUFQSSB7XG4gICAgLyoqXG4gICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgICBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgYW55IGxpbmtlZCBJdGVtLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cywgaS5lLiBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCBiYWxhbmNlcyByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNBc3NldHMtd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcykgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcykgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGF1dGhgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIEFsc28gbm90ZSB0aGF0IGAvYXV0aC9nZXRgIHdpbGwgbm90IHJldHVybiBkYXRhIGZvciBhbnkgbmV3IGFjY291bnRzIG9wZW5lZCBhZnRlciB0aGUgSXRlbSB3YXMgY3JlYXRlZC4gVG8gb2J0YWluIGRhdGEgZm9yIG5ldyBhY2NvdW50cywgY3JlYXRlIGEgbmV3IEl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCBiYW5rIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uXG4gICAgICogQHN1bW1hcnkgR2V0IENhdGVnb3JpZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNhdGVnb3JpZXNHZXQoYm9keTogb2JqZWN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB3aXRob3V0IHVzaW5nIFBsYWlkIEV4Y2hhbmdlXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB0b2tlblxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWTigJlzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIHBheXN0dWIgUERGIHRoYXQgdGhlIGVuZCB1c2VyIHVwbG9hZGVkIHZpYSBQYXlzdHViIEltcG9ydC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCB3aXRoIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gYSBzaW5nbGUgcGF5c3R1YiB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaChpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoKGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vc3VtbWFyeS9nZXRgIHJldHVybnMgYSB2ZXJpZmljYXRpb24gc3VtbWFyeSBmb3IgdGhlIGluY29tZSB0aGF0IHdhcyB2ZXJpZmllZCBmb3IgYW4gZW5kIHVzZXIuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXQoaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldChpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGF4Zm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncy4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvbuKAmXMgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnTigJlzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHB1YmxpYyB0b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUdldChpdGVtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgUGxhaWQgbmF0aXZlIGFjY291bnQgSUQgZm9yIHRoZSBhY2NvdW50IHRoZSB1c2VyIHdpbGwgc3dpdGNoIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIChgdGFyZ2V0X2FjY291bnRfaWRgKS5cbiAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcy8jaXRlbS13ZWJob29rLXVybC11cGRhdGVkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSB1cGRhdGUgbW9kZSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIGZsb3cuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHktY3JlYXRlZCBgbGlua190b2tlbmAgdXNpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50LiBJdCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSIG9yIEdCUC4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIGFuZCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmssIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIC8gRVVSLiBGb3IgZGV0YWlscyBvbiBhbnkgcGF5bWVudCBsaW1pdHMgaW4gUHJvZHVjdGlvbiwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKS4gIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nIG9yIHNhdmluZ3MgYWNjb3VudCB0aGF0XFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gQ2FsbGluZyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgVHJhbnNhY3Rpb25zIGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LlxuICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIE5vdGUgdGhhdCBub3QgYWxsIFBsYWlkIGRldmVsb3BlciBhY2NvdW50cyBhcmUgZW5hYmxlZCBmb3IgbWljcm8tZGVwb3NpdCBiYXNlZCB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdC4gWW91ciBhY2NvdW50IG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlIGluIG9yZGVyIHRvIHRlc3QgaXQgaW4gU2FuZGJveC4gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZXMgb3IgY2hlY2sgeW91ciBzdGF0dXMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgb3IgW3N1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIFN1cHBvcnQgdGlja2V0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcmVxdWVzdC1wcm9kdWN0LWFjY2VzcykuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0OiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLiBUaGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIGlmIGNhbGxlZCBhIHNlY29uZCB0aW1lIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGBpbml0aWF0ZWRgLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLlxuICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMjaW52ZXN0bWVudHMpIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjdHJhbnNhY3Rpb25zLWluaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1oaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjZGVsZXRlZC10cmFuc2FjdGlvbnMtZGV0ZWN0ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEFjY2VzcyB0byBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpbiBQcm9kdWN0aW9uIGlzIHNwZWNpZmljIHRvIGNlcnRhaW4gcHJpY2luZyBwbGFucy4gSWYgeW91IGNhbm5vdCBhY2Nlc3MgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaW4gUHJvZHVjdGlvbiwgW2NvbnRhY3QgU2FsZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9jb250YWN0KSBmb3IgYXNzaXN0YW5jZS5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdHJhbnNmZXIgZmFpbHVyZSByaXNrLiAgSW4gUGxhaWRcXCdzIHNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgZGVjbGluZWRfbnNmX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYGRlY2xpbmVkX3Jpc2tfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gcGVybWl0IGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gcGVybWl0IGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYExPR0lOX1JFUVVJUkVEYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gIEFsbCB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbnMgb3RoZXIgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgd2lsbCByZXN1bHQgaW4gYSBkZWNpc2lvbiBvZiBwZXJtaXR0ZWQgYW5kIHJhdGlvbmFsZSBjb2RlIGBFUlJPUmAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxufVxuXG5cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJSCxrREFBaUU7QUFDakUseURBQXlEO0FBQ3pELGFBQWE7QUFDYixxQ0FBNE47QUFDNU4sYUFBYTtBQUNiLGlDQUE0RjtBQUU1Rjs7OztHQUlHO0FBQ0gsSUFBWSxRQWdCWDtBQWhCRCxXQUFZLFFBQVE7SUFDaEIsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0FBQ2YsQ0FBQyxFQWhCVyxRQUFRLEdBQVIsZ0JBQVEsS0FBUixnQkFBUSxRQWdCbkI7QUFvQ0Q7OztNQUdNO0FBQ04sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3RCLDZEQUEyQyxDQUFBO0lBQzNDLHNDQUFvQixDQUFBO0lBQ3BCLDhDQUE0QixDQUFBO0lBQzVCLHFDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUt6QjtBQXFHRDs7O01BR007QUFDTixJQUFZLG1DQU9YO0FBUEQsV0FBWSxtQ0FBbUM7SUFDM0MsdUZBQWdELENBQUE7SUFDaEQsc0dBQStELENBQUE7SUFDL0QsZ0dBQXlELENBQUE7SUFDekQsNkVBQXNDLENBQUE7SUFDdEMsbUZBQTRDLENBQUE7SUFDNUMsaUZBQTBDLENBQUE7QUFDOUMsQ0FBQyxFQVBXLG1DQUFt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LENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNySyxDQUFDO0NBQ0o7QUE1bENELDRCQTRsQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS4zMS4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuICBSZXF1aXJlZCBmb3IgdHJhbnNmZXJzIG9uIGFuIEFDSCBuZXR3b3JrLiAgYFxcXCJhcmNcXFwiYCAtIEFjY291bnRzIFJlY2VpdmFibGUgRW50cnkgIGBcXFwiY2JyYFxcXCIgLSBDcm9zcyBCb3JkZXIgRW50cnkgIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJjaWVcXFwiYCAtIEN1c3RvbWVyIEluaXRpYXRlZCBFbnRyeSAgYFxcXCJjb3JcXFwiYCAtIEF1dG9tYXRlZCBOb3RpZmljYXRpb24gb2YgQ2hhbmdlICBgXFxcImN0eFxcXCJgIC0gQ29ycG9yYXRlIFRyYWRlIEV4Y2hhbmdlICBgXFxcImlhdFxcXCJgIC0gSW50ZXJuYXRpb25hbCAgYFxcXCJtdGVcXFwiYCAtIE1hY2hpbmUgVHJhbnNmZXIgRW50cnkgIGBcXFwicGJyXFxcImAgLSBDcm9zcyBCb3JkZXIgRW50cnkgIGBcXFwicG9wXFxcImAgLSBQb2ludC1vZi1QdXJjaGFzZSBFbnRyeSAgYFxcXCJwb3NcXFwiYCAtIFBvaW50LW9mLVNhbGUgRW50cnkgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcInJja1xcXCJgIC0gUmUtcHJlc2VudGVkIENoZWNrIEVudHJ5ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUNIQ2xhc3Mge1xuICAgIEFyYyA9ICdhcmMnLFxuICAgIENiciA9ICdjYnInLFxuICAgIENjZCA9ICdjY2QnLFxuICAgIENpZSA9ICdjaWUnLFxuICAgIENvciA9ICdjb3InLFxuICAgIEN0eCA9ICdjdHgnLFxuICAgIElhdCA9ICdpYXQnLFxuICAgIE10ZSA9ICdtdGUnLFxuICAgIFBiciA9ICdwYnInLFxuICAgIFBvcCA9ICdwb3AnLFxuICAgIFBvcyA9ICdwb3MnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFJjayA9ICdyY2snLFxuICAgIFRlbCA9ICd0ZWwnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIEFQUiBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQVBSXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbm51YWwgUGVyY2VudGFnZSBSYXRlIGFwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFsYW5jZSB0byB3aGljaCB0aGUgQVBSIGFwcGxpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYXByX3R5cGU6IEFQUkFwclR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSB0aGF0IGlzIHN1YmplY3RlZCB0byB0aGUgQVBSIGlmIGEgYmFsYW5jZSB3YXMgY2FycmllZCBiZXlvbmQgcGF5bWVudCBkdWUgZGF0ZS4gSG93IGl0IGlzIGNhbGN1bGF0ZWQgY2FuIHZhcnkgYnkgY2FyZCBpc3N1ZXIuIEl0IGlzIG9mdGVuIGNhbGN1bGF0ZWQgYXMgYW4gYXZlcmFnZSBkYWlseSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGJhbGFuY2Vfc3ViamVjdF90b19hcHI6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIG1vbmV5IGNoYXJnZWQgZHVlIHRvIGludGVyZXN0IGZyb20gbGFzdCBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgaW50ZXJlc3RfY2hhcmdlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBUFJBcHJUeXBlRW51bSB7XG4gICAgQmFsYW5jZVRyYW5zZmVyQXByID0gJ2JhbGFuY2VfdHJhbnNmZXJfYXByJyxcbiAgICBDYXNoQXByID0gJ2Nhc2hfYXByJyxcbiAgICBQdXJjaGFzZUFwciA9ICdwdXJjaGFzZV9hcHInLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCdcbn1cblxuLyoqXG4gKiBBbGxvdyBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBieSBhY2NvdW50LiBVbmxpc3RlZCAoZS5nLiBtaXNzaW5nKSBhY2NvdW50cyB3aWxsIGJlIGNvbnNpZGVyZWQgYG5ld19hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QXNzZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIHR3byBhbW91bnRzLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBBc3NldHMgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEFzc2V0cyBlbmRwb2ludHMuIFRyYW5zYWN0aW9uIGhpc3RvcnkgcmV0dXJuZWQgYnkgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHRvcC1sZXZlbCBgdHJhbnNhY3Rpb25zYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQXNzZXRzIGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBBc3NldHMgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNBbGxPZlxuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQXNzZXRzIGVuZHBvaW50cy4gVHJhbnNhY3Rpb24gaGlzdG9yeSByZXR1cm5lZCBieSBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgdG9wLWxldmVsIGB0cmFuc2FjdGlvbnNgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVkIGRhdGEgYWJvdXQgdGhlIGhpc3RvcmljYWwgYmFsYW5jZXMgb24gdGhlIGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQXNzZXRzIGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG59XG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBkZXNjcmliaW5nIHRoZSBiYWxhbmNlIGZvciBhbiBhY2NvdW50LiBCYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSBiYWxhbmNlIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEJhbGFuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZnVuZHMgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBmcm9tIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGxpbWl0YCBsZXNzIHRoZSBgY3VycmVudGAgYmFsYW5jZSwgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBjdXJyZW50YCBiYWxhbmNlIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGRvZXMgbm90IGluY2x1ZGUgdGhlIG92ZXJkcmFmdCBsaW1pdC4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQgIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgcHJvdmlkZWQgd2hlbiB0aGUgYG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWVgIGlzIHBhc3NlZCB3aGVuIGNhbGxpbmcgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgYWNjb3VudCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QmFzZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBBdXRvbWF0ZWQgb3IgTWFudWFsIG1pY3JvLWRlcG9zaXRzLiAgUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSB0d28gYW1vdW50cy4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRCYXNlVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJ1xufVxuXG4vKipcbiAqIEVudW1lcmF0ZXMgdGhlIGFjY291bnQgc3VidHlwZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lzaGVzIGZvciB0aGUgdXNlciB0byBiZSBhYmxlIHRvIHNlbGVjdCBmcm9tLiBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHRvIFBsYWlkIGRvY3VtZW50YXRpb24gb24gYWNjb3VudCBmaWx0ZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGNyZWRpdD86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnQgc3VidHlwZXMgdG8gYmUgZmlsdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgYGFjY291bnRfZmlsdGVyc2Agc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJzUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IERlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWRpdD86IENyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlcnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIHR3byBhbW91bnRzLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogVGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgYWNjb3VudHMgYmUgbGltaXRlZCB0byBhIHNwZWNpZmljIGNhcmRpbmFsaXR5LiBgTVVMVElfU0VMRUNUYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gcGljayBtdWx0aXBsZSBhY2NvdW50cy4gYFNJTkdMRV9TRUxFQ1RgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBwaWNrIG9ubHkgYSBzaW5nbGUgYWNjb3VudC4gYEFMTGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIG11c3Qgc2hhcmUgYWxsIG9mIHRoZWlyIGFjY291bnRzIGFuZCBzaG91bGQgbm90IGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byBkZS1zZWxlY3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRTZWxlY3Rpb25DYXJkaW5hbGl0eSB7XG4gICAgU2luZ2xlU2VsZWN0ID0gJ1NJTkdMRV9TRUxFQ1QnLFxuICAgIE11bHRpU2VsZWN0ID0gJ01VTFRJX1NFTEVDVCcsXG4gICAgQWxsID0gJ0FMTCdcbn1cblxuLyoqXG4gKiBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGFjY291bnQgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcgc3VidHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50U3VidHlwZSB7XG4gICAgXzQwMWEgPSAnNDAxYScsXG4gICAgXzQwMWsgPSAnNDAxaycsXG4gICAgXzQwM0IgPSAnNDAzQicsXG4gICAgXzQ1N2IgPSAnNDU3YicsXG4gICAgXzUyOSA9ICc1MjknLFxuICAgIEJyb2tlcmFnZSA9ICdicm9rZXJhZ2UnLFxuICAgIENhc2hJc2EgPSAnY2FzaCBpc2EnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpcmEgPSAnbGlyYScsXG4gICAgTHJpZiA9ICdscmlmJyxcbiAgICBMcnNwID0gJ2xyc3AnLFxuICAgIE5vblRheGFibGVCcm9rZXJhZ2VBY2NvdW50ID0gJ25vbi10YXhhYmxlIGJyb2tlcmFnZSBhY2NvdW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgT3RoZXJJbnN1cmFuY2UgPSAnb3RoZXIgaW5zdXJhbmNlJyxcbiAgICBPdGhlckFubnVpdHkgPSAnb3RoZXIgYW5udWl0eScsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBSZHNwID0gJ3Jkc3AnLFxuICAgIFJlc3AgPSAncmVzcCcsXG4gICAgUmxpZiA9ICdybGlmJyxcbiAgICBScmlmID0gJ3JyaWYnLFxuICAgIFBlbnNpb24gPSAncGVuc2lvbicsXG4gICAgUHJvZml0U2hhcmluZ1BsYW4gPSAncHJvZml0IHNoYXJpbmcgcGxhbicsXG4gICAgUmV0aXJlbWVudCA9ICdyZXRpcmVtZW50JyxcbiAgICBSb3RoID0gJ3JvdGgnLFxuICAgIFJvdGg0MDFrID0gJ3JvdGggNDAxaycsXG4gICAgUnJzcCA9ICdycnNwJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFRocmlmdFNhdmluZ3NQbGFuID0gJ3RocmlmdCBzYXZpbmdzIHBsYW4nLFxuICAgIFRmc2EgPSAndGZzYScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFVnbWEgPSAndWdtYScsXG4gICAgVXRtYSA9ICd1dG1hJyxcbiAgICBWYXJpYWJsZUFubnVpdHkgPSAndmFyaWFibGUgYW5udWl0eScsXG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgQ2QgPSAnY2QnLFxuICAgIENoZWNraW5nID0gJ2NoZWNraW5nJyxcbiAgICBTYXZpbmdzID0gJ3NhdmluZ3MnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBBdXRvID0gJ2F1dG8nLFxuICAgIEJ1c2luZXNzID0gJ2J1c2luZXNzJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIENvbnN0cnVjdGlvbiA9ICdjb25zdHJ1Y3Rpb24nLFxuICAgIENvbnN1bWVyID0gJ2NvbnN1bWVyJyxcbiAgICBIb21lID0gJ2hvbWUnLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIE92ZXJkcmFmdCA9ICdvdmVyZHJhZnQnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBSZWN1cnJpbmcgPSAncmVjdXJyaW5nJyxcbiAgICBSZXdhcmRzID0gJ3Jld2FyZHMnLFxuICAgIFNhZmVEZXBvc2l0ID0gJ3NhZmUgZGVwb3NpdCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIGBpbnZlc3RtZW50OmAgSW52ZXN0bWVudCBhY2NvdW50ICBgY3JlZGl0OmAgQ3JlZGl0IGNhcmQgIGBkZXBvc2l0b3J5OmAgRGVwb3NpdG9yeSBhY2NvdW50ICBgbG9hbjpgIExvYW4gYWNjb3VudCAgYGJyb2tlcmFnZWA6IEFuIGludmVzdG1lbnQgYWNjb3VudC4gVXNlZCBmb3IgYC9hc3NldHMvYCBlbmRwb2ludHMgb25seTsgb3RoZXIgZW5kcG9pbnRzIHVzZSBgaW52ZXN0bWVudGAuICBgb3RoZXI6YCBOb24tc3BlY2lmaWVkIGFjY291bnQgdHlwZSAgU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGFjY291bnQgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcgc3VidHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBmb3IgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgaXMgb2xkZXIgdGhhbiB0aGUgZ2l2ZW4gdGltZXN0YW1wLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgaW4gd2hpY2ggY2FzZSBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hY2NvdW50cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2FjY291bnRzL2dldGAgYW5kIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSWYgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgd2FzIGNhbGxlZCwgZWFjaCBhY2NvdW50IHdpbGwgaW5jbHVkZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzXG4gICAgICovXG4gICAgcHJpbWFyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzRGF0YU51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFwcGxpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbnMvbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGlzIGFwcGxpY2F0aW9uIHdhcyBsaW5rZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkwgdGhhdCBsaW5rcyB0byB0aGUgYXBwbGljYXRpb24gbG9nbyBpbWFnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGxvZ29fdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb25uZWN0ZWQgYXBwIHN0YXRpbmcgd2h5IHRoZXkgdXNlIHRoZWlyIHJlc3BlY3RpdmUgZW5hYmxlZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHJlYXNvbl9mb3JfYWNjZXNzOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHNjaGVtYSBmb3IgYC9hcHBsaWNhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9ucy9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlcXVlc3QgSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcHBsaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uOiBBcHBsaWNhdGlvbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBBc3NldCBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgeW91IGRldGVybWluZSBhbmQgc3VibWl0IGZvciB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEFzc2V0IFJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0XG4gICAgICovXG4gICAgZGF0ZV9nZW5lcmF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB5b3UgcmVxdWVzdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0XG4gICAgICovXG4gICAgdXNlcjogQXNzZXRSZXBvcnRVc2VyO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRSZXBvcnRJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8QXNzZXRSZXBvcnRJdGVtPjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRvcl9pZGAgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0b3JfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIEF1ZGl0IENvcHkgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0aGUgSXRlbXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuIFRoZSBgYXNzZXRzYCBwcm9kdWN0IG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIGxpbms7IHRoZSBBc3NldHMgcHJvZHVjdCBjYW5ub3QgYmUgYWRkZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gaW50ZWdlciBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC4gSWYgdXNpbmcgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHksIGBkYXlzX3JlcXVlc3RlZGAgbXVzdCBiZSBhdCBsZWFzdCA2MSBmb3IgbmV3IG9yaWdpbmF0aW9ucyBvciBhdCBsZWFzdCAzMSBmb3IgcmVmaW5hbmNpbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC4gVGhlIG9wdGlvbmFsIGB1c2VyYCBvYmplY3QgaXMgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eSBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHJldHJpZXZlIHRoZSBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgYGZhbHNlYCBvdGhlcndpc2UuIFRoaXMgZmllbGQgZGVmYXVsdHMgdG8gYGZhbHNlYCBpZiBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNsdWRlX2luc2lnaHRzPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogQXNzZXRSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEFzc2V0IFJlcG9ydCBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGJ1dCBpZGVudGl0eSBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmV0dXJuZWQsIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcnMgY2F1c2luZyBpZGVudGl0eSBpbmZvcm1hdGlvbiB0byBiZSBtaXNzaW5nXG4gICAgICogQHR5cGUge0FycmF5PFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M6IEFycmF5PFdhcm5pbmc+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIEl0ZW0gd2l0aGluIGFuIEFzc2V0IFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJdGVtIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGRhdGVfbGFzdF91cGRhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QXNzZXRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRBc3NldHM+O1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuZWQgYnkgdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gdGhlIEFzc2V0IFJlcG9ydC4gTXVzdCBiZSBhbiBpbnRlZ2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgZnJvbSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYG9wdGlvbnNgIGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aWxsIGJlIHVzZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBBc3NldHMgd2ViaG9va3MsIGZvciBleGFtcGxlIHdoZW4gdGhlIHJlcXVlc3RlZCBBc3NldCBSZXBvcnQgaXMgcmVhZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdXNlcj86IEFzc2V0UmVwb3J0VXNlcjtcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyBhbiBBc3NldCBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEFzc2V0IFJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogQXNzZXRSZXBvcnRUcmFuc2FjdGlvblRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBTZWUgW0NhdGVnb3JpZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvI2NhdGVnb3J5LW92ZXJ2aWV3KS4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy8jY2F0ZWdvcnktb3ZlcnZpZXcpLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudE1ldGF9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE/OiBQYXltZW50TWV0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgaXMgaW4gYmV0YSBhbmQgd2lsbCBiZSBvbWl0dGVkIHVubGVzcyB0aGUgY2xpZW50IGlzIGJvdGggZW5yb2xsZWQgaW4gdGhlIGNsb3NlZCBiZXRhIHByb2dyYW0gYW5kIGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgaW4gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIGFjY291bnRcXCdzIGN1cnJlbmN5LCBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGRlYml0IGNhcmQgcHVyY2hhc2VzIGFyZSBwb3NpdGl2ZTsgY3JlZGl0IGNhcmQgcGF5bWVudHMsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQXNzZXRSZXBvcnRUcmFuc2FjdGlvblRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHVzZXIgb2JqZWN0IGFsbG93cyB5b3UgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBBc3NldCBSZXBvcnQuIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBUaGUgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYW5kIGBzc25gIGZpZWxkcyBhcmUgcmVxdWlyZWQgaWYgeW91IHdvdWxkIGxpa2UgdGhlIFJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZeKAmXMgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB5b3UgZGV0ZXJtaW5lIGFuZCBzdWJtaXQgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZS4gUmVxdWlyZWQgZm9yIHRoZSBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIG1pZGRsZV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lLiAgUmVxdWlyZWQgZm9yIHRoZSBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGxhc3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIFNvY2lhbCBTZWN1cml0eSBOdW1iZXIuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gIEZvcm1hdDogXFxcImRkZC1kZC1kZGRkXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIHNzbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciwgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9LiBGb3IgZXhhbXBsZTogXFxcIisxNDE1MTIzNDU2N1xcXCIuIFBob25lIG51bWJlcnMgcHJvdmlkZWQgaW4gb3RoZXIgZm9ybWF0cyB3aWxsIGJlIHBhcnNlZCBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIEFzc2V0IFJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIFRoZSByZXN1bHRpbmcgYGVycm9yYCB3aWxsIGhhdmUgYW4gYGVycm9yX3R5cGVgIG9mIGBBU1NFVF9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldHNFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldHNFcnJvcldlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEFzc2V0IFJlcG9ydCBoYXMgYmVlbiBnZW5lcmF0ZWQgYW5kIGAvYXNzZXRfcmVwb3J0L2dldGAgaXMgcmVhZHkgdG8gYmUgY2FsbGVkLiAgSWYgeW91IGF0dGVtcHQgdG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IGJlZm9yZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCB5b3XigJlsbCByZWNlaXZlIGEgcmVzcG9uc2Ugd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA0MDAgYW5kIGEgUGxhaWQgZXJyb3IgY29kZSBvZiBgUFJPRFVDVF9OT1RfUkVBRFlgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHRvIHJldHJpZXZlIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpZGVudGlmeWluZyBudW1iZXJzIHVzZWQgZm9yIG1ha2luZyBlbGVjdHJvbmljIHRyYW5zZmVycyB0byBhbmQgZnJvbSB0aGUgYGFjY291bnRzYC4gVGhlIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIChBQ0gsIEVGVCwgSUJBTiwgb3IgQkFDUykgdXNlZCB3aWxsIGRlcGVuZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgYWNjb3VudC4gQW4gYWNjb3VudCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIG51bWJlciB0eXBlLiBJZiBhIHBhcnRpY3VsYXIgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgaXMgbm90IHVzZWQgYnkgYW55IGBhY2NvdW50c2AgZm9yIHdoaWNoIGRhdGEgaGFzIGJlZW4gcmVxdWVzdGVkLCB0aGUgYXJyYXkgZm9yIHRoYXQgdHlwZSB3aWxsIGJlIGVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBBQ0ggbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FDSD59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYWNoOiBBcnJheTxOdW1iZXJzQUNIPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBFRlQgbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0VGVD59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgZWZ0OiBBcnJheTxOdW1iZXJzRUZUPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBJQkFOIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsOiBBcnJheTxOdW1iZXJzSW50ZXJuYXRpb25hbD47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgQkFDUyBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQkFDUz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjczogQXJyYXk8TnVtYmVyc0JBQ1M+O1xufVxuLyoqXG4gKiBBdXRoR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXV0aEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXV0aC9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRzYCBmb3Igd2hpY2ggbnVtYmVycyBhcmUgYmVpbmcgcmV0cmlldmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBdXRoIGZlYXR1cmVzIG9mIGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoTWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoU3VwcG9ydGVkTWV0aG9kc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aE1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydGVkX21ldGhvZHM6IEF1dGhTdXBwb3J0ZWRNZXRob2RzIHwgbnVsbDtcbn1cbi8qKlxuICogTWV0YWRhdGEgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gd2hpY2ggYXV0aCBtZXRob2RzIGFuIGluc3RpdHV0aW9uIHN1cHBvcnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdXBwb3J0ZWRNZXRob2RzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBhdXRoIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWF0Y2ggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF1dG9tYXRlZCBtaWNyb2RlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvX2RlcG9zaXRzOiBib29sZWFuO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaXMgdmVyaWZpZWQgdmlhIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0cy4gV2UgcmVjb21tZW5kIGNvbW11bmljYXRpbmcgdG8geW91ciB1c2VycyB3aGVuIHRoaXMgZXZlbnQgaXMgcmVjZWl2ZWQgdG8gbm90aWZ5IHRoZW0gdGhhdCB0aGVpciBhY2NvdW50IGlzIHZlcmlmaWVkIGFuZCByZWFkeSBmb3IgdXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBBVVRPTUFUSUNBTExZX1ZFUklGSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbnMgYSByaXNrIHNjb3JlIGFuZCBhIHJpc2sgdGllciB0aGF0IGV2YWx1YXRlIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBiZWNhdXNlIGFuIGFjY291bnQgaXMgb3ZlcmRyYXduIG9yIGJlY2F1c2UgYW4gaW5lbGlnaWJsZSBhY2NvdW50IGlzIHVzZWQuIENvbW1vbiByZXR1cm4gY29kZXMgaW4gdGhpcyBjYXRlZ29yeSBpbmNsdWRlOiBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIOKAnFIwOOKAnSwgIFxcXCJSMDlcXFwiLCBcXFwiUjEzXFxcIiwgXFxcIlIxNlxcXCIsIFxcXCJSMTdcXFwiLCBcXFwiUjIwXFxcIiwgXFxcIlIyM1xcXCIuIFRoZXNlIHJldHVybnMgaGF2ZSBhIHR1cm5hcm91bmQgdGltZSBvZiAyIGJhbmtpbmcgZGF5cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgYGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrYCBvYmplY3QsIHRoZXJlIGFyZSBlaWdodCByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wJSAtIDAuNSUgICAyOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC41JSAtIDEuNSUgICAzOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMS41JSAtIDMlICAgNDogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDMlIC0gNSUgICA1OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gNSUgLSAxMCUgICA2OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTAlIC0gMTUlICAgNzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDE1JSBhbmQgNTAlICAgODogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gNTAlIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYW5rIHRyYW5zZmVyIHdpdGhpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIOKAnDEwLjAw4oCdKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgYmFuayB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgc3RhdHVzOiBCYW5rVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IEJhbmtUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXN0b20gdGFnIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgaW4gdGhlIGNyZWF0ZSByZXF1ZXN0LiBXaWxsIGJlIG51bGwgaWYgbm90IHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGN1c3RvbV90YWc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogLSBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIC0gT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIC0gTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgLSBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyAtIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIGJhbGFuY2UgLSB0aGUgc3VtIG9mIGFsbCBzdWNjZXNzZnVsIGRlYml0IHRyYW5zZmVyIGFtb3VudHMgbWludXMgYWxsIGNyZWRpdCB0cmFuc2ZlciBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGFibGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IGZvciB3aGljaCBiYWxhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IEJhbmtUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgYmFuayB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYmFuayB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IEJhbmtUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIOKAnDEwLjAw4oCdKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IC0gVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSAtIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCAtIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIC0gTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgLSBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyOiBgb3V0Ym91bmRgIGZvciBBUEktaW5pdGlhdGVkIHRyYW5zZmVycywgb3IgYGluYm91bmRgIGZvciBwYXltZW50cyByZWNlaXZlZCBieSB0aGUgRkJPIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJEaXJlY3Rpb24ge1xuICAgIE91dGJvdW5kID0gJ291dGJvdW5kJyxcbiAgICBJbmJvdW5kID0gJ2luYm91bmQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGV2ZW50IGluIHRoZSBCYW5rIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC4gSURzIGFyZSBzZXF1ZW50aWFsIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBldmVudCBvY2N1cnJlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IEJhbmtUcmFuc2ZlckV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFuayB0cmFuc2ZlciBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgYmFuayB0cmFuc2ZlciBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZGlyZWN0aW9uOiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJSZWNlaXZlckRldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgcmVjZWl2ZXJfZGV0YWlsczogQmFua1RyYW5zZmVyUmVjZWl2ZXJEZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfdHlwZT86IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RCYW5rVHJhbnNmZXJUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGJhbmsgdHJhbnNmZXIgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXI6IGBvdXRib3VuZGA6IGZvciBBUEktaW5pdGlhdGVkIHRyYW5zZmVycyBgaW5ib3VuZGA6IGZvciBwYXltZW50cyByZWNlaXZlZCBieSB0aGUgRkJPIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3REaXJlY3Rpb25FbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RCYW5rVHJhbnNmZXJUeXBlRW51bSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdERpcmVjdGlvbkVudW0ge1xuICAgIEluYm91bmQgPSAnaW5ib3VuZCcsXG4gICAgT3V0Ym91bmQgPSAnb3V0Ym91bmQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgYmFuayB0cmFuc2ZlciByZXByZXNlbnRzLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgY2FuY2VsbGVkYDogVGhlIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHBvc3RlZGA6IFRoZSB0cmFuc2ZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmV2ZXJzZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQuICBgcmVjZWl2ZXJfcGVuZGluZ2A6IFRoZSBtYXRjaGluZyB0cmFuc2ZlciB3YXMgZm91bmQgYXMgYSBwZW5kaW5nIHRyYW5zYWN0aW9uIGluIHRoZSByZWNlaXZlclxcJ3MgYWNjb3VudCAgYHJlY2VpdmVyX3Bvc3RlZGA6IFRoZSBtYXRjaGluZyB0cmFuc2ZlciB3YXMgZm91bmQgYXMgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gaW4gdGhlIHJlY2VpdmVyXFwncyBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudFR5cGUge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnLFxuICAgIFJlY2VpdmVyUGVuZGluZyA9ICdyZWNlaXZlcl9wZW5kaW5nJyxcbiAgICBSZWNlaXZlclBvc3RlZCA9ICdyZWNlaXZlcl9wb3N0ZWQnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSB0eXBlIG9mIHRoaXMgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldmVyc2VkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRmFpbHVyZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXZlcnNlZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW0JhbmsgVHJhbnNmZXJzIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYmFuay10cmFuc2ZlcnMvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiYW5rIHRyYW5zZmVycyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBiYW5rIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIG9yaWdpbmF0ZWQgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJzOiBBcnJheTxCYW5rVHJhbnNmZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudCAoYGNoZWNraW5nYCBvciBgc2F2aW5nc2ApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBWYWxpZCBvcHRpb25zIGFyZSBgYWNoYCwgYHNhbWUtZGF5LWFjaGAsIG9yIGB3aXJlYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2Zlck5ldHdvcmsge1xuICAgIEFjaCA9ICdhY2gnLFxuICAgIFNhbWVEYXlBY2ggPSAnc2FtZS1kYXktYWNoJyxcbiAgICBXaXJlID0gJ3dpcmUnXG59XG5cbi8qKlxuICogVGhlIHJlY2VpdmVyIGRldGFpbHMgaWYgdGhlIHR5cGUgb2YgdGhpcyBldmVudCBpcyBgcmVjaWV2ZXJfcGVuZGluZ2Agb3IgYHJlY2lldmVyX3Bvc3RlZGAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJSZWNlaXZlckRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJSZWNlaXZlckRldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzaWduIG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBmb3IgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyIGV2ZW50IGF0IHRoZSB0aW1lIHRoZSBtYXRjaGluZyB0cmFuc2FjdGlvbiB3YXMgZm91bmQuIENhbiBiZSBgcG9zaXRpdmVgLCBgbmVnYXRpdmVgLCBvciBudWxsIGlmIHRoZSBiYWxhbmNlIHdhcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclJlY2VpdmVyRGV0YWlsc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlOiBCYW5rVHJhbnNmZXJSZWNlaXZlckRldGFpbHNBdmFpbGFibGVCYWxhbmNlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJSZWNlaXZlckRldGFpbHNBdmFpbGFibGVCYWxhbmNlRW51bSB7XG4gICAgUG9zaXRpdmUgPSAncG9zaXRpdmUnLFxuICAgIE5lZ2F0aXZlID0gJ25lZ2F0aXZlJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgUmV2ZXJzZWQgPSAncmV2ZXJzZWQnXG59XG5cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXAgZGVzY3JpYmVzIGEgc3dlZXAgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXAge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclN3ZWVwQWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzd2VlcF9hY2NvdW50OiBCYW5rVHJhbnNmZXJTd2VlcEFjY291bnQ7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IHdoZXJlIHRoZSBmdW5kcyBhcmUgc3dlcHQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwQWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEFjY291bnRcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIG11bHRpcGxlIG9yaWdpbmF0aW9uIGFjY291bnRzIGFyZSBhdmFpbGFibGUsIGBvcmlnaW5hdGlvbl9hY2NvdW50X2lkYCBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCB0aGF0IHRoZSBzd2VlcCBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBCYW5rVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHRoYXQgdGhlIHN3ZWVwcyBiZWxvbmcgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXJ0aW5nIElEIG9mIHN3ZWVwcyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2lkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN3ZWVwcyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlclN3ZWVwPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PEJhbmtUcmFuc2ZlclN3ZWVwPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGJhbmsgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyVXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVy4oCZcyBmdWxsIGxlZ2FsIG5hbWUuIElmIHRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbiBpcyBgY2NkYCwgdGhpcyBzaG91bGQgYmUgdGhlIGJ1c2luZXNzIG5hbWUgb2YgdGhlIGFjY291bnQgaG9sZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVy4oCZcyBlbWFpbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVyXFwncyByb3V0aW5nIG51bWJlci4gVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaW4gcmVzcG9uc2UgZGF0YS4gRG8gbm90IHByb3ZpZGUgdGhpcyBmaWVsZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IGJhbmsgdHJhbnNmZXIgZXZlbnRzIGFyZSBhdmFpbGFibGUuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIENhdGVnb3JpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2F0ZWdvcmllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWxsIG9mIHRoZSB0cmFuc2FjdGlvbiBjYXRlZ29yaWVzIHVzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2F0ZWdvcmllczogQXJyYXk8Q2F0ZWdvcnk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYSB0cmFuc2FjdGlvbiBjYXRlZ29yeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmeWluZyBudW1iZXIgZm9yIHRoZSBjYXRlZ29yeS4gYGNhdGVnb3J5X2lkYCBpcyBhIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gbWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBwbGFjZWAgZm9yIHBoeXNpY2FsIHRyYW5zYWN0aW9ucyBvciBgc3BlY2lhbGAgZm9yIG90aGVyIHRyYW5zYWN0aW9ucyBzdWNoIGFzIGJhbmsgY2hhcmdlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGdyb3VwOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyBgY2F0ZWdvcnlfaWRgIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgaGllcmFyY2h5OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBbiBlcnJvciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgYGl0ZW1faWRgIHVzZWQgdG8gaWRlbnRpZnkgYSBzcGVjaWZpYyBJdGVtIGFuZCBlcnJvciB3aGVuIGEgYmF0Y2ggb3BlcmF0aW9uIG9wZXJhdGluZyBvbiBtdWx0aXBsZSBJdGVtcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgaW4gb25lIG9mIHRoZSBJdGVtcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXVzZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcjogRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RlZEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb25zL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkwgdGhhdCBsaW5rcyB0byB0aGUgYXBwbGljYXRpb24gbG9nbyBpbWFnZSAod2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUsIHBsZWFzZSB1c2UgbG9nb191cmwpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsb2dvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgYXBwbGljYXRpb25cXCdzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGlzIGFwcGxpY2F0aW9uIHdhcyBsaW5rZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIEEgbGlzdCBvZiBlbnVtcyByZXByZXNlbnRpbmcgdGhlIGRhdGEgY29sbGVjdGVkIGFuZCBwcm9kdWN0cyBlbmFibGVkIGZvciB0aGlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBwcm9kdWN0X2RhdGFfdHlwZXM6IEFycmF5PENvbm5lY3RlZEFwcGxpY2F0aW9uUHJvZHVjdERhdGFUeXBlc0VudW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcXVlc3RlZFNjb3Blc31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZXF1ZXN0ZWRfc2NvcGVzPzogUmVxdWVzdGVkU2NvcGVzO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIENvbm5lY3RlZEFwcGxpY2F0aW9uUHJvZHVjdERhdGFUeXBlc0VudW0ge1xuICAgIEJhbGFuY2UgPSAnQUNDT1VOVF9CQUxBTkNFJyxcbiAgICBVc2VySW5mbyA9ICdBQ0NPVU5UX1VTRVJfSU5GTycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ0FDQ09VTlRfVFJBTlNBQ1RJT05TJ1xufVxuXG4vKipcbiAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb3VudHJ5Q29kZSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIEdiID0gJ0dCJyxcbiAgICBFcyA9ICdFUycsXG4gICAgTmwgPSAnTkwnLFxuICAgIEZyID0gJ0ZSJyxcbiAgICBJZSA9ICdJRScsXG4gICAgQ2EgPSAnQ0EnXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNyZWRpdCBjYXJkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdENhcmRMaWFiaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YXJpb3VzIGludGVyZXN0IHJhdGVzIHRoYXQgYXBwbHkgdG8gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFQUj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhcHJzOiBBcnJheTxBUFI+O1xuICAgIC8qKlxuICAgICAqIHRydWUgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxhc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gcGF5bWVudCBkdWUgZm9yIHRoZSBuZXh0IGJpbGxpbmcgY3ljbGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGNyZWRpdGAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudHMtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0LiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTog4oCcUjA14oCdLCBcXFwiUjA3XFxcIiwgXFxcIlIxMFxcXCIsIFxcXCJSMTFcXFwiLCBcXFwiUjI5XFxcIi4gVGhlc2UgcmV0dXJucyB0eXBpY2FsbHkgaGF2ZSBhIHJldHVybiB0aW1lIGZyYW1lIG9mIHVwIHRvIDYwIGNhbGVuZGFyIGRheXMuIER1cmluZyB0aGlzIHBlcmlvZCwgdGhlIGN1c3RvbWVyIG9mIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY2FuIGRpc3B1dGUgYSB0cmFuc2FjdGlvbiBhcyB1bmF1dGhvcml6ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza1xuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB0aWVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2plY3RlZCBsaWtlbGlob29kIHRoYXQgdGhlIHRyYW5zYWN0aW9uLCBpZiBpbml0aWF0ZWQsIHdpbGwgYmUgc3ViamVjdCB0byBhIHJldHVybi4gIEluIHRoZSBgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9yaXNrYCBvYmplY3QsIHRoZXJlIGFyZSBmaXZlIHJpc2sgdGllcnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2NvcmVzOiAgIDE6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wMCUgLSAwLjAyJSAgIDI6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wMiUgLSAwLjA1JSAgIDM6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wNSUgLSAwLjElICAgNDogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjElIC0gMC41JSAgIDU6IFByZWRpY3RlZCBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGdyZWF0ZXIgdGhhbiAwLjUlIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza1xuICAgICAqL1xuICAgIHJpc2tfdGllcjogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBzdWJ0b3RhbHM/OiBBcnJheTxUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PFRvdGFsPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb24gZGF0YSBpcyBhdmFpbGFibGUgZm9yIGFuIEl0ZW0uIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gdGhlIHdlYmhvb2sgcmVsYXRlcyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgc3RyZWV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50OiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaFRhcmdldFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGFyZ2V0X3VzZXI6IERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlPzogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RDb3VudHJ5Q29kZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RDb3VudHJ5Q29kZUVudW0ge1xuICAgIFVzID0gJ1VTJyxcbiAgICBDYSA9ICdDQSdcbn1cblxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2FsdC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjY2VzcyB0b2tlbiBmb3IgdGhlIHRhcmdldCBJdGVtLCB0eXBpY2FsbHkgcHJvdmlkZWQgaW4gdGhlIEltcG9ydCBJdGVtIHJlc3BvbnNlLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF9hY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZCBBY2NvdW50IElEIHRoYXQgc3BlY2lmaWVzIHRoZSB0YXJnZXQgYmFuayBhY2NvdW50LiBUaGlzIGFjY291bnQgd2lsbCBiZWNvbWUgdGhlIHJlY2lwaWVudCBmb3IgYSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0Q291bnRyeUNvZGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIGNhbm5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3Mgd2hlbiB0aGUgc3RhdHVzIG9mIGEgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdCBoYXMgY2hhbmdlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9uIGl0ZW1zIHRvIHVzZSB3aGVuIGF0dGVtcHRpbmcgdG8gbWF0Y2ggdGhlIHVzZXIgdG8gdGhlaXIgUGF5cm9sbCBQcm92aWRlci4gVGhlc2UgdG9rZW5zIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgc2FtZSBjbGllbnQgaWQgYXMgdGhlIG9uZSBjcmVhdGluZyB0aGUgc3dpdGNoLCBhbmQgaGF2ZSBhY2Nlc3MgdG8gdGhlIHRyYW5zYWN0aW9ucyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pdGVtX2FjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYmFuayBhY2NvdW50IHRoZSBkaXJlY3QgZGVwb3NpdCB3YXMgc3dpdGNoZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGFyZ2V0X2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBJdGVtIHRoZSBkaXJlY3QgZGVwb3NpdCB3YXMgc3dpdGNoZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGFyZ2V0X2l0ZW1faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogIFRoZSBzdGF0ZSwgb3Igc3RhdHVzLCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guICAtIGBpbml0aWFsaXplZGAg4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSB1c2VyIGVudGVyaW5nIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBzdWJtaXQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBwcm9jZXNzaW5nYCDigJMgVGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGJlZW4gc3VibWl0dGVkIGFuZCBpcyBiZWluZyBwcm9jZXNzZWQuICAtIGBjb21wbGV0ZWRgIOKAkyBUaGUgdXNlclxcJ3MgZW1wbG95ZXIgaGFzIGZ1bGZpbGxlZCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIC0gYGVycm9yYCDigJMgVGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdGU6IERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVN0YXRlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kIHVzZWQgdG8gbWFrZSB0aGUgZGVwb3NpdCBzd2l0Y2guICAtIGBpbnN0YW50YCDigJMgVXNlciBpbnN0YW50bHkgc3dpdGNoZWQgdGhlaXIgZGlyZWN0IGRlcG9zaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgYmFuayBhY2NvdW50IGJ5IGNvbm5lY3RpbmcgdGhlaXIgcGF5cm9sbCBvciBlbXBsb3llciBhY2NvdW50LiAgLSBgbWFpbGAg4oCTIFVzZXIgcmVxdWVzdGVkIHRoYXQgUGxhaWQgY29udGFjdCB0aGVpciBlbXBsb3llciBieSBtYWlsIHRvIG1ha2UgdGhlIGRpcmVjdCBkZXBvc2l0IHN3aXRjaC4gIC0gYHBkZmAg4oCTIFVzZXIgZ2VuZXJhdGVkIGEgUERGIG9yIGVtYWlsIHRvIGJlIHNlbnQgdG8gdGhlaXIgZW1wbG95ZXIgd2l0aCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3aXRjaF9tZXRob2Q/OiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBnb2VzIHRvIG11bHRpcGxlIGJhbmtzLiBXaGVuIGZhbHNlLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBvbmx5IGdvZXMgdG8gdGhlIHRhcmdldCBhY2NvdW50LiBBbHdheXMgYG51bGxgIGlmIHRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgbm90IGJlZW4gY29tcGxldGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2hhc19tdWx0aXBsZV9hbGxvY2F0aW9uczogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSB0YXJnZXQgYWNjb3VudCBpcyBhbGxvY2F0ZWQgdGhlIHJlbWFpbmRlciBvZiBkaXJlY3QgZGVwb3NpdCBhZnRlciBhbGwgb3RoZXIgYWxsb2NhdGlvbnMgaGF2ZSBiZWVuIGRlZHVjdGVkLiBXaGVuIGBmYWxzZWAsIHVzZXLigJlzIGRpcmVjdCBkZXBvc2l0IGlzIGFsbG9jYXRlZCBhcyBhIHBlcmNlbnQgb3IgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIHRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgbm90IGJlZW4gY29tcGxldGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19hbGxvY2F0ZWRfcmVtYWluZGVyOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0ZWQgdG8gdGhlIHRhcmdldCBhY2NvdW50LiBBbHdheXMgYG51bGxgIGlmIHRoZSB0YXJnZXQgYWNjb3VudCBpcyBub3QgYWxsb2NhdGVkIGEgcGVyY2VudGFnZSBvciBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCBvciBpZiBgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcmAgaXMgdHJ1ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwZXJjZW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZG9sbGFyIGFtb3VudCBvZiBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0ZWQgdG8gdGhlIHRhcmdldCBhY2NvdW50LiBBbHdheXMgYG51bGxgIGlmIHRoZSB0YXJnZXQgYWNjb3VudCBpcyBub3QgYWxsb2NhdGVkIGFuIGFtb3VudCBvciBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnRfYWxsb2NhdGVkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3QgYW4gZW1wbG95ZXIsIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1wbG95ZXJfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlbXBsb3llciBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3QgYW4gZW1wbG95ZXIsIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3QgYW4gaW5zdGl0dXRpb24sIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3QgYW4gaW5zdGl0dXRpb24sIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUgdGhlIGRlcG9zaXQgc3dpdGNoIHdhcyBjcmVhdGVkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYXRlX2NyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY29tcGxldGVkLiBBbHdheXMgYG51bGxgIGlmIHRoZSBkZXBvc2l0IHN3aXRjaCBoYXMgbm90IGJlZW4gY29tcGxldGVkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYXRlX2NvbXBsZXRlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVN0YXRlRW51bSB7XG4gICAgSW5pdGlhbGl6ZWQgPSAnaW5pdGlhbGl6ZWQnLFxuICAgIFByb2Nlc3NpbmcgPSAncHJvY2Vzc2luZycsXG4gICAgQ29tcGxldGVkID0gJ2NvbXBsZXRlZCcsXG4gICAgRXJyb3IgPSAnZXJyb3InXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVN3aXRjaE1ldGhvZEVudW0ge1xuICAgIEluc3RhbnQgPSAnaW5zdGFudCcsXG4gICAgTWFpbCA9ICdtYWlsJyxcbiAgICBQZGYgPSAncGRmJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdCBoYXMgY2hhbmdlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiREVQT1NJVF9TV0lUQ0hcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFxcXCJTV0lUQ0hfU1RBVEVfVVBEQVRFXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgYGluaXRpYWxpemVkYDogVGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIHVzZXIgZW50ZXJpbmcgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHN1Ym1pdCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIGBwcm9jZXNzaW5nYDogVGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGJlZW4gc3VibWl0dGVkIGFuZCBpcyBiZWluZyBwcm9jZXNzZWQuICBgY29tcGxldGVkYDogVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgYW5kIGNvbXBsZXRlZCB0aGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdC4gIGBlcnJvcmA6IFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW0RlcG9zaXQgU3dpdGNoIEFQSSByZWZlcmVuY2VdKC9kb2NzL2FwaS9wcm9kdWN0cyNkZXBvc2l0X3N3aXRjaGdldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgZm9yIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb24gYWNjb3VudCwgYXMgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyIGluIHRoZSBEZXBvc2l0IFN3aXRjaCBpbnRlcmZhY2UuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBtYXRjaCB0aGUgbmFtZSB1c2VkIGluIG9ubGluZSBiYW5raW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncydcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdpdmVuIG5hbWUgKGZpcnN0IG5hbWUpIG9mIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmYW1pbHkgbmFtZSAobGFzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBvZiB0aGUgdXNlci4gVGhlIGVuZHBvaW50IGNhbiBhY2NlcHQgYSB2YXJpZXR5IG9mIHBob25lIG51bWJlciBmb3JtYXRzLCBpbmNsdWRpbmcgRS4xNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgZW1haWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHRheHBheWVyIElEIG9mIHRoZSB1c2VyLCBnZW5lcmFsbHkgdGhlaXIgU1NOLCBFSU4sIG9yIFRJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIHRheF9wYXllcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBEZXBvc2l0IHN3aXRjaCB0b2tlbiwgdXNlZCB0byBpbml0aWFsaXplIExpbmsgZm9yIHRoZSBEZXBvc2l0IFN3aXRjaCBwcm9kdWN0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4cGlyYXRpb24gdGltZSBvZiB0aGUgdG9rZW4sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfdG9rZW5fZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0b3J5RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50cy1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHBheWNoZWNrIChmb3IgZXhhbXBsZSwgdGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byBhIHNwZWNpZmljIGNoZWNraW5nIGFjY291bnQsIG9yIHRvIGEgcmV0aXJlbWVudCBwbGFuKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGlzdHJpYnV0aW9uRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkRldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudCBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBiYW5rIGFjY291bnQgKGUuZy4gQ2hlY2tpbmcgb3IgU2F2aW5ncylcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgYmFua19hY2NvdW50X3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBiYW5rX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBkaXN0cmlidXRpb24gdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25EZXRhaWxzXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIGZyb20gdGhlIGVuZCB1c2VyXFwncyB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgdGhhdCBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHBheXN0dWIgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5c3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFYXJuaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RWFybmluZ3NUb3RhbD59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICovXG4gICAgc3VidG90YWxzPzogQXJyYXk8RWFybmluZ3NUb3RhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEVhcm5pbmdzVG90YWw+fVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzVG90YWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIENvbW1vbmx5IHVzZWQgdGVybSB0byBkZXNjcmliZSB0aGUgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb24/OiBFYXJuaW5nc1RvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb25FbnVtO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2hvdXJzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9yYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBFYXJuaW5nc1RvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb25FbnVtIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRU1QTE9ZRUUgTUVESUNBUkUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTT0NJQUwgU0VDVVJJVFkgRU1QTE9ZRUUgVEFYJyxcbiAgICBNZWRpY2FsID0gJ01FRElDQUwnLFxuICAgIFZpc2lvbiA9ICdWSVNJT04nLFxuICAgIERlbnRhbCA9ICdERU5UQUwnLFxuICAgIE5ldFBheSA9ICdORVQgUEFZJyxcbiAgICBUYXhlcyA9ICdUQVhFUycsXG4gICAgTm90Rm91bmQgPSAnTk9UX0ZPVU5EJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVtYWlsIGFkZHJlc3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1haWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWFpbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxcbiAgICAgKi9cbiAgICBkYXRhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGVtYWlsIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgZW1haWwgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGVtYWlsIGFjY291bnQgYXMgZGVzY3JpYmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxcbiAgICAgKi9cbiAgICB0eXBlOiBFbWFpbFR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEVtYWlsVHlwZUVudW0ge1xuICAgIFByaW1hcnkgPSAncHJpbWFyeScsXG4gICAgU2Vjb25kYXJ5ID0gJ3NlY29uZGFyeScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBheXN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICB0YXhwYXllcl9pZD86IFRheHBheWVySUQ7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBBZGRyZXNzRGF0YU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBmcm9tIDAgdG8gMSBpbmRpY2F0aW5nIFBsYWlkXFwncyBsZXZlbCBvZiBjb25maWRlbmNlIGluIHRoZSBwYWlyaW5nIGJldHdlZW4gdGhlIGVtcGxveWVyIGFuZCB0aGUgaW5zdGl0dXRpb24gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgY29uZmlkZW5jZV9zY29yZTogbnVtYmVyO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEVtcGxveWVyc1NlYXJjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVtcGxveWVyIG5hbWUgdG8gYmUgc2VhcmNoZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBwcm9kdWN0cyB0aGUgcmV0dXJuZWQgZW1wbG95ZXJzIHNob3VsZCBzdXBwb3J0LiBDdXJyZW50bHksIHRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gYFxcXCJkZXBvc2l0X3N3aXRjaFxcXCJgLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9lbXBsb3llcnMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtcGxveWVycyBtYXRjaGluZyB0aGUgc2VhcmNoIGNyaXRlcmlhLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3llcj59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1wbG95ZXJzOiBBcnJheTxFbXBsb3llcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGVtcGxveW1lbnQgZGV0YWlscyBmb3VuZCBvbiBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudERldGFpbHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgYW5udWFsX3NhbGFyeT86IFBheTtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9uIHdoaWNoIHRoZSBlbXBsb3llZSB3YXMgaGlyZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGhpcmVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIElmIHByb3ZpZGVkLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSBhY2NvdW50IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIEVNSSBhY2NvdW50IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBlbWlfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaG9sZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAgICAgKi9cbiAgICBiYWNzOiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgaW50ZXJ2YWw/OiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBJZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgdGhlIGZpcnN0IHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVCYXNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHBheW1lbnQuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyB3ZWVrbHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIG1vbnRobHksIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHdoaWNoIGRheSBvZiB0aGUgbW9udGggdG8gbWFrZSB0aGUgcGF5bWVudCBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBtb250aC4gVG8gbWFrZSBhIHBheW1lbnQgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSBwYXltZW50IG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gU3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIG9ubHkgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBlbmQgZGF0ZSAoaW5jbHVzaXZlKSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdGluZyBmb3IgaG9saWRheXMgb3Igd2Vla2VuZHMuICBXaWxsIGJlIHByb3ZpZGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIElmIHRoZSBzdGFydCBkYXRlIGRpZCBub3QgcmVxdWlyZSBhZGp1c3RtZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkanVzdGVkX3N0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSGVhbHRoSW5jaWRlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhJbmNpZGVudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIGluY2lkZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDIwLTEwLTMwVDE1OjI2OjQ4WlxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhlYWx0aEluY2lkZW50XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGluY2lkZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb24gdGhlIGhlYWx0aCBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jaWRlbnRVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGluY2lkZW50X3VwZGF0ZXM6IEFycmF5PEluY2lkZW50VXBkYXRlPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbEJhbGFuY2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBjYWxjdWxhdGVkIGhpc3RvcmljYWwgYmFsYW5jZSwgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBjdXJyZW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkIGFuZCBQbGFpZCBoYXMgcHJlcGFyZWQgYXMgbXVjaCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIGRhdGEgYXMgcG9zc2libGUgZm9yIHRoZSBJdGVtLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBiZXlvbmQgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3LCB1bmZldGNoZWQgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBzZWN1cml0aWVzIGhvbGRpbmcgYXQgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgc2VjdXJpdHlfaWRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBob2xkaW5nLCBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvc3QgYmFzaXMgb2YgdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIGNvc3RfYmFzaXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHF1YW50aXR5IG9mIHRoZSBhc3NldCBoZWxkLCBhcyByZXBvcnRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiB0aGUgc2VjdXJpdHkgaXMgYW4gb3B0aW9uLCBgcXVhbnRpdHlgIHdpbGwgcmVmbGVjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG9wdGlvbnMgKHR5cGljYWxseSB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cyBtdWx0aXBsaWVkIGJ5IDEwMCksIG5vdCB0aGUgbnVtYmVyIG9mIGNvbnRyYWN0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IG9yIHVwZGF0ZWQgaG9sZGluZ3MgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGFuIGludmVzdG1lbnQgYWNjb3VudC4gVGhlIHdlYmhvb2sgdHlwaWNhbGx5IGZpcmVzIG9uY2UgcGVyIGRheSwgYWZ0ZXIgbWFya2V0IGNsb3NlLCBpbiByZXNwb25zZSB0byBhbnkgbmV3bHkgYWRkZWQgaG9sZGluZ3Mgb3IgcHJpY2UgY2hhbmdlcyB0byBleGlzdGluZyBob2xkaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBIT0xESU5HU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19ob2xkaW5nczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdXBkYXRlZCBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVwZGF0ZWRfaG9sZGluZ3M6IG51bWJlcjtcbn1cbi8qKlxuICogU3BlY2lmeSB0aGUgaG9sZGluZ3Mgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdzT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gTXVsdGlwbGUgY29zdCBiYXNpcyB2YWx1ZXMgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHB1cmNoYXNlZCBhdCBkaWZmZXJlbnQgcHJpY2VzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eTogU2VjdXJpdHlPdmVycmlkZTtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jaWRlbnRVcGRhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNpZGVudFVwZGF0ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGluY2lkZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzPzogSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHVwZGF0ZSB3YXMgcHVibGlzaGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDIwLTEwLTMwVDE1OjI2OjQ4WlxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgdXBkYXRlZF9kYXRlPzogc3RyaW5nO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEluY2lkZW50VXBkYXRlU3RhdHVzRW51bSB7XG4gICAgSW52ZXN0aWdhdGluZyA9ICdJTlZFU1RJR0FUSU5HJyxcbiAgICBJZGVudGlmaWVkID0gJ0lERU5USUZJRUQnLFxuICAgIFNjaGVkdWxlZCA9ICdTQ0hFRFVMRUQnLFxuICAgIFJlc29sdmVkID0gJ1JFU09MVkVEJyxcbiAgICBVbmtub3duID0gJ1VOS05PV04nXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJyZWFrZG93biBvZiB0aGUgZGlmZmVyZW50IGluY29tZSB0eXBlcyBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbmNvbWUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAgIGBcXFwicmVndWxhclxcXCJgOiByZWd1bGFyIGluY29tZSAgIGBcXFwib3ZlcnRpbWVcXFwiYDogb3ZlcnRpbWUgaW5jb21lICAgIGBcXFwiYm9udXNcXFwiYDogYm9udXMgaW5jb21lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgdHlwZTogSW5jb21lQnJlYWtkb3duVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIGhvdXJseSByYXRlIGF0IHdoaWNoIHRoZSBpbmNvbWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaG91cnMgbG9nZ2VkIGZvciB0aGlzIGluY29tZSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBwYXkgZm9yIHRoaXMgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJbmNvbWVCcmVha2Rvd25UeXBlRW51bSB7XG4gICAgQm9udXMgPSAnYm9udXMnLFxuICAgIE92ZXJ0aW1lID0gJ292ZXJ0aW1lJyxcbiAgICBSZWd1bGFyID0gJ3JlZ3VsYXInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpZWQgZmllbGRzIGZyb20gYSBwYXlzdHViIHZlcmlmaWNhdGlvbi4gQWxsIGZpZWxkcyBhcmUgcHJvdmlkZWQgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbXBsb3llcl9uYW1lOiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBlbXBsb3llZV9uYW1lOiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7WVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB5dGRfZ3Jvc3NfaW5jb21lOiBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7WVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX25ldF9pbmNvbWU6IFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgcHJvamVjdGVkX3dhZ2U6IFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdmVyaWZpZWRfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmcge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBlbmRwb2ludCB0byB3aGljaCBQbGFpZCBzaG91bGQgc2VuZCB3ZWJob29rcyByZWxhdGVkIHRvIHRoZSBwcm9ncmVzcyBvZiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1Yi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbiBmb3Igd2hpY2ggdG8gZ2V0IHBheXN0dWIgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHViL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheXN0dWI6IFBheXN0dWI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24gZm9yIHdoaWNoIHRvIGdldCBwYXlzdHViIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheXN0dWJzOiBBcnJheTxQYXlzdHViPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YT86IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llclxcJ3MgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llclxcJ3MgdGF4IGlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llclxuICAgICAqL1xuICAgIHRheF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm8ge1xuICAgIC8qKlxuICAgICAqIElzIHRoZSB1c2VyIGN1cnJlbnRseSBhY3RpdmUgZHV0eSBpbiB0aGUgVVMgbWlsaXRhcnlcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAgICAgKi9cbiAgICBpc19hY3RpdmVfZHV0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBzZXJ2aW5nIGluIHRoZSBVUyBtaWxpdGFyeSwgdGhlIGJyYW5jaCBvZiB0aGUgbWlsaXRhcnkgdGhleSBhcmUgc2VydmluZyBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gICAgICovXG4gICAgYnJhbmNoPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9CcmFuY2hFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvQnJhbmNoRW51bSB7XG4gICAgQWlyRm9yY2UgPSAnQUlSIEZPUkNFJyxcbiAgICBBcm15ID0gJ0FSTVknLFxuICAgIENvYXN0R3VhcmQgPSAnQ09BU1QgR1VBUkQnLFxuICAgIE1hcmluZXMgPSAnTUFSSU5FUycsXG4gICAgTmF2eSA9ICdOQVZZJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveWVyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcHJlY2hlY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZVxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZGVuY2UgdGhhdCBQbGFpZCBjYW4gc3VwcG9ydCB0aGUgdXNlciBpbiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiSElHSFxcXCJgOiBUaGlzIHByZWNoZWNrIGluZm9ybWF0aW9uIHN1Ym1pdHRlZCBpcyBkZWZpbml0aXZlbHkgdGllZCB0byBhIFBsYWlkLXN1cHBvcnRlZCBpbnRlZ3JhdGlvbi4gIFxcXCJgTE9XYFxcXCI6IFRoaXMgcHJlY2hlY2sgaW5mb3JtYXRpb24gc3VibWl0dGVkIGlzIGtub3duIG5vdCB0byBiZSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBgXFxcIlVOS05PV05cXFwiYDogSXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIHVzZXIgaXMgc3VwcG9ydGFibGUgd2l0aCB0aGUgaW5mb3JtYXRpb24gcGFzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlQ29uZmlkZW5jZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZUNvbmZpZGVuY2VFbnVtIHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIExvdyA9ICdMT1cnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NEYXRhTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGhvbWVfYWRkcmVzcz86IEFkZHJlc3NEYXRhTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25SZXF1ZXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25SZWZyZXNoU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fcmVmcmVzaF9zdGF0dXM6IFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlIGhhcyBjaGFuZ2VkLiBJdCB3aWxsIHR5cGljYWxseSB0YWtlIHNldmVyYWwgbWludXRlcyBmb3IgdGhpcyB3ZWJob29rIHRvIGZpcmUgYWZ0ZXIgdGhlIGVuZCB1c2VyIGhhcyB1cGxvYWRlZCB0aGVpciBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYFxcXCJJTkNPTUVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgaW5jb21lX3ZlcmlmaWNhdGlvbmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCBvZiB0aGUgdmVyaWZpY2F0aW9uIGluc3RhbmNlIHdob3NlIHN0YXR1cyBpcyBiZWluZyByZXBvcnRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGF0dXMgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfVVBMT0FEX0VSUk9SYDogQW4gdXBsb2FkIGVycm9yIG9jY3VycmVkIHdoZW4gdGhlIGVuZCB1c2VyIGF0dGVtcHRlZCB0byB1cGxvYWQgdGhlaXIgdmVyaWZpY2F0aW9uIGRvY3VtZW50YXRpb24uICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19JTlZBTElEX1RZUEVgOiBUaGUgZW5kIHVzZXIgYXR0ZW1wdGVkIHRvIHVwbG9hZCB2ZXJpZmljYXRpb24gZG9jdW1lbnRhdGlvbiBpbiBhbiB1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdC4gIGBWRVJJRklDQVRJT05fU1RBVFVTX0RPQ1VNRU5UX1JFSkVDVEVEYDogVGhlIGRvY3VtZW50YXRpb24gdXBsb2FkZWQgYnkgdGhlIGVuZCB1c2VyIHdhcyByZWNvZ25pemVkIGFzIGEgc3VwcG9ydGVkIGZpbGUgZm9ybWF0LCBidXQgbm90IHJlY29nbml6ZWQgYXMgYSB2YWxpZCBwYXlzdHViLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBzdHJpbmc7XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vc3VtbWFyeS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3N1bW1hcnkvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgaW5jb21lIHN1bW1hcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluY29tZV9zdW1tYXJpZXM6IEFycmF5PEluY29tZVN1bW1hcnk+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRheGZvcm1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUYXhmb3JtPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRheGZvcm1zOiBBcnJheTxUYXhmb3JtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRNZXRhZGF0YT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBgaW5mbG93X21vZGVsYCBhbGxvd3MgeW91IHRvIG1vZGVsIGEgdGVzdCBhY2NvdW50IHRoYXQgcmVjZWl2ZXMgcmVndWxhciBpbmNvbWUgb3IgbWFrZSByZWd1bGFyIHBheW1lbnRzIG9uIGEgbG9hbi4gQW55IHRyYW5zYWN0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIGBpbmZsb3dfbW9kZWxgIHdpbGwgYXBwZWFyIGluIGFkZGl0aW9uIHRvIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0IGRhdGEgb3IgdHJhbnNhY3Rpb25zIHNwZWNpZmllZCBieSBgb3ZlcnJpZGVfYWNjb3VudHNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmZsb3dNb2RlbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZmxvd01vZGVsIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBJbmZsb3cgbW9kZWwuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYG5vbmVgOiBObyBpbmNvbWUgYG1vbnRobHktaW5jb21lYDogSW5jb21lIG9jY3VycyBvbmNlIHBlciBtb250aCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgOiBQYXlzIG9mZiB0aGUgYmFsYW5jZSBvbiBhIGxpYWJpbGl0eSBhY2NvdW50IGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnQgZGF5IG9mIG1vbnRoIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGA6IE1ha2VzIGFuIGludGVyZXN0LW9ubHkgcGF5bWVudCBvbiBhIGxpYWJpbGl0eSBhY2NvdW50IGF0IHRoZSBnaXZlbiBzdGF0ZW1lbnQgZGF5IG9mIG1vbnRoLiBOb3RlIHRoYXQgYWNjb3VudCB0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMgd2lsbCBhY2NydWUgaW50ZXJlc3QgaW4gdGhlIFNhbmRib3guIFRoZSB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggc3VidHlwZSBgY3JlZGl0YCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBpbmNvbWUgcGVyIG1vbnRoLiBUaGlzIHZhbHVlIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgaW5jb21lX2Ftb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgaW5jb21lIHRyYW5zYWN0aW9uIHdpbGwgYXBwZWFyLiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1pbmNvbWVgLCBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBwYXltZW50X2RheV9vZl9tb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgYmV0d2VlbiAxIGFuZCAyOCwgb3IgYGxhc3RgIG1lYW5pbmcgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRheSBvZiB0aGUgbW9udGggb24gd2hpY2ggdGhlIGJhbGFuY2UgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgc3RhdGVtZW50X2RheV9vZl9tb250aDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluaXRpYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5JVElBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcsIHVuZmV0Y2hlZCB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyByZWxhdGluZyB0byBhIHNwZWNpZmljIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgUGxhaWQgcHJvZHVjdHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IG9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IEF1dGggd2lsbCByZXR1cm4gYGF1dGhgIGluIHRoZSBwcm9kdWN0IGFycmF5OyBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgbGlzdCBgYXV0aGAgbWF5IHN0aWxsIHN1cHBvcnQgb3RoZXIgQXV0aCBtZXRob2RzIHN1Y2ggYXMgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBWZXJpZmljYXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbRnVsbCBBdXRoIGNvdmVyYWdlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ29cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGxvZ28/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcGFydGlhbCBsaXN0IG9mIHJvdXRpbmcgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLiBUaGlzIGxpc3QgaXMgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGxvb2tpbmcgdXAgaW5zdGl0dXRpb25zIGJ5IHJvdXRpbmcgbnVtYmVyLiBJdCBpcyBub3QgY29tcHJlaGVuc2l2ZSBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYXMgYSBjb21wbGV0ZSBsaXN0IG9mIHJvdXRpbmcgbnVtYmVycyBmb3IgYW4gaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXJzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdGl0dXRpb24gaGFzIGFuIE9BdXRoIGxvZ2luIGZsb3cuIFRoaXMgaXMgcHJpbWFyaWx5IHJlbGV2YW50IHRvIGluc3RpdHV0aW9ucyB3aXRoIEV1cm9wZWFuIGNvdW50cnkgY29kZXMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgb2F1dGg6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHN0YXR1cz86IEluc3RpdHV0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgYXV0aF9tZXRhZGF0YT86IEF1dGhNZXRhZGF0YSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYW4gaW5zdGl0dXRpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgaGVhbHRoIG9mIGl0cyBJdGVtIGxvZ2lucywgVHJhbnNhY3Rpb25zIHVwZGF0ZXMsIEludmVzdG1lbnRzIHVwZGF0ZXMsIExpYWJpbGl0aWVzIHVwZGF0ZXMsIEF1dGggcmVxdWVzdHMsIEJhbGFuY2UgcmVxdWVzdHMsIElkZW50aXR5IHJlcXVlc3RzLCBJbnZlc3RtZW50cyByZXF1ZXN0cywgYW5kIExpYWJpbGl0aWVzIHJlcXVlc3RzLiBBIGxvZ2luIGF0dGVtcHQgaXMgY29uZHVjdGVkIGR1cmluZyB0aGUgaW5pdGlhbCBJdGVtIGFkZCBpbiBMaW5rLiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHRyYWZmaWMgdG8gYWNjdXJhdGVseSBjYWxjdWxhdGUgYW4gaW5zdGl0dXRpb25cXCdzIHN0YXR1cywgUGxhaWQgd2lsbCByZXR1cm4gbnVsbCByYXRoZXIgdGhhbiBwb3RlbnRpYWxseSBpbmFjY3VyYXRlIGRhdGEuICBJbnN0aXR1dGlvbiBzdGF0dXMgaXMgYWNjZXNzaWJsZSBpbiB0aGUgRGFzaGJvYXJkIGFuZCB2aWEgdGhlIEFQSSB1c2luZyB0aGUgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYCBlbmRwb2ludCB3aXRoIHRoZSBgaW5jbHVkZV9zdGF0dXNgIG9wdGlvbiBzZXQgdG8gdHJ1ZS4gTm90ZSB0aGF0IGluc3RpdHV0aW9uIHN0YXR1cyBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaXRlbV9sb2dpbnM6IFByb2R1Y3RTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZXM6IFByb2R1Y3RTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgYXV0aDogUHJvZHVjdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBQcm9kdWN0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBQcm9kdWN0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzX3VwZGF0ZXM6IFByb2R1Y3RTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgbGlhYmlsaXRpZXM/OiBQcm9kdWN0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogUHJvZHVjdFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9mIHJlY2VudCBoZWFsdGggaW5jaWRlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEhlYWx0aEluY2lkZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBoZWFsdGhfaW5jaWRlbnRzPzogQXJyYXk8SGVhbHRoSW5jaWRlbnQ+IHwgbnVsbDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0byBnZXQgZGV0YWlscyBhYm91dFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIFBsYWlkLXN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzIHRoaXMgaW5zdGl0dXRpb24gc3VwcG9ydHMsIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm4gYW4gaW5zdGl0dXRpb25cXCdzIGxvZ28sIGJyYW5kIGNvbG9yLCBhbmQgVVJMLiBXaGVuIGF2YWlsYWJsZSwgdGhlIGJhbmtcXCdzIGxvZ28gaXMgcmV0dXJuZWQgYXMgYSBiYXNlNjQgZW5jb2RlZCAxNTJ4MTUyIFBORywgdGhlIGJyYW5kIGNvbG9yIGlzIGluIGhleGFkZWNpbWFsIGZvcm1hdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC4gIE5vdGUgdGhhdCBQbGFpZCBkb2VzIG5vdCBvd24gYW55IG9mIHRoZSBsb2dvcyBzaGFyZWQgYnkgdGhlIEFQSSBhbmQgdGhhdCBieSBhY2Nlc3Npbmcgb3IgdXNpbmcgdGhlc2UgbG9nb3MsIHlvdSBhZ3JlZSB0aGF0IHlvdSBhcmUgZG9pbmcgc28gYXQgeW91ciBvd24gcmlzayBhbmQgd2lsbCwgaWYgbmVjZXNzYXJ5LCBvYnRhaW4gYWxsIHJlcXVpcmVkIHBlcm1pc3Npb25zIGZyb20gdGhlIGFwcHJvcHJpYXRlIHJpZ2h0cyBob2xkZXJzIGFuZCBhZGhlcmUgdG8gYW55IGFwcGxpY2FibGUgdXNhZ2UgZ3VpZGVsaW5lcy4gUGxhaWQgZGlzY2xhaW1zIGFsbCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxvZ29zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHRoZSByZXNwb25zZSB3aWxsIGluY2x1ZGUgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnN0aXR1dGlvbi4gRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3N0YXR1cz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgQXV0aCBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggYXV0aCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IEluc3RpdHV0aW9uO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIEluc3RpdHV0aW9ucyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gc2tpcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiBQbGFpZC1zdXBwb3J0ZWQgY291bnRyeSBjb2RlcyB0aGlzIGluc3RpdHV0aW9uIHN1cHBvcnRzLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnN0aXR1dGlvbnMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGljaCBwcm9kdWN0cyB0aGV5IHN1cHBvcnQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiByb3V0aW5nIG51bWJlcnMgdG8gZmlsdGVyIGluc3RpdHV0aW9ucy4gVGhlIHJlc3BvbnNlIHdpbGwgb25seSByZXR1cm4gaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggYWxsIG9mIHRoZSByb3V0aW5nIG51bWJlcnMgaW4gdGhlIGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogTGltaXQgcmVzdWx0cyB0byBpbnN0aXR1dGlvbnMgd2l0aCBvciB3aXRob3V0IE9BdXRoIGxvZ2luIGZsb3dzLiBUaGlzIGlzIHByaW1hcmlseSByZWxldmFudCB0byBpbnN0aXR1dGlvbnMgd2l0aCBFdXJvcGVhbiBjb3VudHJ5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIHRoZSBpbnN0aXR1dGlvblxcJ3MgaG9tZXBhZ2UgVVJMLCBsb2dvIGFuZCBwcmltYXJ5IGJyYW5kIGNvbG9yLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJLCBhbmQgdGhhdCBieSBhY2Nlc3Npbmcgb3IgdXNpbmcgdGhlc2UgbG9nb3MsIHlvdSBhZ3JlZSB0aGF0IHlvdSBhcmUgZG9pbmcgc28gYXQgeW91ciBvd24gcmlzayBhbmQgd2lsbCwgaWYgbmVjZXNzYXJ5LCBvYnRhaW4gYWxsIHJlcXVpcmVkIHBlcm1pc3Npb25zIGZyb20gdGhlIGFwcHJvcHJpYXRlIHJpZ2h0cyBob2xkZXJzIGFuZCBhZGhlcmUgdG8gYW55IGFwcGxpY2FibGUgdXNhZ2UgZ3VpZGVsaW5lcy4gUGxhaWQgZGlzY2xhaW1zIGFsbCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxvZ29zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFBsYWlkIEluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge0FycmF5PEluc3RpdHV0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbnM6IEFycmF5PEluc3RpdHV0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBhdmFpbGFibGUgdmlhIHRoaXMgZW5kcG9pbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgaW5zdGl0dXRpb25zIGJ5IHZhcmlvdXMgUGF5bWVudCBJbml0aWF0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnkuIEluc3RpdHV0aW9ucyB3aXRoIG5hbWVzIG1hdGNoaW5nIHRoZSBxdWVyeSBhcmUgcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdGhlIEluc3RpdHV0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgc3VwcG9ydCBhbGwgcHJvZHVjdHMgbGlzdGVkIGluIGBwcm9kdWN0c2AuIFByb3ZpZGUgYG51bGxgIHRvIGdldCBpbnN0aXR1dGlvbnMgcmVnYXJkbGVzcyBvZiBzdXBwb3J0ZWQgcHJvZHVjdHMuIE5vdGUgdGhhdCB3aGVuIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBpZiB5b3UgYXJlIGVuYWJsZWQgZm9yIEluc3RhbnQgTWF0Y2ggb3IgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IHRob3NlIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQgZXZlbiBpZiBgYXV0aGAgaXMgbm90IHByZXNlbnQgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIFBsYWlkLXN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzIHRoaXMgaW5zdGl0dXRpb24gc3VwcG9ydHMsIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gVGhpcyBpcyBwcmltYXJpbHkgcmVsZXZhbnQgdG8gaW5zdGl0dXRpb25zIHdpdGggRXVyb3BlYW4gY291bnRyeSBjb2Rlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaW5pdGlhdGlvbj86IEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBpbnN0aXR1dGlvbnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYVxuICAgICAqIEB0eXBlIHtBcnJheTxJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zOiBBcnJheTxJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50cy1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB3aXRoaW4gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsZWdhY3kgZmllbGQgZm9ybWVybHkgdXNlZCBpbnRlcm5hbGx5IGJ5IFBsYWlkIHRvIGlkZW50aWZ5IGNlcnRhaW4gY2FuY2VsZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2FuY2VsX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24sIG9yIHRyYW5zYWN0ZWQgZGF0ZSBmb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbuKAmXMgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBsZXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBkZWJpdGVkLCBlLmcuIHB1cmNoYXNlcyBvZiBzdG9jazsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBjcmVkaXRlZCwgZS5nLiBzYWxlcyBvZiBzdG9jay4gVHJlYXRtZW50IHJlbWFpbnMgdGhlIHNhbWUgZm9yIGNhc2gtb25seSBtb3ZlbWVudHMgdW5hc3NvY2lhdGVkIHdpdGggc2VjdXJpdGllcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmVlczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYW5jZWxgOiBBIGNhbmNlbGxhdGlvbiBvZiBhIHBlbmRpbmcgdHJhbnNhY3Rpb24gYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgd2hpY2ggbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyICBGb3IgZGVzY3JpcHRpb25zIG9mIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbSW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNpbnZlc3RtZW50LXRyYW5zYWN0aW9uLXR5cGVzLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHN1YnR5cGU6IEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJ1eSA9ICdidXknLFxuICAgIFNlbGwgPSAnc2VsbCcsXG4gICAgQ2FuY2VsID0gJ2NhbmNlbCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBGZWUgPSAnZmVlJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2Zlcidcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZUVudW0ge1xuICAgIEFjY291bnRGZWUgPSAnYWNjb3VudCBmZWUnLFxuICAgIEFzc2lnbm1lbnQgPSAnYXNzaWdubWVudCcsXG4gICAgQnV5ID0gJ2J1eScsXG4gICAgQnV5VG9Db3ZlciA9ICdidXkgdG8gY292ZXInLFxuICAgIENvbnRyaWJ1dGlvbiA9ICdjb250cmlidXRpb24nLFxuICAgIERlcG9zaXQgPSAnZGVwb3NpdCcsXG4gICAgRGlzdHJpYnV0aW9uID0gJ2Rpc3RyaWJ1dGlvbicsXG4gICAgRGl2aWRlbmQgPSAnZGl2aWRlbmQnLFxuICAgIERpdmlkZW5kUmVpbnZlc3RtZW50ID0gJ2RpdmlkZW5kIHJlaW52ZXN0bWVudCcsXG4gICAgRXhlcmNpc2UgPSAnZXhlcmNpc2UnLFxuICAgIEV4cGlyZSA9ICdleHBpcmUnLFxuICAgIEZ1bmRGZWUgPSAnZnVuZCBmZWUnLFxuICAgIEludGVyZXN0ID0gJ2ludGVyZXN0JyxcbiAgICBJbnRlcmVzdFJlY2VpdmFibGUgPSAnaW50ZXJlc3QgcmVjZWl2YWJsZScsXG4gICAgSW50ZXJlc3RSZWludmVzdG1lbnQgPSAnaW50ZXJlc3QgcmVpbnZlc3RtZW50JyxcbiAgICBMZWdhbEZlZSA9ICdsZWdhbCBmZWUnLFxuICAgIExvYW5QYXltZW50ID0gJ2xvYW4gcGF5bWVudCcsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpbiA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluJyxcbiAgICBMb25nVGVybUNhcGl0YWxHYWluUmVpbnZlc3RtZW50ID0gJ2xvbmctdGVybSBjYXBpdGFsIGdhaW4gcmVpbnZlc3RtZW50JyxcbiAgICBNYW5hZ2VtZW50RmVlID0gJ21hbmFnZW1lbnQgZmVlJyxcbiAgICBNYXJnaW5FeHBlbnNlID0gJ21hcmdpbiBleHBlbnNlJyxcbiAgICBNZXJnZXIgPSAnbWVyZ2VyJyxcbiAgICBNaXNjZWxsYW5lb3VzRmVlID0gJ21pc2NlbGxhbmVvdXMgZmVlJyxcbiAgICBOb25RdWFsaWZpZWREaXZpZGVuZCA9ICdub24tcXVhbGlmaWVkIGRpdmlkZW5kJyxcbiAgICBOb25SZXNpZGVudFRheCA9ICdub24tcmVzaWRlbnQgdGF4JyxcbiAgICBQZW5kaW5nQ3JlZGl0ID0gJ3BlbmRpbmcgY3JlZGl0JyxcbiAgICBQZW5kaW5nRGViaXQgPSAncGVuZGluZyBkZWJpdCcsXG4gICAgUXVhbGlmaWVkRGl2aWRlbmQgPSAncXVhbGlmaWVkIGRpdmlkZW5kJyxcbiAgICBSZWJhbGFuY2UgPSAncmViYWxhbmNlJyxcbiAgICBSZXR1cm5PZlByaW5jaXBhbCA9ICdyZXR1cm4gb2YgcHJpbmNpcGFsJyxcbiAgICBTZWxsID0gJ3NlbGwnLFxuICAgIFNlbGxTaG9ydCA9ICdzZWxsIHNob3J0JyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpbiA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgU2hvcnRUZXJtQ2FwaXRhbEdhaW5SZWludmVzdG1lbnQgPSAnc2hvcnQtdGVybSBjYXBpdGFsIGdhaW4gcmVpbnZlc3RtZW50JyxcbiAgICBTcGluT2ZmID0gJ3NwaW4gb2ZmJyxcbiAgICBTcGxpdCA9ICdzcGxpdCcsXG4gICAgU3RvY2tEaXN0cmlidXRpb24gPSAnc3RvY2sgZGlzdHJpYnV0aW9uJyxcbiAgICBUYXggPSAndGF4JyxcbiAgICBUYXhXaXRoaGVsZCA9ICd0YXggd2l0aGhlbGQnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBUcmFuc2ZlckZlZSA9ICd0cmFuc2ZlciBmZWUnLFxuICAgIFRydXN0RmVlID0gJ3RydXN0IGZlZScsXG4gICAgVW5xdWFsaWZpZWRHYWluID0gJ3VucXVhbGlmaWVkIGdhaW4nLFxuICAgIFdpdGhkcmF3YWwgPSAnd2l0aGRyYXdhbCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBvciBjYW5jZWxlZCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gc2tpcCB3aGVuIGZldGNoaW5nIHRyYW5zYWN0aW9uIGhpc3RvcnlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFsbCBzZWN1cml0aWVzIGZvciB3aGljaCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgdHJhbnNhY3Rpb24gYmVpbmcgZmV0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbnMgYmVpbmcgZmV0Y2hlZFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXFwnXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgaW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogUG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIE11c3QgYmUgcG9zaXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBidXkgYW5kIG5lZ2F0aXZlIGlmIHRoZSB0eXBlIGlzIGEgc2VsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZmVlcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eT86IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdmFpbGFibGVfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4gYmlsbGVkIGZvciB0aGUgSXRlbS4gTm90ZSAtIGBiaWxsZWRfcHJvZHVjdHNgIGlzIHBvcHVsYXRlZCBpbiBhbGwgZW52aXJvbm1lbnRzIGJ1dCBvbmx5IHJlcXVlc3RzIGluIFByb2R1Y3Rpb24gYXJlIGJpbGxlZC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGJpbGxlZF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBSRkMgMzMzOSB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGNvbnNlbnQgcHJvdmlkZWQgYnkgdGhlIGVuZCB1c2VyIHdpbGwgZXhwaXJlLiBVcG9uIGNvbnNlbnQgZXhwaXJhdGlvbiwgdGhlIGl0ZW0gd2lsbCBlbnRlciB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlLiBUbyBjaXJjdW12ZW50IHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3IgYW5kIG1haW50YWluIGNvbnRpbnVvdXMgY29uc2VudCwgdGhlIGVuZCB1c2VyIGNhbiByZWF1dGhlbnRpY2F0ZSB2aWEgTGlua+KAmXMgdXBkYXRlIG1vZGUgaW4gYWR2YW5jZSBvZiB0aGUgY29uc2VudCBleHBpcmF0aW9uIHRpbWUuICBOb3RlIC0gVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucy4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgd2lsbCBiZSBudWxsLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgSXRlbXMgd2l0aCBzb21lIGZvcm1zIG9mIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24uICBgYmFja2dyb3VuZGAgLSBJdGVtIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBiYWNrZ3JvdW5kICBgdXNlcl9wcmVzZW50X3JlcXVpcmVkYCAtIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHVwZGF0ZV90eXBlOiBJdGVtVXBkYXRlVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSXRlbVVwZGF0ZVR5cGVFbnVtIHtcbiAgICBCYWNrZ3JvdW5kID0gJ2JhY2tncm91bmQnLFxuICAgIFVzZXJQcmVzZW50UmVxdWlyZWQgPSAndXNlcl9wcmVzZW50X3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG5ld19hY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHRvIGxpc3QgY29ubmVjdGVkIGFwcGxpY2F0aW9ucyBmb3IgYSB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25uZWN0ZWRBcHBsaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+O1xufVxuLyoqXG4gKiBVc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMsIGZvciBjbGllbnRzIG1ha2luZyBhIHJlcXVlc3Qgd2l0aG91dCBhbiBgYWNjZXNzX3Rva2VuYC4gVGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIHNlbGVjdCBjbGllbnRzIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4gTW9zdCBjbGllbnRzIHNob3VsZCBjYWxsIC9pdGVtL2ltcG9ydCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZSBoYXNoZWQgYnkgRkkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgZmlfdXNlcm5hbWVfaGFzaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9ucy9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjb3BlczogU2NvcGVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGR1cmluZyBlbnJvbGxtZW50LCB0aGlzIGZpZWxkIG11c3QgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHN0YXRlIHNlbnQgdG8gdGhlIHBhcnRuZXIgaW4gdGhlIE9BdXRoIExvZ2luIFVSSS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGBFTlJPTExNRU5UYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Njb3Blc0NvbnRleHR9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb250ZXh0OiBTY29wZXNDb250ZXh0O1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2l0aCBhbiBJdGVtLiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUVycm9yV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vZ2V0YCBhbmQgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1cz86IEl0ZW1TdGF0dXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHByb2R1Y3Qgc3RyaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2F1dGg6IEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gY29uZmlndXJlIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggYW4gSXRlbS4gUGxhaWQgZmlyZXMgYSB3ZWJob29rIGlmIGNyZWRlbnRpYWxzIGZhaWwuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBvZiB1c2VyIElEIGFuZCBhdXRoIHRva2VuIHBhaXIsIHBlcm1pdHRpbmcgUGxhaWQgdG8gYWdncmVnYXRlIGEgdXNlcuKAmXMgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIE9wYXF1ZSB1c2VyIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEF1dGhvcml6YXRpb24gdG9rZW4gUGxhaWQgd2lsbCB1c2UgdG8gYWdncmVnYXRlIHRoaXMgdXNlcuKAmXMgYWNjb3VudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgYXV0aF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vaW1wb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCBvbmNlIFBsYWlkIGNhbGN1bGF0ZXMgaW5jb21lIGZyb20gYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBgcHVibGljX3Rva2VuYCBmb3IgdGhlIHBhcnRpY3VsYXIgSXRlbSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYGFjY2Vzc190b2tlbmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgYHB1YmxpY190b2tlbmAsIG9idGFpbmVkIGZyb20gdGhlIExpbmsgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb3IgYC9zYW5kYm94L2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIHZhbHVlIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV0dXJuZWQgYGFjY2Vzc190b2tlbmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1SZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgbGFzdF93ZWJob29rPzogSXRlbVN0YXR1c0xhc3RXZWJob29rIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBmYWlsZWQgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHdlYmhvb2sgZmlyZWQgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzTGFzdFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSB3ZWJob29rIHdhcyBmaXJlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgc2VudF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3Qgd2ViaG9vayBjb2RlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgY29kZV9zZW50Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBsYXN0X3dlYmhvb2s/OiBJdGVtU3RhdHVzTGFzdFdlYmhvb2sgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggW0pXVCBsaWJyYXJpZXNdKGh0dHBzOi8vand0LmlvLyNsaWJyYXJpZXMtaW8pIHRvIHZlcmlmeSBQbGFpZCB3ZWJob29rc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBKV0tQdWJsaWNLZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKV0tQdWJsaWNLZXkge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbGcgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBhbGc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3J2IG1lbWJlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGN1cnZlIHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNydjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBraWQgKEtleSBJRCkgbWVtYmVyIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEgc3BlY2lmaWMga2V5LiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgaW5zdGFuY2UsIHRvIGNob29zZSBhbW9uZyBhIHNldCBvZiBrZXlzIHdpdGhpbiB0aGUgSldLIGR1cmluZyBrZXkgcm9sbG92ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGt0eSAoa2V5IHR5cGUpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBmYW1pbHkgdXNlZCB3aXRoIHRoZSBrZXksIHN1Y2ggYXMgUlNBIG9yIEVDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGt0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2UgKHB1YmxpYyBrZXkgdXNlKSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgaW50ZW5kZWQgdXNlIG9mIHRoZSBwdWJsaWMga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHVzZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB4IG1lbWJlciBjb250YWlucyB0aGUgeCBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB5IG1lbWJlciBjb250YWlucyB0aGUgeSBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUga2V5IHdhcyBjcmVhdGVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUga2V5IGV4cGlyZWQsIGluIFVuaXggdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBleHBpcmVkX2F0OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBIEpXVCBIZWFkZXIsIHVzZWQgZm9yIHdlYmhvb2sgdmFsaWRhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBKV1RIZWFkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKV1RIZWFkZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIG9mIHR5cGUgYExJQUJJTElUSUVTYCBhbmQgY29kZSBgREVGQVVMVF9VUERBVEVgIHdpbGwgYmUgZmlyZWQgd2hlbiBuZXcgb3IgdXBkYXRlZCBsaWFiaWxpdGllcyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYSBsaWFiaWxpdGllcyBpdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJQUJJTElUSUVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgXFwncyBmb3IgYWNjb3VudHMgdGhhdCBjb250YWluIG5ldyBsaWFiaWxpdGllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfbmV3X2xpYWJpbGl0aWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBsaWFiaWxpdGllcyBmaWVsZHMgdGhhdCBjaGFuZ2VkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcInBhc3RfYW1vdW50X2R1ZVxcXCJdIH1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZz47IH19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfbGlhYmlsaXRpZXM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfTtcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9saWFiaWxpdGllcy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBgb3B0aW9uc2AgY2Fubm90IGJlIG51bGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGxpYWJpbGl0eSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3JlZGl0IGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRDYXJkTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBjcmVkaXQ6IEFycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9ydGdhZ2UgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PE1vcnRnYWdlTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBtb3J0Z2FnZTogQXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3R1ZGVudCBsb2FuIGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTdHVkZW50TG9hbj59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzT2JqZWN0XG4gICAgICovXG4gICAgc3R1ZGVudDogQXJyYXk8U3R1ZGVudExvYW4+IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBsaWFiaWxpdHkgb2JqZWN0LCBlaXRoZXIgYGNyZWRpdGAgb3IgYHN0dWRlbnRgLiBNb3J0Z2FnZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIHRoZSBjdXN0b20gU2FuZGJveC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVyY2hhc2UgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIEZvciBzaW1wbGljaXR5LCB0aGlzIGlzIHRoZSBvbmx5IGludGVyZXN0IHJhdGUgdXNlZCB0byBjYWxjdWxhdGUgaW50ZXJlc3QgY2hhcmdlcy4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHB1cmNoYXNlX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjYXNoIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgY2FzaF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFsYW5jZSB0cmFuc2ZlciBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGJhbGFuY2VfdHJhbnNmZXJfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpYWwgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzcGVjaWFsX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgbGFzdF9wYXltZW50X2Ftb3VudGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBtaW5pbXVtX3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YCBvciBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19vdmVyZHVlYCBmaWVsZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgbG9hbiBwcmluY2lwYWwuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZXN0IHJhdGUgb24gdGhlIGxvYW4gYXMgYSBwZXJjZW50YWdlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5vbWluYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBpbnRlcmVzdCBjYXBpdGFsaXphdGlvbiBiZWdpbnMgYXQgdGhlIGdpdmVuIG51bWJlciBvZiBtb250aHMgYWZ0ZXIgbG9hbiBvcmlnaW5hdGlvbi4gQnkgZGVmYXVsdCBpbnRlcmVzdCBpcyBuZXZlciBjYXBpdGFsaXplZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9jYXBpdGFsaXphdGlvbl9ncmFjZV9wZXJpb2RfbW9udGhzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuUmVwYXltZW50TW9kZWx9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X21vZGVsOiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgZXhwZWN0ZWRfcGF5b2ZmX2RhdGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBndWFyYW50b3JgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgaXNfZmVkZXJhbGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX2ZlZGVyYWw6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsb2FuX25hbWVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBwYXltZW50X3JlZmVyZW5jZV9udW1iZXJgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBheW1lbnRfcmVmZXJlbmNlX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBzbGZfc3RhdHVzOiBQU0xGU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcmVwYXltZW50X3BsYW4uZGVzY3JpcHRpb25gIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuX2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGByZXBheW1lbnRfcGxhbi50eXBlYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGBcXFwiZXh0ZW5kZWQgZ3JhZHVhdGVkXFxcImAsIGBcXFwiZXh0ZW5kZWQgc3RhbmRhcmRcXFwiYCwgYFxcXCJncmFkdWF0ZWRcXFwiYCwgYFxcXCJpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnRcXFwiYCwgYFxcXCJpbmNvbWUtYmFzZWQgcmVwYXltZW50XFxcImAsIGBcXFwiaW50ZXJlc3Qgb25seVxcXCJgLCBgXFxcIm90aGVyXFxcImAsIGBcXFwicGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwicmV2aXNlZCBwYXkgYXMgeW91IGVhcm5cXFwiYCwgb3IgYFxcXCJzdGFuZGFyZFxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgc2VxdWVuY2VfbnVtYmVyYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXJ2aWNlcl9hZGRyZXNzOiBBZGRyZXNzO1xufVxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgcHJvdmlkZSBsaW1pdGVkIGFjY291bnQgZmlsdGVyaW5nOiBpdCB3aWxsIG9ubHkgZGlzcGxheSBJbnN0aXR1dGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCwgaWYgYGF1dGhgIGlzIHNwZWNpZmllZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgd2lsbCBhbHNvIGZpbHRlciBvdXQgYWNjb3VudHMgb3RoZXIgdGhhbiBgY2hlY2tpbmdgIGFuZCBgc2F2aW5nc2AgYWNjb3VudHMgb24gdGhlIEFjY291bnQgU2VsZWN0IHBhbmUuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50cy1zY2hlbWEpLiAgRm9yIGluc3RpdHV0aW9ucyB1c2luZyBPQXV0aCwgdGhlIGZpbHRlciB3aWxsIG5vdCBhZmZlY3QgdGhlIGxpc3Qgb2YgYWNjb3VudHMgc2hvd24gYnkgdGhlIGJhbmsgaW4gdGhlIE9BdXRoIHdpbmRvdy4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQWNjb3VudEZpbHRlcnMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBJbnZlc3RtZW50RmlsdGVyO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmsvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHlvdXIgYXBwbGljYXRpb24sIGFzIGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gTGluay4gTWF4aW11bSBsZW5ndGggb2YgMzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFuZ3VhZ2UgdGhhdCBMaW5rIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4uICBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogLSBFbmdsaXNoIChgXFwnZW5cXCdgKSAtIEZyZW5jaCAoYFxcJ2ZyXFwnYCkgLSBTcGFuaXNoIChgXFwnZXNcXCdgKSAtIER1dGNoIChgXFwnbmxcXCdgKSAgV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyZWQgaGVyZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5nIGluIHRoZSBjdXN0b21pemF0aW9uLCBvciB0aGUgY3VzdG9taXphdGlvbiB3aWxsIG5vdCBiZSBhcHBsaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2YgUGxhaWQtc3VwcG9ydGVkIGNvdW50cnkgY29kZXMgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluc3RpdHV0aW9ucyBmcm9tIGFsbCBsaXN0ZWQgY291bnRyaWVzIHdpbGwgYmUgc2hvd24uICBTdXBwb3J0ZWQgY291bnRyeSBjb2RlcyBhcmU6IGBVU2AsIGBDQWAsIGBFU2AsIGBGUmAsIGBHQmAsIGBJRWAsIGBOTGAuICBJZiBMaW5rIGlzIGxhdW5jaGVkIHdpdGggbXVsdGlwbGUgY291bnRyeSBjb2Rlcywgb25seSBwcm9kdWN0cyB0aGF0IHlvdSBhcmUgZW5hYmxlZCBmb3IgaW4gYWxsIGNvdW50cmllcyB3aWxsIGJlIHVzZWQgYnkgTGluay4gTm90ZSB0aGF0IHdoaWxlIGFsbCBjb3VudHJpZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCBpbiBTYW5kYm94IGFuZCBEZXZlbG9wbWVudCwgaW4gUHJvZHVjdGlvbiBvbmx5IFVTIGFuZCBDYW5hZGEgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gVG8gZ2FpbiBhY2Nlc3MgdG8gRXVyb3BlYW4gaW5zdGl0dXRpb25zIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LCBbZmlsZSBhIHByb2R1Y3QgYWNjZXNzIFN1cHBvcnQgdGlja2V0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcmVxdWVzdC1wcm9kdWN0LWFjY2VzcykgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuIElmIHlvdSBpbml0aWFsaXplIHdpdGggYSBFdXJvcGVhbiBjb3VudHJ5IGNvZGUsIHlvdXIgdXNlcnMgd2lsbCBzZWUgdGhlIEV1cm9wZWFuIGNvbnNlbnQgcGFuZWwgZHVyaW5nIHRoZSBMaW5rIGZsb3cuICBJZiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgbWFrZSBzdXJlIHRoZSBjb3VudHJ5IGNvZGVzIGluIHRoZSBjdXN0b21pemF0aW9uIG1hdGNoIHRob3NlIHNwZWNpZmllZCBpbiBgY291bnRyeV9jb2Rlc2AuIElmIGJvdGggYGNvdW50cnlfY29kZXNgIGFuZCBhIExpbmsgY3VzdG9taXphdGlvbiBhcmUgdXNlZCwgdGhlIHZhbHVlIGluIGBjb3VudHJ5X2NvZGVzYCBtYXkgb3ZlcnJpZGUgdGhlIHZhbHVlIGluIHRoZSBjdXN0b21pemF0aW9uLiAgSWYgdXNpbmcgdGhlIEF1dGggZmVhdHVyZXMgSW5zdGFudCBNYXRjaCwgU2FtZS1kYXkgTWljcm8tZGVwb3NpdHMsIG9yIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cywgYGNvdW50cnlfY29kZXNgIG11c3QgYmUgc2V0IHRvIGBbXFwnVVNcXCddYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byB1c2UuIElmIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCBzaG91bGQgYmUgb21pdHRlZDsgcmVxdWlyZWQgb3RoZXJ3aXNlLiBWYWxpZCBwcm9kdWN0cyBhcmU6ICBgdHJhbnNhY3Rpb25zYCwgYGF1dGhgLCBgaWRlbnRpdHlgLCBgYXNzZXRzYCwgYGludmVzdG1lbnRzYCwgYGxpYWJpbGl0aWVzYCwgYHBheW1lbnRfaW5pdGlhdGlvbmAsIGBkZXBvc2l0X3N3aXRjaGAsIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCAgYGJhbGFuY2VgIGlzICpub3QqIGEgdmFsaWQgdmFsdWUsIHRoZSBCYWxhbmNlIHByb2R1Y3QgZG9lcyBub3QgcmVxdWlyZSBleHBsaWNpdCBpbml0YWxpemF0aW9uIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5pdGlhbGl6ZWQgd2hlbiBhbnkgb3RoZXIgcHJvZHVjdCBpcyBpbml0aWFsaXplZC4gIE9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCAqYWxsKiByZXF1ZXN0ZWQgcHJvZHVjdHMgd2lsbCBiZSBzaG93biBpbiBMaW5rOyB0byBtYXhpbWl6ZSB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBsaXN0ZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBtaW5pbWFsIHByb2R1Y3Qgc2V0IHJlcXVpcmVkIGZvciB5b3VyIHVzZSBjYXNlLiBBZGRpdGlvbmFsIHByb2R1Y3RzIGNhbiBiZSBhZGRlZCBhZnRlciBMaW5rIGluaXRpYWxpemF0aW9uIGJ5IGNhbGxpbmcgdGhlIHJlbGV2YW50IGVuZHBvaW50cy4gRm9yIGRldGFpbHMgYW5kIGV4Y2VwdGlvbnMsIHNlZSBbQ2hvb3Npbmcgd2hlbiB0byBpbml0aWFsaXplIHByb2R1Y3RzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvYmVzdC1wcmFjdGljZXMvI2Nob29zaW5nLXdoZW4tdG8taW5pdGlhbGl6ZS1wcm9kdWN0cykuICBOb3RlIHRoYXQsIHVubGVzcyB5b3UgaGF2ZSBvcHRlZCB0byBkaXNhYmxlIEluc3RhbnQgTWF0Y2ggc3VwcG9ydCwgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IE1hdGNoIHdpbGwgYWxzbyBiZSBzaG93biBpbiBMaW5rIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBldmVuIHRob3VnaCB0aGVzZSBpbnN0aXR1dGlvbnMgZG8gbm90IGNvbnRhaW4gYGF1dGhgIGluIHRoZWlyIHByb2R1Y3QgYXJyYXkuICBJbiBQcm9kdWN0aW9uLCB5b3Ugd2lsbCBiZSBiaWxsZWQgZm9yIGVhY2ggcHJvZHVjdCB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE5vdGUgdGhhdCBhIHByb2R1Y3QgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSBhbiBJdGVtIG9uY2UgdGhlIEl0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGF0IHByb2R1Y3QuIFRvIHN0b3AgYmlsbGluZyBvbiBhbiBJdGVtIGZvciBzdWJzY3JpcHRpb24tYmFzZWQgcHJvZHVjdHMsIHN1Y2ggYXMgTGlhYmlsaXRpZXMsIEludmVzdG1lbnRzLCBhbmQgVHJhbnNhY3Rpb25zLCByZW1vdmUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzdGluYXRpb24gVVJMIHRvIHdoaWNoIGFueSB3ZWJob29rcyBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIHRvIHVwZGF0ZSwgdXNlZCB3aGVuIHVwZGF0aW5nIG9yIG1vZGlmeWluZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYC4gVXNlZCB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCB3aGVuIGNvbXBsZXRpbmcgdGhlIFNhbWUtZGF5IChtYW51YWwpIE1pY3JvLWRlcG9zaXQgZmxvdywgb3IgKG9wdGlvbmFsbHkpIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsgYXMgcGFydCBvZiB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChVSyBhbmQgRXVyb3BlKSBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIExpbmsgY3VzdG9taXphdGlvbiBmcm9tIHRoZSBQbGFpZCBEYXNoYm9hcmQgdG8gYmUgYXBwbGllZCB0byBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYGRlZmF1bHRgIGN1c3RvbWl6YXRpb24gd2lsbCBiZSB1c2VkLiBXaGVuIHVzaW5nIGEgTGluayBjdXN0b21pemF0aW9uLCB0aGUgbGFuZ3VhZ2UgaW4gdGhlIGN1c3RvbWl6YXRpb24gbXVzdCBtYXRjaCB0aGUgbGFuZ3VhZ2Ugc2VsZWN0ZWQgdmlhIHRoZSBgbGFuZ3VhZ2VgIHBhcmFtZXRlciwgYW5kIHRoZSBjb3VudHJpZXMgaW4gdGhlIGN1c3RvbWl6YXRpb24gc2hvdWxkIG1hdGNoIHRoZSBjb3VudHJ5IGNvZGVzIHNlbGVjdGVkIHZpYSBgY291bnRyeV9jb2Rlc2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfY3VzdG9taXphdGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJJIGluZGljYXRpbmcgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIGEgdXNlciBzaG91bGQgYmUgZm9yd2FyZGVkIGFmdGVyIGNvbXBsZXRpbmcgdGhlIExpbmsgZmxvdzsgdXNlZCB0byBzdXBwb3J0IE9BdXRoIGF1dGhlbnRpY2F0aW9uIGZsb3dzIHdoZW4gbGF1bmNoaW5nIExpbmsgaW4gdGhlIGJyb3dzZXIgb3IgdmlhIGEgd2Vidmlldy4gVGhlIGByZWRpcmVjdF91cmlgIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24gb3IgRGV2ZWxvcG1lbnQsIG11c3QgYmUgYW4gaHR0cHMgVVJJLiBUbyBzcGVjaWZ5IGFueSBzdWJkb21haW4sIHVzZSBgKmAgYXMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIsIGUuZy4gYGh0dHBzOi8vXyouZXhhbXBsZS5jb20vb2F1dGguaHRtbGAuIElmIGBhbmRyb2lkX3BhY2thZ2VfbmFtZWAgaXMgc3BlY2lmaWVkLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLiAgTm90ZSB0aGF0IGFueSByZWRpcmVjdCBVUkkgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIHJlZGlyZWN0IFVSSXMgbGlzdCBpbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIGFwcFxcJ3MgQW5kcm9pZCBwYWNrYWdlLiBSZXF1aXJlZCBpZiB1c2luZyB0aGUgYGxpbmtfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBvbiBBbmRyb2lkLiBXaGVuIGNyZWF0aW5nIGEgYGxpbmtfdG9rZW5gIGZvciBpbml0aWFsaXppbmcgTGluayBvbiBvdGhlciBwbGF0Zm9ybXMsIHRoaXMgZmllbGQgbXVzdCBiZSBsZWZ0IGJsYW5rLiBBbnkgcGFja2FnZSBuYW1lIHNwZWNpZmllZCBoZXJlIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCBBbmRyb2lkIHBhY2thZ2UgbmFtZXMgc2V0dGluZyBvbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbmRyb2lkX3BhY2thZ2VfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQWNjb3VudEZpbHRlcnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZpbHRlcnM/OiBMaW5rVG9rZW5BY2NvdW50RmlsdGVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuRVVDb25maWd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldV9jb25maWc/OiBMaW5rVG9rZW5FVUNvbmZpZztcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBjZXJ0YWluIEV1cm9wZS1vbmx5IGNvbmZpZ3VyYXRpb25zLCBhcyB3ZWxsIGFzIGNlcnRhaW4gbGVnYWN5IHVzZSBjYXNlcyBpbiBvdGhlciByZWdpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2g7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGh9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRoPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGg7XG59XG4vKipcbiAqIEJ5IGRlZmF1bHQsIExpbmsgd2lsbCBvbmx5IGRpc3BsYXkgYWNjb3VudCB0eXBlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIHByb2R1Y3RzIHN1cHBsaWVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gWW91IGNhbiBmdXJ0aGVyIGxpbWl0IHRoZSBhY2NvdW50cyBzaG93biBpbiBMaW5rIGJ5IHVzaW5nIGBhY2NvdW50X2ZpbHRlcnNgIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgc3VidHlwZXMgdG8gYmUgc2hvd24gaW4gTGluay4gT25seSB0aGUgc3BlY2lmaWVkIHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIFRoaXMgZmlsdGVyaW5nIGFwcGxpZXMgdG8gYm90aCB0aGUgQWNjb3VudCBTZWxlY3QgdmlldyAoaWYgZW5hYmxlZCkgYW5kIHRoZSBJbnN0aXR1dGlvbiBTZWxlY3Qgdmlldy4gSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIHNlbGVjdGVkIHN1YnR5cGVzIHdpbGwgYmUgb21pdHRlZCBmcm9tIExpbmsuIFRvIGluZGljYXRlIHRoYXQgYWxsIHN1YnR5cGVzIHNob3VsZCBiZSBzaG93biwgdXNlIHRoZSB2YWx1ZSBgXFxcImFsbFxcXCJgLiBJZiB0aGUgYGFjY291bnRfZmlsdGVyc2AgZmlsdGVyIGlzIHVzZWQsIGFueSBhY2NvdW50IHR5cGUgZm9yIHdoaWNoIGEgZmlsdGVyIGlzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBlbnRpcmVseSBvbWl0dGVkIGZyb20gTGluay4gIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50cy1zY2hlbWEpLiAgRm9yIGluc3RpdHV0aW9ucyB1c2luZyBPQXV0aCwgdGhlIGZpbHRlciB3aWxsIG5vdCBhZmZlY3QgdGhlIGxpc3Qgb2YgaW5zdGl0dXRpb25zIG9yIGFjY291bnRzIHNob3duIGJ5IHRoZSBiYW5rIGluIHRoZSBPQXV0aCB3aW5kb3cuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlcyB7XG4gICAgLyoqXG4gICAgICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH07XG4gICAgLyoqXG4gICAgICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGNyZWRpdGAtdHlwZSBhY2NvdW50c1xuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGNyZWRpdD86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9O1xuICAgIC8qKlxuICAgICAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBsb2FuYC10eXBlIGFjY291bnRzXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgbG9hbj86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9O1xuICAgIC8qKlxuICAgICAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBBdXRoIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IG9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgdGhlIEZsZXhpYmxlIEF1dGggcHJvZHVjdCAoY3VycmVudGx5IGluIGNsb3NlZCBiZXRhKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aCB7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbmFsIEF1dGggZmxvdyB0byB1c2UuIEN1cnJlbnRseSBvbmx5IHVzZWQgdG8gZW5hYmxlIEZsZXhpYmxlIEF1dGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBmbG93X3R5cGU6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtIHtcbiAgICBGbGV4aWJsZUF1dGggPSAnRkxFWElCTEVfQVVUSCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBEZXBvc2l0IFN3aXRjaCAoYmV0YSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZGVwb3NpdF9zd2l0Y2hgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGRlcG9zaXRfc3dpdGNoX2lkYCBwcm92aWRlZCBieSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSW5jb21lIChiZXRhKSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgb2YgdGhlIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSwgYXMgcHJvdmlkZWQgYnkgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgb2YgYW4gYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgYXMgcHJvdmlkZWQgYnkgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gUHJvdmlkaW5nIGFuIGBhc3NldF9yZXBvcnRfaWRgIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHVzZXIgdGhyb3VnaCBhIHN0cmVhbWxpbmVkIGZsb3cuIElmIHByb3ZpZGVkLCB0aGUgYmFuayBsaW5raW5nIGZsb3cgd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBwYXltZW50X2luaXRpYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlciB3aG8gd2lsbCBiZSBsaW5raW5nIHRoZWlyIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXIge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIuIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgYSB1c2VyIElEIG51bWJlciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuIEl0IGlzIGN1cnJlbnRseSB1c2VkIGFzIGEgbWVhbnMgb2Ygc2VhcmNoaW5nIGxvZ3MgZm9yIHRoZSBnaXZlbiB1c2VyIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUuIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgdXNlZCBpbiB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikgdG8gYXNzb2NpYXRlIEl0ZW1zIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyIGluIFtFLjE2NF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRS4xNjQpIGZvcm1hdC4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHBob25lIG51bWJlciB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHJlcXVpcmVkIHRvIGVuYWJsZSBhbnkgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuICAgT25seSBwYXNzIGEgdmVyaWZpY2F0aW9uIHRpbWUgZm9yIGEgcGhvbmUgbnVtYmVyIHRoYXQgeW91IGhhdmUgdmVyaWZpZWQuIElmIHlvdSBoYXZlIHBlcmZvcm1lZCB2ZXJpZmljYXRpb24gYnV0IGRvbuKAmXQgaGF2ZSB0aGUgdGltZSwgeW91IG1heSBzdXBwbHkgYSBzaWduYWwgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBVTklYIGVwb2NoLiAgIEV4YW1wbGU6IGAyMDIwLTAxLTAxVDAwOjAwOjAwWmAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJfdmVyaWZpZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgW3ByZS1hdXRoZW50aWNhdGVkIHJldHVybmluZyB1c2VyIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlci8jZW5hYmxpbmctdGhlLXJldHVybmluZy11c2VyLWV4cGVyaWVuY2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgZW1haWwgYWRkcmVzcyB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gICBPbmx5IHBhc3MgYSB2ZXJpZmljYXRpb24gdGltZSBmb3IgYW4gZW1haWwgYWRkcmVzcyB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzX3ZlcmlmaWVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwiZGRkLWRkLWRkZGRcXFwiLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCB3aWxsIHN1cHBvcnQgbm90LXlldC1pbXBsZW1lbnRlZCBmdW5jdGlvbmFsaXR5IGZvciBuZXcgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwieXl5eS1tbS1kZFxcXCIuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwgYW5kIHdpbGwgc3VwcG9ydCBub3QteWV0LWltcGxlbWVudGVkIGZ1bmN0aW9uYWxpdHkgZm9yIG5ldyBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBBIGBsaW5rX3Rva2VuYCBjcmVhdGVkIHRvIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgdGhhdCB3aWxsIGJlIGV4Y2hhbmdlZCBmb3IgYSBuZXcgYGFjY2Vzc190b2tlbmAgZXhwaXJlcyBhZnRlciA0IGhvdXJzLiBBIGBsaW5rX3Rva2VuYCBjcmVhdGVkIGZvciBhbiBleGlzdGluZyBJdGVtIChzdWNoIGFzIHdoZW4gdXBkYXRpbmcgYW4gZXhpc3RpbmcgYGFjY2Vzc190b2tlbmAgYnkgbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUpIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgRVUgZmxvd3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5FVUNvbmZpZyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBvcGVuIExpbmsgd2l0aG91dCBhbiBpbml0aWFsIFVJLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5FVUNvbmZpZ1xuICAgICAqL1xuICAgIGhlYWRsZXNzPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50cyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWN0c2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGB3ZWJob29rYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb3VudHJ5X2NvZGVzYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnlfY29kZXM6IEFycmF5PENvdW50cnlDb2RlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGxhbmd1YWdlYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50RmlsdGVyc1Jlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogQWNjb3VudEZpbHRlcnNSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlZGlyZWN0X3VyaWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfbmFtZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogTGlua1Rva2VuR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGBsaW5rX3Rva2VuYCBmcm9tIGEgcHJldmlvdXMgaW52b2NhdGlvbiBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtUb2tlbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwaXJhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkZpbHRlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50cy1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMb2FuRmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRpdHVkZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBsYXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxvbmdpdHVkZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBsb246IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IGRlZmluZWQgc3RvcmUgbnVtYmVyIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIHN0b3JlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBtdWx0aS1mYWN0b3IgYXV0aGVudGljYXRpb24gc2V0dGluZ3MgdG8gdXNlIHdpdGggdGhpcyB0ZXN0IGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTUZBXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUZBIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBkZXZpY2VgLCBgc2VsZWN0aW9uc2AsIG9yIGBxdWVzdGlvbnNgLiAgSWYgdmFsdWUgaXMgYGRldmljZWAsIHRoZSBNRkEgYW5zd2VyIGlzIGAxMjM0YC4gIElmIHZhbHVlIGlzIGBzZWxlY3Rpb25zYCwgdGhlIE1GQSBhbnN3ZXIgaXMgYWx3YXlzIHRoZSBmaXJzdCBvcHRpb24uICBJZiB2YWx1ZSBpcyBgcXVlc3Rpb25zYCwgdGhlIE1GQSBhbnN3ZXIgaXMgIGBhbnN3ZXJfPGk+XzxqPmAgZm9yIHRoZSBqLXRoIHF1ZXN0aW9uIGluIHRoZSBpLXRoIHJvdW5kLCBzdGFydGluZyBmcm9tIDAuIEZvciBleGFtcGxlLCB0aGUgYW5zd2VyIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiBpbiB0aGUgc2Vjb25kIHJvdW5kIGlzIGBhbnN3ZXJfMV8wYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHJvdW5kcyBvZiBxdWVzdGlvbnMuIFJlcXVpcmVkIGlmIHZhbHVlIG9mIGB0eXBlYCBpcyBgcXVlc3Rpb25zYC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25fcm91bmRzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHF1ZXN0aW9ucyBwZXIgcm91bmQuIFJlcXVpcmVkIGlmIHZhbHVlIG9mIGB0eXBlYCBpcyBgcXVlc3Rpb25zYC4gSWYgdmFsdWUgb2YgdHlwZSBpcyBgc2VsZWN0aW9uc2AsIGRlZmF1bHQgdmFsdWUgaXMgMi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBxdWVzdGlvbnNfcGVyX3JvdW5kOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHJvdW5kcyBvZiBzZWxlY3Rpb25zLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uc2AuIERlZmF1bHRzIHRvIDEuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBhdmFpbGFibGUgYW5zd2VycyBwZXIgcXVlc3Rpb24sIHVzZWQgaWYgYHR5cGVgIGlzIGBzZWxlY3Rpb25gLiBEZWZhdWx0cyB0byAyLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25zX3Blcl9xdWVzdGlvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBbGxvd3Mgc3BlY2lmeWluZyB0aGUgbWV0YWRhdGEgb2YgdGhlIHRlc3QgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNZXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBvZmZpY2lhbCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbGltaXRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlcjtcbn1cbi8qKlxuICogV2UgdXNlIHN0YW5kYXJkIEhUVFAgcmVzcG9uc2UgY29kZXMgZm9yIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbm90aWZpY2F0aW9ucywgYW5kIG91ciBlcnJvcnMgYXJlIGZ1cnRoZXIgY2xhc3NpZmllZCBieSBgZXJyb3JfdHlwZWAuIEluIGdlbmVyYWwsIDIwMCBIVFRQIGNvZGVzIGNvcnJlc3BvbmQgdG8gc3VjY2VzcywgNDBYIGNvZGVzIGFyZSBmb3IgZGV2ZWxvcGVyLSBvciB1c2VyLXJlbGF0ZWQgZmFpbHVyZXMsIGFuZCA1MFggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGlzc3Vlcy4gIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vZGVsRXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEVycm9yIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci4gU2FmZSBmb3IgcHJvZ3JhbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBNb2RlbEVycm9yRXJyb3JUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9kZWxFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVxdWVzdCwgdG8gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nIHB1cnBvc2VzLiBUaGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZCBpbiBlcnJvcnMgcHJvdmlkZWQgYnkgd2ViaG9va3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9kZWxFcnJvclxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhlIEFzc2V0cyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gICAgICogQHR5cGUge0FycmF5PGFueT59XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9kZWxFcnJvclxuICAgICAqL1xuICAgIHN0YXR1cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIFBsYWlkIGRvY3VtZW50YXRpb24gcGFnZSB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9kZWxFcnJvclxuICAgICAqL1xuICAgIGRvY3VtZW50YXRpb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1Z2dlc3RlZCBzdGVwcyBmb3IgcmVzb2x2aW5nIHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vZGVsRXJyb3JcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIE1vZGVsRXJyb3JFcnJvclR5cGVFbnVtIHtcbiAgICBJbnZhbGlkUmVxdWVzdCA9ICdJTlZBTElEX1JFUVVFU1QnLFxuICAgIEludmFsaWRSZXN1bHQgPSAnSU5WQUxJRF9SRVNVTFQnLFxuICAgIEludmFsaWRJbnB1dCA9ICdJTlZBTElEX0lOUFVUJyxcbiAgICBJbnN0aXR1dGlvbkVycm9yID0gJ0lOU1RJVFVUSU9OX0VSUk9SJyxcbiAgICBSYXRlTGltaXRFeGNlZWRlZCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICBBcGlFcnJvciA9ICdBUElfRVJST1InLFxuICAgIEl0ZW1FcnJvciA9ICdJVEVNX0VSUk9SJyxcbiAgICBBc3NldFJlcG9ydEVycm9yID0gJ0FTU0VUX1JFUE9SVF9FUlJPUicsXG4gICAgUmVjYXB0Y2hhRXJyb3IgPSAnUkVDQVBUQ0hBX0VSUk9SJyxcbiAgICBPYXV0aEVycm9yID0gJ09BVVRIX0VSUk9SJyxcbiAgICBQYXltZW50RXJyb3IgPSAnUEFZTUVOVF9FUlJPUicsXG4gICAgQmFua1RyYW5zZmVyRXJyb3IgPSAnQkFOS19UUkFOU0ZFUl9FUlJPUidcbn1cblxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgaW50ZXJlc3QgcmF0ZSBmb3IgdGhlIG1vcnRnYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlSW50ZXJlc3RSYXRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBQZXJjZW50YWdlIHZhbHVlIChpbnRlcmVzdCByYXRlIG9mIGN1cnJlbnQgbW9ydGdhZ2UsIG5vdCBBUFIpIG9mIGludGVyZXN0IHBheWFibGUgb24gYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbnRlcmVzdCBjaGFyZ2VkIChmaXhlZCBvciB2YXJpYWJsZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgbW9ydGdhZ2UgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUxpYWJpbGl0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG91dHN0YW5kaW5nIGFtb3VudCBjaGFyZ2VkIGZvciBsYXRlIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBjdXJyZW50X2xhdGVfZmVlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBoZWxkIGluIGVzY3JvdyB0byBwYXkgdGF4ZXMgYW5kIGluc3VyYW5jZSBvbiBiZWhhbGYgb2YgdGhlIGJvcnJvd2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgZXNjcm93X2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIGhhcyBwcml2YXRlIG1vcnRnYWdlIGluc3VyYW5jZSBpbiBlZmZlY3QuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaGFzX3BtaTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIHdpbGwgcGF5IGEgcGVuYWx0eSBmb3IgZWFybHkgcGF5b2ZmIG9mIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wcmVwYXltZW50X3BlbmFsdHk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZUludGVyZXN0UmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlOiBNb3J0Z2FnZUludGVyZXN0UmF0ZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgbG9hbiwgZm9yIGV4YW1wbGUgYGNvbnZlbnRpb25hbGAsIGBmaXhlZGAsIG9yIGB2YXJpYWJsZWAuIFRoaXMgZmllbGQgaXMgcHJvdmlkZWQgZGlyZWN0bHkgZnJvbSB0aGUgbG9hbiBzZXJ2aWNlciBhbmQgZG9lcyBub3QgaGF2ZSBhbiBlbnVtZXJhdGVkIHNldCBvZiBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsb2FuX3R5cGVfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRnVsbCBkdXJhdGlvbiBvZiBtb3J0Z2FnZSBhcyBhdCBvcmlnaW5hdGlvbiAoZS5nLiBgMTAgeWVhcmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90ZXJtOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmFsIGRhdGUgb24gd2hpY2ggbW9ydGdhZ2UgaXMgZHVlIGluIGZ1bGwuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBuZXh0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X21vbnRobHlfcGF5bWVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwcmluY2lwYWwgYmFsYW5jZSBvZiB0aGUgbW9ydGdhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBsb2FuIChwcmluY2lwYWwgKyBpbnRlcmVzdCkgcGFzdCBkdWUgZm9yIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwYXN0X2R1ZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vcnRnYWdlUHJvcGVydHlBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHByb3BlcnR5X2FkZHJlc3M6IE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIHRvIGRhdGUgKFlURCkgaW50ZXJlc3QgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHl0ZF9pbnRlcmVzdF9wYWlkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBZVEQgcHJpbmNpcGFsIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZpZWxkcyBkZXNjcmliaW5nIHByb3BlcnR5IGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZml2ZSBvciBuaW5lIGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSAoZXhhbXBsZSBcXFwiTkNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyAoZXhhbXBsZSBcXFwiNTY0IE1haW4gU3RyZWV0LCBBcHQgMTVcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV0IHBheSBhbW91bnQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldFBheSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERpc3RyaWJ1dGlvbkRldGFpbHM+fVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fZGV0YWlscz86IEFycmF5PERpc3RyaWJ1dGlvbkRldGFpbHM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgdG90YWw/OiBUb3RhbDtcbn1cbi8qKlxuICogQWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWVyIG51bWJlciBkYXRhIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0ZXN0IGFjY291bnQuIEFsbCB2YWx1ZXMgYXJlIG9wdGlvbmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVycyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGZvciB0aGUgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNoX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF93aXJlX3JvdXRpbmc/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRUZUIGluc3RpdHV0aW9uIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfYnJhbmNoYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgZWZ0X2luc3RpdHV0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBicmFuY2ggbnVtYmVyLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGVmdF9pbnN0aXR1dGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9icmFuY2g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQmFuayBpZGVudGlmaWVyIGNvZGUgKEJJQykuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9pYmFuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9iaWM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgbnVtYmVyIChJQkFOKS4gSWYgbm8gYWNjb3VudCBudW1iZXIgaXMgc3BlY2lmaWVkIHZpYSBgYWNjb3VudGAsIHdpbGwgYWxzbyBiZSB1c2VkIGFzIHRoZSBhY2NvdW50IG51bWJlciBieSBkZWZhdWx0LiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGludGVybmF0aW9uYWxfYmljYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbF9pYmFuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJBQ1Mgc29ydCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3Nfc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0gge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCB3aGVuIHVzaW5nIE9BdXRoIHdpdGggQ2hhc2UgQmFuayAoYGluc181NmApLCBDaGFzZSB3aWxsIGlzc3VlIFxcXCJ0b2tlbml6ZWRcXFwiIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVycywgd2hpY2ggYXJlIG5vdCB0aGUgdXNlclxcJ3MgYWN0dWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gVGhlc2UgdG9rZW5pemVkIG51bWJlcnMgc2hvdWxkIHdvcmsgaWRlbnRpY2FsbHkgdG8gbm9ybWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gVGhlIGRpZ2l0cyByZXR1cm5lZCBpbiB0aGUgbWFzayBmaWVsZCB3aWxsIGNvbnRpbnVlIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBhY2NvdW50IG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIHRva2VuaXplZCBhY2NvdW50IG51bWJlci4gSWYgYSB1c2VyIHJldm9rZXMgdGhlaXIgcGVybWlzc2lvbnMgdG8geW91ciBhcHAsIHRoZSB0b2tlbml6ZWQgbnVtYmVycyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgZm9yIEFDSCBkZXBvc2l0cywgYnV0IG5vdCB3aXRoZHJhd2Fscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBJZiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc181NmAsIHRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGFjY291bnRgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LCBpZiBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCB3aGVuIHVzaW5nIE9BdXRoIHdpdGggQ2hhc2UgQmFuayAoYGluc181NmApLCBDaGFzZSB3aWxsIGlzc3VlIFxcXCJ0b2tlbml6ZWRcXFwiIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVycywgd2hpY2ggYXJlIG5vdCB0aGUgdXNlclxcJ3MgYWN0dWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gVGhlc2UgdG9rZW5pemVkIG51bWJlcnMgc2hvdWxkIHdvcmsgaWRlbnRpY2FsbHkgdG8gbm9ybWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gVGhlIGRpZ2l0cyByZXR1cm5lZCBpbiB0aGUgbWFzayBmaWVsZCB3aWxsIGNvbnRpbnVlIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBhY2NvdW50IG51bWJlciwgcmF0aGVyIHRoYW4gdGhlIHRva2VuaXplZCBhY2NvdW50IG51bWJlci4gSWYgYSB1c2VyIHJldm9rZXMgdGhlaXIgcGVybWlzc2lvbnMgdG8geW91ciBhcHAsIHRoZSB0b2tlbml6ZWQgbnVtYmVycyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgZm9yIEFDSCBkZXBvc2l0cywgYnV0IG5vdCB3aXRoZHJhd2Fscy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIElmIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzU2YCwgdGhpcyBtYXkgYmUgYSB0b2tlbml6ZWQgcm91dGluZyBudW1iZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYWNjb3VudGAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgcm91dGluZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudCwgaWYgYXZhaWxhYmxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVSyBiYW5rIGFjY291bnQgdmlhIEJBQ1MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0JBQ1Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzRUZUIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYnJhbmNoIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGJyYW5jaDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYW4gaW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgdmlhIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogYGludmVzdG1lbnQ6YCBJbnZlc3RtZW50IGFjY291bnQgIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgb3RoZXI6YCBOb24tc3BlY2lmaWVkIGFjY291bnQgdHlwZSAgU2VlIHRoZSBbQWNjb3VudCB0eXBlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIGFjY291bnQgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcgc3VidHlwZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdmVycmlkZUFjY291bnRUeXBlIHtcbiAgICBJbnZlc3RtZW50ID0gJ2ludmVzdG1lbnQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIERlcG9zaXRvcnkgPSAnZGVwb3NpdG9yeScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIG90aGVyIHRlc3QgZGF0YSBpbiBvcmRlciB0byBhY2hpZXZlIG1vcmUgY29uc2lzdGVudCwgcmVhbGlzdGljIHRlc3QgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdmVycmlkZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHlwZTogT3ZlcnJpZGVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgc3RhcnQgd2l0aCB0aGlzIGFtb3VudCBhcyB0aGUgY3VycmVudCBiYWxhbmNlLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIGFsd2F5cyBoYXZlIHRoaXMgYW1vdW50IGFzIGl0cyAgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgZm9yY2VfYXZhaWxhYmxlX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBiZSBkZW5vbWluYXRlZCBpbiB0aGUgZ2l2ZW4gY3VycmVuY3kuIFRyYW5zYWN0aW9ucyB3aWxsIGFsc28gYmUgaW4gdGhpcyBjdXJyZW5jeSBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgbWV0YTogTWV0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG51bWJlcnM6IE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ3NPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogSG9sZGluZ3NPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBPd25lck92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGxpYWJpbGl0eTogTGlhYmlsaXR5T3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZmxvd01vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5mbG93X21vZGVsOiBJbmZsb3dNb2RlbDtcbn1cbi8qKlxuICogRGF0YSByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBPbmx5IHRoZSBgbmFtZXNgIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZXNlIHNob3VsZCBhbHdheXMgYmUgdGhlIG5hbWVzIG9mIGluZGl2aWR1YWxzLCBldmVuIGZvciBidXNpbmVzcyBhY2NvdW50cy4gSWYgdGhlIG5hbWUgb2YgYSBidXNpbmVzcyBpcyByZXBvcnRlZCwgcGxlYXNlIGNvbnRhY3QgUGxhaWQgU3VwcG9ydC4gSW4gdGhlIGNhc2Ugb2YgYSBqb2ludCBhY2NvdW50LCBQbGFpZCB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byByZXBvcnQgdGhlIG5hbWVzIG9mIGFsbCBhY2NvdW50IGhvbGRlcnMuICBJZiBhbiBJdGVtIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHdpdGggZGlmZmVyZW50IG93bmVyIG5hbWVzLCBzb21lIGluc3RpdHV0aW9ucyB3aWxsIHJlcG9ydCBhbGwgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGluIGVhY2ggYWNjb3VudFxcJ3MgYG5hbWVzYCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGhvbmVOdW1iZXI+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PFBob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbWFpbD59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxFbWFpbD47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgdmFyaW91cyBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PEFkZHJlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz47XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBBbnkgZmllbGRzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBkZWZhdWx0IFNhbmRib3ggaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE93bmVyT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lck92ZXJyaWRlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZXNlIHNob3VsZCBhbHdheXMgYmUgdGhlIG5hbWVzIG9mIGluZGl2aWR1YWxzLCBldmVuIGZvciBidXNpbmVzcyBhY2NvdW50cy4gTm90ZSB0aGF0IHRoZSBzYW1lIG5hbWUgZGF0YSB3aWxsIGJlIHVzZWQgZm9yIGFsbCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGhvbmVOdW1iZXI+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8UGhvbmVOdW1iZXI+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxFbWFpbD59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbWFpbHM6IEFycmF5PEVtYWlsPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IHRoZSB2YXJpb3VzIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFkZHJlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0dWRlbnRcXCdzIGVsaWdpYmlsaXR5IGluIHRoZSBQdWJsaWMgU2VydmljZSBMb2FuIEZvcmdpdmVuZXNzIHByb2dyYW0uIFRoaXMgaXMgb25seSByZXR1cm5lZCBpZiB0aGUgaW5zdGl0dXRpb24gaXMgRmVkbG9hbiAoYGluc18xMTY1MjdgKS4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBTTEZTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXN0aW1hdGVkIGRhdGUgYm9ycm93ZXIgd2lsbCBoYXZlIGNvbXBsZXRlZCAxMjAgcXVhbGlmeWluZyBtb250aGx5IHBheW1lbnRzLiBSZXR1cm5lZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBlc3RpbWF0ZWRfZWxpZ2liaWxpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gbWFkZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfbWFkZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgcmVtYWluaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBwYXltZW50c19yZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtb25ldGFyeSBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBudW1lcmljYWwgYW1vdW50IG9mIGEgc3BlY2lmaWMgY3VycmVuY3kuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW5jeSBjb2RlLCBlLmcuIFVTRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheUZyZXF1ZW5jeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheUZyZXF1ZW5jeSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2YWx1ZTogUGF5RnJlcXVlbmN5VmFsdWVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheUZyZXF1ZW5jeVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQYXlGcmVxdWVuY3lWYWx1ZUVudW0ge1xuICAgIE1vbnRobHkgPSAnbW9udGhseScsXG4gICAgU2VtaW1vbnRobHkgPSAnc2VtaW1vbnRobHknLFxuICAgIFdlZWtseSA9ICd3ZWVrbHknLFxuICAgIEJpd2Vla2x5ID0gJ2Jpd2Vla2x5JyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5UGVyaW9kRGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2QgZW5kIGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgZWFybmluZ3MgYmVmb3JlIHRheC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldCBhbW91bnQgb2YgdGhlIHBheWNoZWNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBjaGVja19hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHBheW1lbnQuIEZvciBzdGFuZGluZyBvcmRlcnMsIGBcXFwiR0JQXFxcImAgbXVzdCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5RW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC4gTWluaW11bSBhY2NlcHRlZCB2YWx1ZSBpcyBgMWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEFtb3VudEN1cnJlbmN5RW51bSB7XG4gICAgR2JwID0gJ0dCUCcsXG4gICAgRXVyID0gJ0VVUidcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uYWwgYWRkcmVzcyBvZiB0aGUgcGF5bWVudCByZWNpcGllbnQuIFRoaXMgb2JqZWN0IGlzIG5vdCBjdXJyZW50bHkgcmVxdWlyZWQgdG8gbWFrZSBwYXltZW50cyBmcm9tIFVLIGluc3RpdHV0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBwb3B1bGF0ZWQsIHRob3VnaCBtYXkgYmUgbmVjZXNzYXJ5IGZvciBmdXR1cmUgRXVyb3BlYW4gZXhwYW5zaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxlbmd0aCAxLTIgcmVwcmVzZW50aW5nIHRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgNzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAzNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDE2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSB0aGF0IGNhcHR1cmVzIHdoYXQgc3BlY2lmaWMgcGF5bWVudCBjb25maWd1cmF0aW9ucyBhbiBpbnN0aXR1dGlvbiBzdXBwb3J0cyB3aGVuIG1ha2luZyBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcGF5bWVudHMgZnJvbSBhIGRpZmZlcmVudCBjb3VudHJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfaW50ZXJuYXRpb25hbF9wYXltZW50czogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIG1hcHBpbmcgb2YgY3VycmVuY3kgdG8gbWF4aW11bSBwYXltZW50IGFtb3VudCAoZGVub21pbmF0ZWQgaW4gdGhlIHNtYWxsZXN0IHVuaXQgb2YgY3VycmVuY3kpIHN1cHBvcnRlZCBieSB0aGUgaW5zaXR1dGlvbi4gIEV4YW1wbGU6IGB7XFxcIkdCUFxcXCI6IFxcXCIxMDAwMFxcXCJ9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXhpbXVtX3BheW1lbnRfYW1vdW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcmV0dXJuaW5nIHJlZnVuZCBkZXRhaWxzIHdoZW4gaW5pdGlhdGluZyBhIHBheW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0c19yZWZ1bmRfZGV0YWlsczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFuZGluZ19vcmRlcl9tZXRhZGF0YTogUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50IGRlZmluZXMgYSBwYXltZW50IGluaXRpYXRpb24gcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgcGF5bWVudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudC4gIGBQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERURgOiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIG9mIGFsbCBwYXltZW50cy4gSXQgaW5kaWNhdGVzIHRoYXQgdGhlIHBheW1lbnQgaXMgd2FpdGluZyBvbiB1c2VyIGlucHV0IHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuIEEgcGF5bWVudCBtYXkgcmUtZW50ZXIgdGhpcyBzdGF0ZSBsYXRlciBvbiBpZiBmdXJ0aGVyIGlucHV0IGlzIG5lZWRlZC4gIGBQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIHBheW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19DT01QTEVURURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLiAgYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2A6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBQQVlNRU5UX1NUQVRVU19GQUlMRURgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIHRvIGJlIGluaXRpYXRlZC4gVGhpcyBlcnJvciBpcyByZXRyeWFibGUgb25jZSB0aGUgcm9vdCBjYXVzZSBpcyByZXNvbHZlZC4gIGBQQVlNRU5UX1NUQVRVU19CTE9DS0VEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gYmxvY2tlZC4gVGhpcyBpcyBhIHJldHJ5YWJsZSBlcnJvci4gIGBQQVlNRU5UX1NUQVRVU19VTktOT1dOYDogVGhlIHBheW1lbnQgc3RhdHVzIGlzIHVua25vd24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbml0aWF0ZWQgcmVmdW5kcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUmVmdW5kPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgaW5pdGlhdGVkX3JlZnVuZHM/OiBBcnJheTxQYXltZW50SW5pdGlhdGlvblJlZnVuZD47XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgYWNjb3VudCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBFTUkgYWNjb3VudCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBlbWlfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzRW51bSB7XG4gICAgSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTklUSUFURUQnLFxuICAgIENvbXBsZXRlZCA9ICdQQVlNRU5UX1NUQVRVU19DT01QTEVURUQnLFxuICAgIEluc3VmZmljaWVudEZ1bmRzID0gJ1BBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EUycsXG4gICAgRmFpbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0ZBSUxFRCcsXG4gICAgQmxvY2tlZCA9ICdQQVlNRU5UX1NUQVRVU19CTE9DS0VEJyxcbiAgICBVbmtub3duID0gJ1BBWU1FTlRfU1RBVFVTX1VOS05PV04nXG59XG5cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgKHNpbmNlIG5vdCBhbGwgaW5zdGl0dXRpb25zIHN1cHBvcnQgdGhlbSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGb3IgYSBwYXltZW50IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQsIHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIHZhbHVlOiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoZSBpbml0aWFsIHBoYXNlIG9mIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VTdGF0dXNFbnVtIHtcbiAgICBQYXltZW50U3RhdHVzSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJ1xufVxuXG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcmV0dXJuZWQgZnJvbSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3BheW1lbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBwYXltZW50LiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgYWxsIHBheW1lbnRzLiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGF5bWVudCBpcyB3YWl0aW5nIG9uIHVzZXIgaW5wdXQgdG8gY29udGludWUgcHJvY2Vzc2luZy4gQSBwYXltZW50IG1heSByZS1lbnRlciB0aGlzIHN0YXRlIGxhdGVyIG9uIGlmIGZ1cnRoZXIgaW5wdXQgaXMgbmVlZGVkLiAgYFBBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkIGFuZCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlLiAgYFBBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRGA6IEluZGljYXRlcyB0aGF0IHRoZSBzdGFuZGluZyBvcmRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIGZvciBzdGFuZGluZyBvcmRlcnMuICBgUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFBBWU1FTlRfU1RBVFVTX0ZBSUxFRGA6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgdG8gYmUgaW5pdGlhdGVkLiBUaGlzIGVycm9yIGlzIHJldHJ5YWJsZSBvbmNlIHRoZSByb290IGNhdXNlIGlzIHJlc29sdmVkLiAgYFBBWU1FTlRfU1RBVFVTX0JMT0NLRURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBibG9ja2VkLiBUaGlzIGlzIGEgcmV0cnlhYmxlIGVycm9yLiAgYFBBWU1FTlRfU1RBVFVTX1VOS05PV05gOiBUaGUgcGF5bWVudCBzdGF0dXMgaXMgdW5rbm93bi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX3VwZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlZHVsZT86IEV4dGVybmFsUGF5bWVudFNjaGVkdWxlR2V0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFjczogU2VuZGVyQkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHNlbmRlciwgaWYgc3BlY2lmaWVkIGluIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5pdGlhdGVkIHJlZnVuZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5pdGlhdGVkX3JlZnVuZHM/OiBBcnJheTxQYXltZW50SW5pdGlhdGlvblJlZnVuZD47XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgYWNjb3VudCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBFTUkgYWNjb3VudCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtaV9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VTdGF0dXNFbnVtIHtcbiAgICBJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lORycsXG4gICAgSW5pdGlhdGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRCcsXG4gICAgQ29tcGxldGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRCcsXG4gICAgSW5zdWZmaWNpZW50RnVuZHMgPSAnUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTJyxcbiAgICBGYWlsZWQgPSAnUEFZTUVOVF9TVEFUVVNfRkFJTEVEJyxcbiAgICBCbG9ja2VkID0gJ1BBWU1FTlRfU1RBVFVTX0JMT0NLRUQnLFxuICAgIFVua25vd24gPSAnUEFZTUVOVF9TVEFUVVNfVU5LTk9XTidcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGF5bWVudHMgdG8gcmV0dXJuLiBJZiBgY291bnRgIGlzIG5vdCBzcGVjaWZpZWQsIGEgbWF4aW11bSBvZiAxMCBwYXltZW50cyB3aWxsIGJlIHJldHVybmVkLCBiZWdpbm5pbmcgd2l0aCB0aGUgbW9zdCByZWNlbnQgcGF5bWVudCBiZWZvcmUgdGhlIGN1cnNvciAoaWYgc3BlY2lmaWVkKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gXFxcIjIwMTktMTItMDZUMjI6MzU6NDlaXFxcIikuIE9ubHkgcGF5bWVudHMgY3JlYXRlZCBiZWZvcmUgdGhlIGN1cnNvciB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYGNsaWVudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUGF5bWVudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblBheW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSB0aGF0LCB3aGVuIHVzZWQgYXMgdGhlIG9wdGlvbmFsIGBjdXJzb3JgIHBhcmFtZXRlciB0byBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgLCB3aWxsIHJldHVybiB0aGUgbmV4dCB1bnJldHVybmVkIHBheW1lbnQgYXMgaXRzIGZpcnN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvcmV2ZXJzZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50IHRvIHJldmVyc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlZnVuZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIHJlZnVuZC4gIGBQUk9DRVNTSU5HYDogVGhlIHJlZnVuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcmVmdW5kIHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiAgYElOSVRJQVRFRGA6IFRoZSByZWZ1bmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZC4gIGBFWEVDVVRFRGA6IEluZGljYXRlcyB0aGF0IHRoZSByZWZ1bmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLiAgYEZBSUxFRGA6IFRoZSByZWZ1bmQgaGFzIGZhaWxlZCB0byBiZSBleGVjdXRlZC4gVGhpcyBlcnJvciBpcyByZXRyeWFibGUgb25jZSB0aGUgcm9vdCBjYXVzZSBpcyByZXNvbHZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VTdGF0dXNFbnVtIHtcbiAgICBQcm9jZXNzaW5nID0gJ1BST0NFU1NJTkcnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBJbml0aWF0ZWQgPSAnSU5JVElBVEVEJyxcbiAgICBGYWlsZWQgPSAnRkFJTEVEJ1xufVxuXG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBgcGF5bWVudF90b2tlbmAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciB0aGUgcGF5bWVudCBpbml0aWF0aW9uIGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSB0b2tlbiB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBBIGBwYXltZW50X3Rva2VuYCBleHBpcmVzIGFmdGVyIDE1IG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW5fZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50IGRlZmluZXMgYSBwYXltZW50IGluaXRpYXRpb24gcmVjaXBpZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSByZWNpcGllbnQgdGhhdCB0aGlzIHJlY2lwaWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBFTUkgcmVjaXBpZW50IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgZW1pX3JlY2lwaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuIElmIEJBQ1MgZGF0YSBpcyBub3QgcHJvdmlkZWQsIGFuIElCQU4gaXMgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3JlY2lwaWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgcmVjaXBpZW50IHRoYXQgdGhpcyByZWNpcGllbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgRU1JIHJlY2lwaWVudCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW1pX3JlY2lwaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlQWxsT2ZcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudCByZWNpcGllbnRzIGNyZWF0ZWQgZm9yIFBheW1lbnQgSW5pdGlhdGlvblxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWZ1bmQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiByZWZ1bmRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWZ1bmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlZnVuZCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWZ1bmQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHJlZnVuZF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWZ1bmRcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWZ1bmRcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgcmVmdW5kLiAgYFBST0NFU1NJTkdgOiBUaGUgcmVmdW5kIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSByZWZ1bmQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuICBgSU5JVElBVEVEYDogVGhlIHJlZnVuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5pdGlhdGVkLiAgYEVYRUNVVEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHJlZnVuZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQuICBgRkFJTEVEYDogVGhlIHJlZnVuZCBoYXMgZmFpbGVkIHRvIGJlIGV4ZWN1dGVkLiBUaGlzIGVycm9yIGlzIHJldHJ5YWJsZSBvbmNlIHRoZSByb290IGNhdXNlIGlzIHJlc29sdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVmdW5kXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblJlZnVuZFN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgYHN0YXR1c2Agd2FzIHVwZGF0ZWQsIGluIElTMCA4NjAxIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVmdW5kXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25SZWZ1bmRTdGF0dXNFbnVtIHtcbiAgICBQcm9jZXNzaW5nID0gJ1BST0NFU1NJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBGYWlsZWQgPSAnRkFJTEVEJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHZhbGlkIFBheW1lbnQgSW5pdGlhdGlvbiBzdGFuZGluZyBvcmRlciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgY2xvc2VkLWVuZGVkIHN0YW5kaW5nIG9yZGVycyBieSBwcm92aWRpbmcgYW4gZW5kIGRhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfZW5kX2RhdGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVycy4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIG5lZ2F0aXZlIGludGVnZXJzICgtMSB0byAtNSkgZm9yIHNldHRpbmcgdXAgYSBgTU9OVEhMWWAgc3RhbmRpbmcgb3JkZXIgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfbmVnYXRpdmVfZXhlY3V0aW9uX2RheXM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSB2YWxpZCBzdGFuZGluZyBvcmRlciBpbnRlcnZhbHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHZhbGlkX3N0YW5kaW5nX29yZGVyX2ludGVydmFsczogQXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBpbnRlci1iYW5rIHRyYW5zZmVycy4gSWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBub3QgYW4gaW50ZXItYmFuayB0cmFuc2ZlciwgYWxsIGZpZWxkcyB3aWxsIGJlIGBudWxsYC4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhlIGBwYXltZW50X21ldGFgIGtleSB3aWxsIGFsd2F5cyBhcHBlYXIsIGJ1dCBubyBkYXRhIGVsZW1lbnRzIGFyZSBndWFyYW50ZWVkLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50TWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRNZXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIG51bWJlciBzdXBwbGllZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVmZXJlbmNlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIFBQRCBJRCBmb3IgdGhlIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcHBkX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHJlY2VpdmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydHkgaW5pdGlhdGluZyBhIHdpcmUgdHJhbnNmZXIuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgYSB3aXJlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgYnlfb3JkZXJfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHRyYW5zZmVycywgdGhlIHBhcnR5IHRoYXQgaXMgcGF5aW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLCBlLmcuIFxcJ0FDSFxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheW1lbnQgcHJvY2Vzc29yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2Nlc3Nvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGludGVydmFsIG9mIHRoZSBwYXltZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWwge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfU1RBVFVTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgZm9yIHRoZSBwYXltZW50IGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHN0YXR1cyBvZiB0aGUgcGF5bWVudC4gIGBQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERURgOiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIG9mIGFsbCBwYXltZW50cy4gSXQgaW5kaWNhdGVzIHRoYXQgdGhlIHBheW1lbnQgaXMgd2FpdGluZyBvbiB1c2VyIGlucHV0IHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuIEEgcGF5bWVudCBtYXkgcmUtZW50ZXIgdGhpcyBzdGF0ZSBsYXRlciBvbiBpZiBmdXJ0aGVyIGlucHV0IGlzIG5lZWRlZC4gIGBQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIHBheW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19DT01QTEVURURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLiAgYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2A6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBQQVlNRU5UX1NUQVRVU19GQUlMRURgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIHRvIGJlIGluaXRpYXRlZC4gVGhpcyBlcnJvciBpcyByZXRyeWFibGUgb25jZSB0aGUgcm9vdCBjYXVzZSBpcyByZXNvbHZlZC4gIGBQQVlNRU5UX1NUQVRVU19CTE9DS0VEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gYmxvY2tlZC4gVGhpcyBpcyBhIHJldHJ5YWJsZSBlcnJvci4gIGBQQVlNRU5UX1NUQVRVU19VTktOT1dOYDogVGhlIHBheW1lbnQgc3RhdHVzIGlzIHVua25vd24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfcGF5bWVudF9zdGF0dXM6IFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rTmV3UGF5bWVudFN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIHByZXZpb3VzIHN0YXR1cyBvZiB0aGUgcGF5bWVudC4gIGBQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERURgOiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlIG9mIGFsbCBwYXltZW50cy4gSXQgaW5kaWNhdGVzIHRoYXQgdGhlIHBheW1lbnQgaXMgd2FpdGluZyBvbiB1c2VyIGlucHV0IHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuIEEgcGF5bWVudCBtYXkgcmUtZW50ZXIgdGhpcyBzdGF0ZSBsYXRlciBvbiBpZiBmdXJ0aGVyIGlucHV0IGlzIG5lZWRlZC4gIGBQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HYDogVGhlIHBheW1lbnQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gVGhlIHBheW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGV4aXQgdGhpcyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuICBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluaXRpYXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19DT01QTEVURURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLiAgYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2A6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kcy4gIGBQQVlNRU5UX1NUQVRVU19GQUlMRURgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIHRvIGJlIGluaXRpYXRlZC4gVGhpcyBlcnJvciBpcyByZXRyeWFibGUgb25jZSB0aGUgcm9vdCBjYXVzZSBpcyByZXNvbHZlZC4gIGBQQVlNRU5UX1NUQVRVU19CTE9DS0VEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gYmxvY2tlZC4gVGhpcyBpcyBhIHJldHJ5YWJsZSBlcnJvci4gIGBQQVlNRU5UX1NUQVRVU19VTktOT1dOYDogVGhlIHBheW1lbnQgc3RhdHVzIGlzIHVua25vd24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfcGF5bWVudF9zdGF0dXM6IFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rT2xkUGF5bWVudFN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugd2hlbiBjcmVhdGluZyB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmFsX3JlZmVyZW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYHN0YXJ0X2RhdGVgIHByb3ZpZGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgYSBzdGFuZGluZyBvcmRlci4gSWYgdGhlIHBheW1lbnQgaXMgbm90IGEgc3RhbmRpbmcgb3JkZXIsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIG9yIGlmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tOZXdQYXltZW50U3RhdHVzRW51bSB7XG4gICAgSW5wdXROZWVkZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEJyxcbiAgICBQcm9jZXNzaW5nID0gJ1BBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTklUSUFURUQnLFxuICAgIENvbXBsZXRlZCA9ICdQQVlNRU5UX1NUQVRVU19DT01QTEVURUQnLFxuICAgIEluc3VmZmljaWVudEZ1bmRzID0gJ1BBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EUycsXG4gICAgRmFpbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0ZBSUxFRCcsXG4gICAgQmxvY2tlZCA9ICdQQVlNRU5UX1NUQVRVU19CTE9DS0VEJyxcbiAgICBVbmtub3duID0gJ1BBWU1FTlRfU1RBVFVTX1VOS05PV04nXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rT2xkUGF5bWVudFN0YXR1c0VudW0ge1xuICAgIElucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCcsXG4gICAgUHJvY2Vzc2luZyA9ICdQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HJyxcbiAgICBJbml0aWF0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEJyxcbiAgICBJbnN1ZmZpY2llbnRGdW5kcyA9ICdQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFMnLFxuICAgIEZhaWxlZCA9ICdQQVlNRU5UX1NUQVRVU19GQUlMRUQnLFxuICAgIEJsb2NrZWQgPSAnUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRCcsXG4gICAgVW5rbm93biA9ICdQQVlNRU5UX1NUQVRVU19VTktOT1dOJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM/OiBEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vhcm5pbmdzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZWFybmluZ3M/OiBFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95ZXI6IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95bWVudF9kZXRhaWxzPzogRW1wbG95bWVudERldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk/OiBOZXRQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2RldGFpbHM6IFBheVBlcmlvZERldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgcGF5c3R1Yl9kZXRhaWxzPzogUGF5c3R1YkRldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZUJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duOiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViWVRERGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIHl0ZF9lYXJuaW5nczogUGF5c3R1YllURERldGFpbHM7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJBZGRyZXNzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdGVkIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBsaW5lMT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RyZWV0IGFkZHJlc3MgbGluZSAyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgbGluZTI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIDUgZGlnaXQgcG9zdGFsIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHN0YXRlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRGVkdWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWR1Y3Rpb24sIGFzIHByb3ZpZGVkIG9uIHRoZSBwYXlzdHViLiBGb3IgZXhhbXBsZTogYFxcXCI0MDEoaylcXFwiYCwgYFxcXCJGSUNBIE1FRCBUQVhcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGRlZHVjdGlvbiBpcyBwcmUtdGF4OyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIGlzX3ByZXRheDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkZXRhaWxzIHRoYXQgY2FuIGJlIGZvdW5kIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBCZWdpbm5pbmcgZGF0ZSBvZiB0aGUgcGF5IHBlcmlvZCBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX3N0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZGluZyBkYXRlIG9mIHRoZSBwYXkgcGVyaW9kIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBheSBkYXRlIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciB0aGF0IGdlbmVyYXRlZCB0aGUgcGF5c3R1YiwgZS5nLiBBRFBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheXN0dWJfcHJvdmlkZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggdGhlIGVtcGxveWVlIGlzIHBhaWQuIFBvc3NpYmxlIHZhbHVlczogYE1PTlRITFlgLCBgQkktV0VFS0xZYCwgYFdFRUtMWWAsIGBTRU1JLU1PTlRITFlgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheXN0dWJEZXRhaWxzUGF5RnJlcXVlbmN5RW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQYXlzdHViRGV0YWlsc1BheUZyZXF1ZW5jeUVudW0ge1xuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQmlXZWVrbHkgPSAnQkktV0VFS0xZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JLU1PTlRITFknXG59XG5cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJFbXBsb3llciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5c3R1YkFkZHJlc3M7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgb2YgaW5jb21lIGVhcm5lZCB5ZWFyIHRvIGRhdGUsIGFzIGJhc2VkIG9uIHBheXN0dWIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YllURERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlscyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogWWVhci10by1kYXRlIGdyb3NzIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBuZXQgKHRha2UgaG9tZSkgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YllURERldGFpbHNcbiAgICAgKi9cbiAgICBuZXRfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW3igJlzIGFjY2VzcyBjb25zZW50IGlzIGV4cGlyaW5nIGluIDcgZGF5cy4gU29tZSBJdGVtcyBoYXZlIGV4cGxpY2l0IGV4cGlyYXRpb24gdGltZXMgYW5kIHdlIHRyeSB0byByZWxheSB0aGlzIHdoZW4gcG9zc2libGUgdG8gcmVkdWNlIHNlcnZpY2UgZGlzcnVwdGlvbi4gVGhpcyBjYW4gYmUgcmVzb2x2ZWQgYnkgaGF2aW5nIHRoZSB1c2VyIGdvIHRocm91Z2ggTGlua+KAmXMgdXBkYXRlIG1vZGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBFTkRJTkdfRVhQSVJBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBJdGVtXFwncyBhY2Nlc3MgY29uc2VudCB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gTW9zdCByZWxldmFudCBmb3IgcGVyc29uYWwgZmluYW5jZSB1c2UgY2FzZXMsIGJ1dCBub3QgbGltaXRlZCB0byBzdWNoIHVzZSBjYXNlcy4gVGhlIGZpZWxkIGlzIGN1cnJlbnRseSBpbiBiZXRhLiAgVGhlIGNvbXBsZXRlIGNhdGVnb3J5IGNhbiBiZSBnZW5lcmF0ZWQgYnkgY29uY2F0ZW5hdGluZyBwcmltYXJ5IGFuZCBkZXRhaWxlZCBjYXRlZ29yaWVzLiAgVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBiZXRhIOKAkyB0byByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhZGRpdGlvbmFsIGdyYW51bGFyaXR5IHRvIHRoZSBwcmltYXJ5IGNhdGVnb3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgZGV0YWlsZWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBwaG9uZSBudW1iZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaG9uZU51bWJlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgcGhvbmUgbnVtYmVyIGFzIHRoZSBwcmltYXJ5IG51bWJlciBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogUGhvbmVOdW1iZXJUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQaG9uZU51bWJlclR5cGVFbnVtIHtcbiAgICBIb21lID0gJ2hvbWUnLFxuICAgIFdvcmsgPSAnd29yaycsXG4gICAgT2ZmaWNlID0gJ29mZmljZScsXG4gICAgTW9iaWxlID0gJ21vYmlsZScsXG4gICAgTW9iaWxlMSA9ICdtb2JpbGUxJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hcGV4L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JOdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFByb2Nlc3Nvck51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGZvciBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAsIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIGZvciB0aGUgcmVxdWVzdGVkIGFjY291bnQgY29udGFpbmVkIGluIHRoZSByZXNwb25zZS4gIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiDigJwxMC4wMOKAnSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50IOKAkyBzaG91bGQgYmUgc2V0IHRvIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHN0b3JhZ2Ugd2l0aCB0aGUgYmFuayB0cmFuc2Zlci4gTWF5IGJlIHVwIHRvIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiAtIFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgLSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgLSBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyAtIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIC0gTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyB0cmFuc2Zlci4gSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBvcmlnaW5hdGlvbiBhY2NvdW50LCB0aGlzIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50SWRlbnRpdHk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudGAuIFRoZSBpZGVudGlmeWluZyBudW1iZXIgdHlwZSAoQUNILCBFRlQsIElCQU4sIG9yIEJBQ1MpIHVzZWQgd2lsbCBkZXBlbmQgb24gdGhlIGNvdW50cnkgb2YgdGhlIGFjY291bnQuIEFuIGFjY291bnQgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBudW1iZXIgdHlwZS4gSWYgYSBwYXJ0aWN1bGFyIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIGlzIG5vdCB1c2VkIGJ5IHRoZSBgYWNjb3VudGAgZm9yIHdoaWNoIGF1dGggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIGEgbnVsbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JOdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JOdW1iZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQUNITnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGFjaD86IE51bWJlcnNBQ0hOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNFRlROdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgZWZ0PzogTnVtYmVyc0VGVE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBiYWNzPzogTnVtYmVyc0JBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2VudCB0byBTdHJpcGUgZm9yIHVzZSBpbiBtYWtpbmcgQVBJIGNhbGxzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyaXBlX2JhbmtfYWNjb3VudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgaW4gTGlua1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHlvdSBhcmUgaW50ZWdyYXRpbmcgd2l0aC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3I6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFByb2Nlc3NvckVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0UHJvY2Vzc29yRW51bSB7XG4gICAgQWNocSA9ICdhY2hxJyxcbiAgICBBbHBhY2EgPSAnYWxwYWNhJyxcbiAgICBBc3RyYSA9ICdhc3RyYScsXG4gICAgQ2hlY2sgPSAnY2hlY2snLFxuICAgIENoZWNrYm9vayA9ICdjaGVja2Jvb2snLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIERyaXZld2VhbHRoID0gJ2RyaXZld2VhbHRoJyxcbiAgICBEd29sbGEgPSAnZHdvbGxhJyxcbiAgICBHYWxpbGVvID0gJ2dhbGlsZW8nLFxuICAgIExpdGhpYyA9ICdsaXRoaWMnLFxuICAgIE1vZGVyblRyZWFzdXJ5ID0gJ21vZGVybl90cmVhc3VyeScsXG4gICAgTW9vdiA9ICdtb292JyxcbiAgICBPY3JvbHVzID0gJ29jcm9sdXMnLFxuICAgIFByaW1lVHJ1c3QgPSAncHJpbWVfdHJ1c3QnLFxuICAgIFJpemUgPSAncml6ZScsXG4gICAgU2lsYU1vbmV5ID0gJ3NpbGFfbW9uZXknLFxuICAgIFN2YkFwaSA9ICdzdmJfYXBpJyxcbiAgICBUcmVhc3VyeVByaW1lID0gJ3RyZWFzdXJ5X3ByaW1lJyxcbiAgICBVbml0ID0gJ3VuaXQnLFxuICAgIFZlc3RhID0gJ3Zlc3RhJyxcbiAgICBWb3BheSA9ICd2b3BheScsXG4gICAgV3lyZSA9ICd3eXJlJ1xufVxuXG4vKipcbiAqIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgIGFuZCBgL3Byb2Nlc3Nvci9hcGV4L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2Nlc3Nvcl90b2tlbmAgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIGJ5IHRoZSBQbGFpZCBwYXJ0bmVyIHRvIG1ha2UgQVBJIHJlcXVlc3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcHJvZHVjdCBhY2Nlc3MgYmVpbmcgcmVxdWVzdGVkLiBVc2VkIHRvIG9yIGRpc2FsbG93IHByb2R1Y3QgYWNjZXNzIGFjcm9zcyBhbGwgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBhbGwgcHJvZHVjdHMgYWxsb3dlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdEFjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBzdGF0ZW1lbnRzLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0aGUgSWRlbnRpdHkgcHJvZHVjdCAobmFtZSwgZW1haWwsIHBob25lLCBhZGRyZXNzKS4gSWYgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIGFjY291bnQgbnVtYmVyIGRldGFpbHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRyYW5zYWN0aW9uIGRldGFpbHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdHVzIGhlYWx0aCBvZiBhIHJlcXVlc3QgdHlwZS4gQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBMaWFiaWxpdGllcyByZXF1ZXN0cywgVHJhbnNhY3Rpb25zIHVwZGF0ZXMsIEludmVzdG1lbnRzIHVwZGF0ZXMsIExpYWJpbGl0aWVzIHVwZGF0ZXMsIGFuZCBJdGVtIGxvZ2lucyBlYWNoIGhhdmUgdGhlaXIgb3duIHN0YXR1cyBvYmplY3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgSEVBTFRIWWA6IHRoZSBtYWpvcml0eSBvZiByZXF1ZXN0cyBhcmUgc3VjY2Vzc2Z1bCBgREVHUkFERURgOiBvbmx5IHNvbWUgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERPV05gOiBhbGwgcmVxdWVzdHMgYXJlIGZhaWxpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzOiBQcm9kdWN0U3RhdHVzU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXR0ZWQgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN0YXR1cyBjaGFuZ2UgZm9yIHRoZSBpbnN0aXR1dGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX2NoYW5nZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzQnJlYWtkb3dufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtIHtcbiAgICBIZWFsdGh5ID0gJ0hFQUxUSFknLFxuICAgIERlZ3JhZGVkID0gJ0RFR1JBREVEJyxcbiAgICBEb3duID0gJ0RPV04nXG59XG5cbi8qKlxuICogQSBkZXRhaWxlZCBicmVha2Rvd24gb2YgdGhlIGluc3RpdHV0aW9uXFwncyBwZXJmb3JtYW5jZSBmb3IgYSByZXF1ZXN0IHR5cGUuIFRoZSB2YWx1ZXMgZm9yIGBzdWNjZXNzYCwgYGVycm9yX3BsYWlkYCwgYW5kIGBlcnJvcl9pbnN0aXR1dGlvbmAgc3VtIHRvIDEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBzdWNjZXNzZnVsLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBzdWNjZXNzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGludGVybmFsIFBsYWlkIGlzc3VlLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgZXJyb3JfcGxhaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBsb2dpbnMgdGhhdCBhcmUgZmFpbGluZyBkdWUgdG8gYW4gaXNzdWUgaW4gdGhlIGluc3RpdHV0aW9uXFwncyBzeXN0ZW0sIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX2luc3RpdHV0aW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWZyZXNoX2ludGVydmFsYCBtYXkgYmUgYERFTEFZRURgIG9yIGBTVE9QUEVEYCBldmVuIHdoZW4gdGhlIHN1Y2Nlc3MgcmF0ZSBpcyBoaWdoLiBUaGlzIHZhbHVlIGlzIG9ubHkgcmV0dXJuZWQgZm9yIFRyYW5zYWN0aW9ucyBzdGF0dXMgYnJlYWtkb3ducy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmVmcmVzaF9pbnRlcnZhbD86IFByb2R1Y3RTdGF0dXNCcmVha2Rvd25SZWZyZXNoSW50ZXJ2YWxFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25SZWZyZXNoSW50ZXJ2YWxFbnVtIHtcbiAgICBOb3JtYWwgPSAnTk9STUFMJyxcbiAgICBEZWxheWVkID0gJ0RFTEFZRUQnLFxuICAgIFN0b3BwZWQgPSAnU1RPUFBFRCdcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBhbiBpbnN0aXR1dGlvbiBjYW4gc3VwcG9ydC4gQWxsIEl0ZW1zIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gVGhlIEJhbGFuY2UgcHJvZHVjdCBpcyBhbHdheXMgYXZhaWxhYmxlIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNwZWNpZmllZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm9kdWN0cyB7XG4gICAgQXNzZXRzID0gJ2Fzc2V0cycsXG4gICAgQXV0aCA9ICdhdXRoJyxcbiAgICBCYWxhbmNlID0gJ2JhbGFuY2UnLFxuICAgIElkZW50aXR5ID0gJ2lkZW50aXR5JyxcbiAgICBJbnZlc3RtZW50cyA9ICdpbnZlc3RtZW50cycsXG4gICAgTGlhYmlsaXRpZXMgPSAnbGlhYmlsaXRpZXMnLFxuICAgIFBheW1lbnRJbml0aWF0aW9uID0gJ3BheW1lbnRfaW5pdGlhdGlvbicsXG4gICAgVHJhbnNhY3Rpb25zID0gJ3RyYW5zYWN0aW9ucycsXG4gICAgQ3JlZGl0RGV0YWlscyA9ICdjcmVkaXRfZGV0YWlscycsXG4gICAgSW5jb21lID0gJ2luY29tZScsXG4gICAgSW5jb21lVmVyaWZpY2F0aW9uID0gJ2luY29tZV92ZXJpZmljYXRpb24nLFxuICAgIERlcG9zaXRTd2l0Y2ggPSAnZGVwb3NpdF9zd2l0Y2gnLFxuICAgIFN0YW5kaW5nT3JkZXJzID0gJ3N0YW5kaW5nX29yZGVycydcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBUaGUgcmVxdWVzdCB3YXMgZmxhZ2dlZCBieSBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtLCBhbmQgcmVxdWlyZXMgYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gdG8gZW5zdXJlIHRoZXkgYXJlIG5vdCBhIGJvdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3Ige1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9FUlJPUlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUkVDQVBUQ0hBX1JFUVVJUkVEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNDAwXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGh0dHBfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHNvbHZlIGEgR29vZ2xlIHJlQ0FQVENIQSBjaGFsbGVuZ2UgaW4gdGhlIExpbmsgUmVjYXB0Y2hhIHBhbmUuIElmIHRoZXkgc29sdmUgdGhlIGNoYWxsZW5nZSBzdWNjZXNzZnVsbHksIHRoZSB1c2VyXFwncyByZXF1ZXN0IGlzIHJlc3VibWl0dGVkIGFuZCB0aGV5IGFyZSBkaXJlY3RlZCB0byB0aGUgbmV4dCBJdGVtIGNyZWF0aW9uIHN0ZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGxpbmtfdXNlcl9leHBlcmllbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSBkZXRlY3RzIGFidXNpdmUgdHJhZmZpYyBhbmQgY29uc2lkZXJzIGEgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzIHRocm91Z2hvdXQgSXRlbSBjcmVhdGlvbiByZXF1ZXN0cy4gV2hlbiBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCByaXNreSBvciBwb3NzaWJseSBmcmF1ZHVsZW50LCBMaW5rIHByZXNlbnRzIGEgcmVDQVBUQ0hBIGZvciB0aGUgdXNlciB0byBzb2x2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgY29tbW9uX2NhdXNlczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpbmsgd2lsbCBhdXRvbWF0aWNhbGx5IGd1aWRlIHlvdXIgdXNlciB0aHJvdWdoIHJlQ0FQVENIQSB2ZXJpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB3ZSByZWNvbW1lbmQgaW5zdHJ1bWVudGluZyBiYXNpYyBmcmF1ZCBtb25pdG9yaW5nIHRvIGRldGVjdCBhbmQgcHJvdGVjdCB5b3VyIHdlYnNpdGUgZnJvbSBzcGFtIGFuZCBhYnVzZS4gIElmIHlvdXIgdXNlciBjYW5ub3QgdmVyaWZ5IHRoZWlyIHNlc3Npb24sIHBsZWFzZSBzdWJtaXQgYSBTdXBwb3J0IHRpY2tldCB3aXRoIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6IGBsaW5rX3Nlc3Npb25faWRgIG9yIGByZXF1ZXN0X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICB0cm91Ymxlc2hvb3Rpbmdfc3RlcHM6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1Mge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogU2NvcGUgb2YgcmVxdWlyZWQgYW5kIG9wdGlvbmFsIGFjY291bnQgZmVhdHVyZXMgb3IgY29udGVudCBmcm9tIGEgQ29ubmVjdGVkQXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlcXVlc3RlZFNjb3Blc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RlZFNjb3BlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFJlcXVlc3RlZFNjb3Blc1xuICAgICAqL1xuICAgIHJlcXVpcmVkX3Byb2R1Y3RfYWNjZXNzOiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0QWNjZXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0ZWRTY29wZXNcbiAgICAgKi9cbiAgICBvcHRpb25hbF9wcm9kdWN0X2FjY2VzczogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmVxdWVzdGVkU2NvcGVzXG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogQWNjb3VudEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFNlbGVjdGlvbkNhcmRpbmFsaXR5fVxuICAgICAqIEBtZW1iZXJvZiBSZXF1ZXN0ZWRTY29wZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X3NlbGVjdGlvbl9jYXJkaW5hbGl0eTogQWNjb3VudFNlbGVjdGlvbkNhcmRpbmFsaXR5O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFzeW5jaHJvbm91cyBldmVudCB0byBiZSBzaW11bGF0ZWQuIE1heSBiZTogYHBvc3RlZGAsIGBmYWlsZWRgLCBvciBgcmV2ZXJzZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0cmFuc2ZlciBzdGF0dXMuIENvbXBhdGlibGUgc3RhdHVzIC0tPiBldmVudCB0eXBlIHRyYW5zaXRpb25zIGluY2x1ZGU6ICBgcGVuZGluZ2AgLS0+IGBmYWlsZWRgICBgcGVuZGluZ2AgLS0+IGBwb3N0ZWRgICBgcG9zdGVkYCAtLT4gYHJldmVyc2VkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIGluY29tZSB2ZXJpZmljYXRpb24gc3RhdHVzIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gIGBWRVJJRklDQVRJT05fU1RBVFVTX0RPQ1VNRU5UX1JFSkVDVEVEYDogVGhlIGRvY3VtZW50YXRpb24gdXBsb2FkZWQgYnkgdGhlIGVuZCB1c2VyIHdhcyByZWNvZ25pemVkIGFzIGEgc3VwcG9ydGVkIGZpbGUgZm9ybWF0LCBidXQgbm90IHJlY29nbml6ZWQgYXMgYSB2YWxpZCBwYXlzdHViLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURScsXG4gICAgRG9jdW1lbnRSZWplY3RlZCA9ICdWRVJJRklDQVRJT05fU1RBVFVTX0RPQ1VNRU5UX1JFSkVDVEVEJyxcbiAgICBQcm9jZXNzaW5nRmFpbGVkID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRUQnXG59XG5cbi8qKlxuICogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgYHdlYmhvb2tfY29kZWAgYXJlIHN1cHBvcnRlZDogICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFdlYmhvb2tDb2RlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFdlYmhvb2tDb2RlRW51bSB7XG4gICAgRGVmYXVsdFVwZGF0ZSA9ICdERUZBVUxUX1VQREFURSdcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgaXMgYHRydWVgICBpZiB0aGUgdGVzdGAgd2ViaG9va19jb2RlYCAgd2FzIHN1Y2Nlc3NmdWxseSBmaXJlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgd2ViaG9va19maXJlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGNhbGwgc3VjY2VlZGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgd2hvc2UgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB0byBiZSBtb2RpZmllZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyB0byBzZXQgdGhlIGFjY291bnQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGBzYW5kYm94L29hdXRoL3NlbGVjdF9hY2NvdW50c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAgICAgKi9cbiAgICBvYXV0aF9zdGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0aGUgSXRlbSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGVzdCB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGB1c2VyX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfdXNlcm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlc3QgcGFzc3dvcmQgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgcGFzc19nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3Bhc3N3b3JkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgcHJvY2Vzc29yIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgYC9wcm9jZXNzb3IvYCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2Ygb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY29uZmlndXJpbmcgdGhlIEl0ZW0uIElmIHNwZWNpZmllZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgd2ViaG9vayB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmV3IEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zO1xufVxuLyoqXG4gKiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucyBpcyBhbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9ucyBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEEgcHVibGljIHRva2VuIHRoYXQgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYWNjZXNzIHRva2VuIHVzaW5nIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYGZhaWxlZGAsIG9yIGByZXZlcnNlZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBwZW5kaW5nYCAtLT4gYGZhaWxlZGAgIGBwZW5kaW5nYCAtLT4gYHBvc3RlZGAgIGBwb3N0ZWRgIC0tPiBgcmV2ZXJzZWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFRyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIHByb2R1Y3RfYWNjZXNzPzogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFjY2Vzcz59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpbmRpY2F0b3IgZm9yIHdoZW4gc2NvcGVzIGFyZSBiZWluZyB1cGRhdGVkLiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCB2aWEgZW5yb2xsbWVudCAoaS5lLiBPQXV0aCksIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgRU5ST0xMTUVOVGAuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGluIGEgcG9zdC1lbnJvbGxtZW50IHZpZXcsIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgUE9SVEFMYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNjb3Blc0NvbnRleHQge1xuICAgIEVucm9sbG1lbnQgPSAnRU5ST0xMTUVOVCcsXG4gICAgUG9ydGFsID0gJ1BPUlRBTCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2NvcGVzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29wZXNOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgcHJvZHVjdF9hY2Nlc3M/OiBQcm9kdWN0QWNjZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QWNjZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PEFjY291bnRBY2Nlc3M+O1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBuZXdseSBvcGVuZWQgYWNjb3VudHMgYXMgdGhleSBhcmUgb3BlbmVkLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc2VjdXJpdHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc2luOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIDktY2hhcmFjdGVyIENVU0lQLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIE5vcnRoIEFtZXJpY2FuIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjdXNpcDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA3LWNoYXJhY3RlciBTRURPTCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBzZWN1cml0aWVzIGluIHRoZSBVSy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHNlZG9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZ2l2ZW4gdG8gdGhlIHNlY3VyaXR5IGJ5IHRoZSBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYGluc3RpdHV0aW9uX3NlY3VyaXR5X2lkYCBpcyBwcmVzZW50LCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGUgUGxhaWQgYGluc3RpdHV0aW9uX2lkYCBvZiB0aGUgaW5zdGl0dXRpb24gdG8gd2hvbSB0aGUgaWRlbnRpZmllciBiZWxvbmdzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW4gY2VydGFpbiBjYXNlcywgUGxhaWQgd2lsbCBwcm92aWRlIHRoZSBJRCBvZiBhbm90aGVyIHNlY3VyaXR5IHdob3NlIHBlcmZvcm1hbmNlIHJlc2VtYmxlcyB0aGlzIHNlY3VyaXR5LCB0eXBpY2FsbHkgd2hlbiB0aGUgb3JpZ2luYWwgc2VjdXJpdHkgaGFzIGxvdyB2b2x1bWUsIG9yIHdoZW4gYSBwcml2YXRlIHNlY3VyaXR5IGNhbiBiZSBtb2RlbGVkIHdpdGggYSBwdWJsaWNseSB0cmFkZWQgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBwcm94eV9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eeKAmXMgdHJhZGluZyBzeW1ib2wgZm9yIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0aWVzLCBhbmQgb3RoZXJ3aXNlIGEgc2hvcnQgaWRlbnRpZmllciBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB0aWNrZXJfc3ltYm9sOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IGEgc2VjdXJpdHkgaXMgYSBoaWdobHkgbGlxdWlkIGFzc2V0IGFuZCBjYW4gYmUgdHJlYXRlZCBsaWtlIGNhc2guXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNfY2FzaF9lcXVpdmFsZW50OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdXJpdHkgdHlwZSBvZiB0aGUgaG9sZGluZy4gVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGRlcml2YXRpdmVgOiBPcHRpb25zLCB3YXJyYW50cywgYW5kIG90aGVyIGRlcml2YXRpdmUgaW5zdHJ1bWVudHMgIGBlcXVpdHlgOiBEb21lc3RpYyBhbmQgZm9yZWlnbiBlcXVpdGllcyAgYGV0ZmA6IE11bHRpLWFzc2V0IGV4Y2hhbmdlLXRyYWRlZCBpbnZlc3RtZW50IGZ1bmRzICBgZml4ZWQgaW5jb21lYDogQm9uZHMgYW5kIGNlcnRpZmljYXRlcyBvZiBkZXBvc2l0IChDRHMpICBgbG9hbmA6IExvYW5zIGFuZCBsb2FuIHJlY2VpdmFibGVzLiAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMuICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHRoZSBjbG9zZSBvZiB0aGUgcHJldmlvdXMgdHJhZGluZyBzZXNzaW9uLiBgbnVsbGAgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gSWYgdGhlIHNlY3VyaXR5IGlzIGEgZm9yZWlnbiBjdXJyZW5jeSBvciBhIGNyeXB0b2N1cnJlbmN5IHRoaXMgZmllbGQgd2lsbCBiZSB1cGRhdGVkIGRhaWx5IGFuZCB3aWxsIGJlIHByaWNlZCBpbiBVU0QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBjbG9zZV9wcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGZvciB3aGljaCBgY2xvc2VfcHJpY2VgIGlzIGFjY3VyYXRlLiBBbHdheXMgYG51bGxgIGlmIGBjbG9zZV9wcmljZWAgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2VfYXNfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHByaWNlIGdpdmVuLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZ5IHRoZSBzZWN1cml0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcgb3IgaW52ZXN0bWVudCB0cmFuc2FjdGlvbi4gV2hlbiBpbnB1dHRpbmcgY3VzdG9tIHNlY3VyaXR5IGRhdGEgdG8gdGhlIFNhbmRib3gsIFBsYWlkIHdpbGwgcGVyZm9ybSBwb3N0LWRhdGEtcmV0cmlldmFsIG5vcm1hbGl6YXRpb24gYW5kIGVucmljaG1lbnQuIFRoZXNlIHByb2Nlc3NlcyBtYXkgY2F1c2UgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIFNhbmRib3ggdG8gYmUgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIGRhdGEgeW91IGlucHV0LiBBbiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIGFuZCBhIHNlY3VyaXR5IGlkZW50aWZpZXIgKGB0aWNrZXJfc3ltYm9sYCwgYGN1c2lwYCwgYGlzaW5gLCBvciBgc2Vkb2xgKSBhcmUgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlY3VyaXR5T3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eU92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiAxMi1jaGFyYWN0ZXIgSVNJTiwgYSBnbG9iYWxseSB1bmlxdWUgc2VjdXJpdGllcyBpZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpc2luPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDktY2hhcmFjdGVyIENVU0lQLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIE5vcnRoIEFtZXJpY2FuIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VuZGVyQkFDU051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZGVyQkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VuZGVyQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3R1ZGVudCBsb2FuIHNlcnZpY2VyLiBUaGlzIGlzIGdlbmVyYWxseSB0aGUgcmVtaXR0YW5jZSBhZGRyZXNzIHRvIHdoaWNoIHBheW1lbnRzIHNob3VsZCBiZSBzZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZXJBZGRyZXNzRGF0YSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgdGhlIGNvbXBvbmVudHMgY29tcHJpc2luZyBhbiBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5pdGlhdGVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBkZXZpY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgdGhhdCBpbml0aWF0ZWQgdGhlIHRyYW5zYWN0aW9uIChlLmcuIFxcXCJNb3ppbGxhLzUuMFxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjb3JlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyB0aGUgQUNIIHJldHVybiByaXNrLCBzdWNoIGFzIHBhc3QgQUNIIHJldHVybiBldmVudHMsIGJhbGFuY2UvdHJhbnNhY3Rpb24gaGlzdG9yeSwgdGhlIEl0ZW3igJlzIGNvbm5lY3Rpb24gaGlzdG9yeSBpbiB0aGUgUGxhaWQgbmV0d29yaywgYW5kIGlkZW50aXR5IGNoYW5nZSBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDcgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzdkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfOTBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBmdW5kaW5nIGFjY291bnQgaXMgYSBzYXZpbmdzL21vbmV5IG1hcmtldCBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudCBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTV0aCBwZXJjZW50aWxlIG9mIGFsbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTVfY3JlZGl0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTV0aCBwZXJjZW50aWxlIG9mIGFsbCBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50cyBvdmVyIHRoZSBwYXN0IDI4IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTVfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB3aXRoaW4gdGhlIHBhc3QgOTAgZGF5cyB3aGVuIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIGhhZCBhIG5lZ2F0aXZlIGVuZC1vZi1kYXkgYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c193aXRoX25lZ2F0aXZlX2JhbGFuY2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgMTB0aCBwZXJjZW50aWxlIG9mIHRoZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBdmFpbGFibGUgYmFsYW5jZSwgYXMgb2YgdGhlIGBiYWxhbmNlX2xhc3RfdXBkYXRlZGAgdGltZS4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYXZhaWxhYmxlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgYmFsYW5jZSwgYXMgb2YgdGhlIGBiYWxhbmNlX2xhc3RfdXBkYXRlZGAgdGltZS4gVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjdXJyZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhhdCB0aGUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYmFsYW5jZV9sYXN0X3VwZGF0ZWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZHJlc3NfY2hhbmdlX2NvdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgd2hvc2UgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB0byBiZSBtb2RpZmllZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBpcyB1c2VkIHRvIGNvcnJlbGF0ZSByZXF1ZXN0cyBieSBhIHVzZXIgd2l0aCBtdWx0aXBsZSBJdGVtcy4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xufVxuLyoqXG4gKiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvaW5jb21lL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29yZV9hdHRyaWJ1dGVzOiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xufVxuLyoqXG4gKiBUaGUgdXNlclxcJ3MgbGVnYWwgbmFtZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQZXJzb25OYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgcHJlZml4IChlLmcuIFxcXCJNci5cXFwiKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBwcmVmaXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBnaXZlbiBuYW1lLiBJZiB0aGUgdXNlciBoYXMgYSBvbmUtd29yZCBuYW1lLCBpdCBzaG91bGQgYmUgcHJvdmlkZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG1pZGRsZSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIG1pZGRsZV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmFtaWx5IG5hbWUgLyBzdXJuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbmFtZSBzdWZmaXggKGUuZy4gXFxcIklJXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgc3VmZml4Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybl9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSaXNrIHNjb3JpbmcgZGV0YWlscyBicm9rZW4gZG93biBieSByaXNrIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY29yZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTY29yZXMge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDdXN0b21lckluaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fcmlzaz86IEN1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlzaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luaXRpYXRlZFJldHVyblJpc2t9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjb3Jlc1xuICAgICAqL1xuICAgIGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQmFua0luaXRpYXRlZFJldHVyblJpc2s7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyIGluaXRpYXRpbmcgdGhlIHRyYW5zYWN0aW9uIChpLmUuLCB0aGUgYWNjb3VudCBob2xkZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsVXNlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFBlcnNvbk5hbWV9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFVzZXJcbiAgICAgKi9cbiAgICBuYW1lPzogU2lnbmFsUGVyc29uTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciwgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9LiBGb3IgZXhhbXBsZTogXFxcIisxNDE1MTIzNDU2N1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFNpZ25hbEFkZHJlc3NEYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGRlcG9zaXRvcnlgIGFjY291bnRzIGFyZTogQXV0aCwgQmFsYW5jZSwgVHJhbnNhY3Rpb25zLCBJZGVudGl0eSwgUGF5bWVudCBJbml0aWF0aW9uLCBhbmQgQXNzZXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGNyZWRpdCBjYXJkIHR5cGUgYWNjb3VudC4gU3VwcG9ydGVkIHByb2R1Y3RzIGZvciBgY3JlZGl0YCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIFRyYW5zYWN0aW9ucywgSWRlbnRpdHksIGFuZCBMaWFiaWxpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAgICAgKi9cbiAgICBjcmVkaXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxvYW4gdHlwZSBhY2NvdW50LiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBsb2FuYCBhY2NvdW50cyBhcmU6IEJhbGFuY2UsIExpYWJpbGl0aWVzLCBhbmQgVHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGxvYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpbnZlc3RtZW50IGFjY291bnQuIFN1cHBvcnRlZCBwcm9kdWN0cyBmb3IgYGludmVzdG1lbnRgIGFjY291bnRzIGFyZTogQmFsYW5jZSBhbmQgSW52ZXN0bWVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgaW52ZXN0bWVudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE90aGVyIG9yIHVua25vd24gYWNjb3VudCB0eXBlLiBTdXBwb3J0ZWQgcHJvZHVjdHMgZm9yIGBvdGhlcmAgYWNjb3VudHMgYXJlOiBCYWxhbmNlLCBUcmFuc2FjdGlvbnMsIElkZW50aXR5LCBhbmQgQXNzZXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIG90aGVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgY3VycmVuY3kgY29kZXMgYXJlIHN1cHBvcnRlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGxhaWQgc3VwcG9ydHMgYWxsIElTTyA0MjE3IGN1cnJlbmN5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCB2YWx1ZXMgZm9yIGludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLiBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIHJlcHJlc2VudGluZyBpbmZsb3cgb2YgY2FzaCB3aWxsIGFwcGVhciBhcyBuZWdhdGl2ZSBhbW91bnRzLCBvdXRmbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgcG9zaXRpdmUgYW1vdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQnV5aW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGJ1eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNlbGxpbmcgYW4gaW52ZXN0bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgc2VsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY2FuY2VsbGF0aW9uIG9mIGEgcGVuZGluZyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgY2FuY2VsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhc2g6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGZWVzIG9uIHRoZSBhY2NvdW50LCBlLmcuIGNvbW1pc3Npb24sIGJvb2trZWVwaW5nLCBvcHRpb25zLXJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBmZWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCBhIHN0dWRlbnQgbG9hbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3R1ZGVudExvYW4ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCB0aGF0IHRoaXMgbGlhYmlsaXR5IGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgbG9hbi4gRm9yIHNvbWUgaW5zdGl0dXRpb25zLCB0aGlzIG1heSBiZSBhIG1hc2tlZCB2ZXJzaW9uIG9mIHRoZSBudW1iZXIgKGUuZy4sIHRoZSBsYXN0IDQgZGlnaXRzIGluc3RlYWQgb2YgdGhlIGVudGlyZSBudW1iZXIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGVzIG9uIHdoaWNoIGxvYW5lZCBmdW5kcyB3ZXJlIGRpc2J1cnNlZCBvciB3aWxsIGJlIGRpc2J1cnNlZC4gVGhlc2UgYXJlIG9mdGVuIGluIHRoZSBwYXN0LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBkaXNidXJzZW1lbnRfZGF0ZXM6IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN0dWRlbnQgbG9hbiBpcyBleHBlY3RlZCB0byBiZSBwYWlkIG9mZi4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZXhwZWN0ZWRfcGF5b2ZmX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGd1YXJhbnRvciBvZiB0aGUgc3R1ZGVudCBsb2FuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZ3VhcmFudG9yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcmVzdCByYXRlIG9uIHRoZSBsb2FuIGFzIGEgcGVyY2VudGFnZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGludGVyZXN0X3JhdGVfcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiBhIHBheW1lbnQgaXMgY3VycmVudGx5IG92ZXJkdWUuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGxhc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3QgcGF5bWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBsb2FuLCBlLmcuLCBcXFwiQ29uc29saWRhdGlvbiBMb2Fuc1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsb2FuX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fc3RhdHVzOiBTdHVkZW50TG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBwYXltZW50IGR1ZSBmb3IgdGhlIG5leHQgYmlsbGluZyBjeWNsZS4gVGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9uczogU29tZSBpbnN0aXR1dGlvbnMgcmVxdWlyZSBhIG1pbmltdW0gcGF5bWVudCBhY3Jvc3MgYWxsIGxvYW5zIGFzc29jaWF0ZWQgd2l0aCBhbiBhY2NvdW50IG51bWJlci4gT3VyIEFQSSBwcmVzZW50cyB0aGF0IHNhbWUgbWluaW11bSBwYXltZW50IGFtb3VudCBvbiBlYWNoIGxvYW4uIFRoZSBpbnN0aXR1dGlvbnMgdGhhdCBkbyB0aGlzIGFyZTogR3JlYXQgTGFrZXMgKCBgaW5zXzExNjg2MWApLCBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCksIENvbW1vbmJvbmQgRmlyc3RtYXJrIFNlcnZpY2VzIChgaW5zXzExNjk1MGApLCBOZWxuZXQgKGBpbnNfMTE2NTI4YCksIEVkRmluYW5jaWFsIFNlcnZpY2VzIChgaW5zXzExNjMwNGApLCBHcmFuaXRlIFN0YXRlIChgaW5zXzExNjMwOGApLCBhbmQgT2tsYWhvbWEgU3R1ZGVudCBMb2FuIEF1dGhvcml0eSAoYGluc18xMTY5NDVgKS4gRmlyc3RtYXJrIChgaW5zXzExNjI5NWAgKSB3aWxsIGRpc3BsYXkgYXMgJDAgaWYgdGhlcmUgaXMgYW4gYXV0b3BheSBwcm9ncmFtIGluIGVmZmVjdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1ZSBkYXRlIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgZHVlIGRhdGUgaXMgYG51bGxgIGlmIGEgcGF5bWVudCBpcyBub3QgZXhwZWN0ZWQuIEEgcGF5bWVudCBpcyBub3QgZXhwZWN0ZWQgaWYgYGxvYW5fc3RhdHVzLnR5cGVgIGlzIGBkZWZlcm1lbnRgLCBgaW5fc2Nob29sYCwgYGNvbnNvbGlkYXRlZGAsIGBwYWlkIGluIGZ1bGxgLCBvciBgdHJhbnNmZXJyZWRgLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHByaW5jaXBhbCBiYWxhbmNlIG9mIHRoZSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fcHJpbmNpcGFsX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgZG9sbGFyIGFtb3VudCBvZiB0aGUgYWNjcnVlZCBpbnRlcmVzdCBiYWxhbmNlLiBGb3IgU2FsbGllIE1hZSAoIGBpbnNfMTE2OTQ0YCksIHRoaXMgYW1vdW50IGlzIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIGxvYW4sIHNvIHRoaXMgZmllbGQgd2lsbCByZXR1cm4gYXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3V0c3RhbmRpbmdfaW50ZXJlc3RfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWxldmFudCBhY2NvdW50IG51bWJlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGxvYW4gZm9yIHBheW1lbnRzLiBJbiB0aGUgbWFqb3JpdHkgb2YgY2FzZXMsIGBwYXltZW50X3JlZmVyZW5jZV9udW1iZXJgIHdpbGwgbWF0Y2ggYWBjY291bnRfbnVtYmVyLGAgYnV0IGluIHNvbWUgaW5zdGl0dXRpb25zLCBzdWNoIGFzIEdyZWF0IExha2VzIChgaW5zXzExNjg2MWApLCBpdCB3aWxsIGJlIGRpZmZlcmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHBheW1lbnRfcmVmZXJlbmNlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UFNMRlN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBwc2xmX3N0YXR1czogUFNMRlN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudFJlcGF5bWVudFBsYW59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW46IFN0dWRlbnRSZXBheW1lbnRQbGFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHN0dWRlbnQgbG9hbi4gSGVhcnRsYW5kIEVDU0kgKGBpbnNfMTE2OTQ4YCkgZG9lcyBub3QgbWFrZSB0aGlzIGZpZWxkIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHNlcXVlbmNlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZXJBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXJ2aWNlcl9hZGRyZXNzOiBTZXJ2aWNlckFkZHJlc3NEYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIHRvIGRhdGUgKFlURCkgaW50ZXJlc3QgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfaW50ZXJlc3RfcGFpZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIHByaW5jaXBhbCBwYWlkLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHl0ZF9wcmluY2lwYWxfcGFpZDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogU3R1ZGVudCBsb2FuIHJlcGF5bWVudCBpbmZvcm1hdGlvbiB1c2VkIHRvIGNvbmZpZ3VyZSBTYW5kYm94IHRlc3QgZGF0YSBmb3IgdGhlIExpYWJpbGl0aWVzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWwge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgYHN0YW5kYXJkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgYmVmb3JlIHJlcGF5bWVudCBzdGFydHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIG5vbl9yZXBheW1lbnRfbW9udGhzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBvZiByZXBheW1lbnRzIGJlZm9yZSB0aGUgbG9hbiBpcyBwYWlkIG9mZi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsXG4gICAgICovXG4gICAgcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgb2YgdGhlIHN0dWRlbnQgbG9hblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuU3RhdHVzIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB1bnRpbCB3aGljaCB0aGUgbG9hbiB3aWxsIGJlIGluIGl0cyBjdXJyZW50IHN0YXR1cy4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuU3RhdHVzXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyB0eXBlIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIHR5cGU6IFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU3R1ZGVudExvYW5TdGF0dXNUeXBlRW51bSB7XG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgQ2hhcmdlZE9mZiA9ICdjaGFyZ2VkIG9mZicsXG4gICAgQ2xhaW0gPSAnY2xhaW0nLFxuICAgIENvbnNvbGlkYXRlZCA9ICdjb25zb2xpZGF0ZWQnLFxuICAgIERlZmVybWVudCA9ICdkZWZlcm1lbnQnLFxuICAgIERlbGlucXVlbnQgPSAnZGVsaW5xdWVudCcsXG4gICAgRGlzY2hhcmdlZCA9ICdkaXNjaGFyZ2VkJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgICBGb3JiZWFyYW5jZSA9ICdmb3JiZWFyYW5jZScsXG4gICAgSW5HcmFjZSA9ICdpbiBncmFjZScsXG4gICAgSW5NaWxpdGFyeSA9ICdpbiBtaWxpdGFyeScsXG4gICAgSW5TY2hvb2wgPSAnaW4gc2Nob29sJyxcbiAgICBOb3RGdWxseURpc2J1cnNlZCA9ICdub3QgZnVsbHkgZGlzYnVyc2VkJyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgUGFpZEluRnVsbCA9ICdwYWlkIGluIGZ1bGwnLFxuICAgIFJlZnVuZGVkID0gJ3JlZnVuZGVkJyxcbiAgICBSZXBheW1lbnQgPSAncmVwYXltZW50JyxcbiAgICBUcmFuc2ZlcnJlZCA9ICd0cmFuc2ZlcnJlZCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXBheW1lbnQgcGxhbiBmb3IgdGhlIHN0dWRlbnQgbG9hblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRSZXBheW1lbnRQbGFuIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlcGF5bWVudCBwbGFuIGFzIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2aWNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50UmVwYXltZW50UGxhblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSByZXBheW1lbnQgcGxhbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50UmVwYXltZW50UGxhblxuICAgICAqL1xuICAgIHR5cGU6IFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU3R1ZGVudFJlcGF5bWVudFBsYW5UeXBlRW51bSB7XG4gICAgRXh0ZW5kZWRHcmFkdWF0ZWQgPSAnZXh0ZW5kZWQgZ3JhZHVhdGVkJyxcbiAgICBFeHRlbmRlZFN0YW5kYXJkID0gJ2V4dGVuZGVkIHN0YW5kYXJkJyxcbiAgICBHcmFkdWF0ZWQgPSAnZ3JhZHVhdGVkJyxcbiAgICBJbmNvbWVDb250aW5nZW50UmVwYXltZW50ID0gJ2luY29tZS1jb250aW5nZW50IHJlcGF5bWVudCcsXG4gICAgSW5jb21lQmFzZWRSZXBheW1lbnQgPSAnaW5jb21lLWJhc2VkIHJlcGF5bWVudCcsXG4gICAgSW50ZXJlc3RPbmx5ID0gJ2ludGVyZXN0LW9ubHknLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYXlBc1lvdUVhcm4gPSAncGF5IGFzIHlvdSBlYXJuJyxcbiAgICBSZXZpc2VkUGF5QXNZb3VFYXJuID0gJ3JldmlzZWQgcGF5IGFzIHlvdSBlYXJuJyxcbiAgICBTdGFuZGFyZCA9ICdzdGFuZGFyZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhmb3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4Zm9ybSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGF4IGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1cyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgdzI/OiBXMjtcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRheHBheWVySURcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklEIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMYXN0IDQgZGlnaXRzIG9mIHVuaXF1ZSBudW1iZXIgb2YgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGxhc3RfNF9kaWdpdHM/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYSBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxcbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb24/OiBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uRW51bTtcbiAgICAvKipcbiAgICAgKiBUZXh0IG9mIHRoZSBsaW5lIGl0ZW0gYXMgcHJpbnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uRW51bSB7XG4gICAgQm9udXMgPSAnQk9OVVMnLFxuICAgIENvbW1pc3Npb24gPSAnQ09NTUlTU0lPTicsXG4gICAgT3ZlcnRpbWUgPSAnT1ZFUlRJTUUnLFxuICAgIFBhaWRUaW1lT2ZmID0gJ1BBSUQgVElNRSBPRkYnLFxuICAgIFJlZ3VsYXJQYXkgPSAnUkVHVUxBUiBQQVknLFxuICAgIFZhY2F0aW9uID0gJ1ZBQ0FUSU9OJyxcbiAgICBFbXBsb3llZU1lZGljYXJlID0gJ0VNUExPWUVFIE1FRElDQVJFJyxcbiAgICBGaWNhID0gJ0ZJQ0EnLFxuICAgIFNvY2lhbFNlY3VyaXR5RW1wbG95ZWVUYXggPSAnU09DSUFMIFNFQ1VSSVRZIEVNUExPWUVFIFRBWCcsXG4gICAgTWVkaWNhbCA9ICdNRURJQ0FMJyxcbiAgICBWaXNpb24gPSAnVklTSU9OJyxcbiAgICBEZW50YWwgPSAnREVOVEFMJyxcbiAgICBOZXRQYXkgPSAnTkVUIFBBWScsXG4gICAgVGF4ZXMgPSAnVEFYRVMnLFxuICAgIE5vdEZvdW5kID0gJ05PVF9GT1VORCcsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFBsZWFzZSB1c2UgdGhlIGBwYXltZW50X2NoYW5uZWxgIGZpZWxkLCBgdHJhbnNhY3Rpb25fdHlwZWAgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmdfdHJhbnNhY3Rpb25faWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy8jY2F0ZWdvcnktb3ZlcnZpZXcpLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzLyNjYXRlZ29yeS1vdmVydmlldykuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE6IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IG93bmVyLiBUaGlzIGZpZWxkIGlzIG5vdCB0eXBpY2FsbHkgcG9wdWxhdGVkIGFuZCBvbmx5IHJlbGV2YW50IHdoZW4gZGVhbGluZyB3aXRoIHN1Yi1hY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYXBwZWFyLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCBpcyBpbiBiZXRhIGFuZCB3aWxsIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBjbGllbnQgaXMgYm90aCBlbnJvbGxlZCBpbiB0aGUgY2xvc2VkIGJldGEgcHJvZ3JhbSBhbmQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNldHRsZWQgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2NoYW5uZWw6IFRyYW5zYWN0aW9uUGF5bWVudENoYW5uZWxFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIFVLIGluc3RpdHV0aW9ucy4gRm9yIGluc3RpdHV0aW9ucyBpbiBvdGhlciBjb3VudHJpZXMsIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIFVLIGluc3RpdHV0aW9ucy4gRm9yIGluc3RpdHV0aW9ucyBpbiBvdGhlciBjb3VudHJpZXMsIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25Db2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvZGU6IFRyYW5zYWN0aW9uQ29kZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5ICYgYW55fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSAmIGFueSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBhdXRob3JpemVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERUSEg6bW06c3NaYCApLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgVUsgaW5zdGl0dXRpb25zLiBGb3IgaW5zdGl0dXRpb25zIGluIG90aGVyIGNvdW50cmllcywgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuICBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBVSyBpbnN0aXR1dGlvbnMuIEZvciBpbnN0aXR1dGlvbnMgaW4gb3RoZXIgY291bnRyaWVzLCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSAmIGFueX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSAmIGFueSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fdHlwZT86IFRyYW5zYWN0aW9uQmFzZVRyYW5zYWN0aW9uVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy8jY2F0ZWdvcnktb3ZlcnZpZXcpLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBTZWUgW0NhdGVnb3JpZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvI2NhdGVnb3J5LW92ZXJ2aWV3KS4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uIEZvciB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCBpcyBpbiBiZXRhIGFuZCB3aWxsIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBjbGllbnQgaXMgYm90aCBlbnJvbGxlZCBpbiB0aGUgY2xvc2VkIGJldGEgcHJvZ3JhbSBhbmQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSBhY2NvdW50XFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBwZW5kaW5nOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBBbiBpZGVudGlmaWVyIGNsYXNzaWZ5aW5nIHRoZSB0cmFuc2FjdGlvbiB0eXBlLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgRXVyb3BlYW4gaW5zdGl0dXRpb25zLiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhLCB0aGlzIGZpZWxkIGlzIHNldCB0byBgbnVsbGAuICBgYWRqdXN0bWVudDpgIEJhbmsgYWRqdXN0bWVudCAgYGF0bTpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsIHZpYSBhbiBhdXRvbWF0ZWQgdGVsbGVyIG1hY2hpbmUgIGBiYW5rIGNoYXJnZTpgIENoYXJnZSBvciBmZWUgbGV2aWVkIGJ5IHRoZSBpbnN0aXR1dGlvbiAgYGJpbGwgcGF5bWVudGA6IFBheW1lbnQgb2YgYSBiaWxsICBgY2FzaDpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsICBgY2FzaGJhY2s6YCBDYXNoIHdpdGhkcmF3YWwgd2hpbGUgbWFraW5nIGEgZGViaXQgY2FyZCBwdXJjaGFzZSAgYGNoZXF1ZTpgIERvY3VtZW50IG9yZGVyaW5nIHRoZSBwYXltZW50IG9mIG1vbmV5IHRvIGFub3RoZXIgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiAgYGRpcmVjdCBkZWJpdDpgIEF1dG9tYXRpYyB3aXRoZHJhd2FsIG9mIGZ1bmRzIGluaXRpYXRlZCBieSBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYGludGVyZXN0OmAgSW50ZXJlc3QgZWFybmVkIG9yIGluY3VycmVkICBgcHVyY2hhc2U6YCBQdXJjaGFzZSBtYWRlIHdpdGggYSBkZWJpdCBvciBjcmVkaXQgY2FyZCAgYHN0YW5kaW5nIG9yZGVyOmAgUGF5bWVudCBpbnN0cnVjdGVkIGJ5IHRoZSBhY2NvdW50IGhvbGRlciB0byBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYHRyYW5zZmVyOmAgVHJhbnNmZXIgb2YgbW9uZXkgYmV0d2VlbiBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25Db2RlIHtcbiAgICBBZGp1c3RtZW50ID0gJ2FkanVzdG1lbnQnLFxuICAgIEF0bSA9ICdhdG0nLFxuICAgIEJhbmtDaGFyZ2UgPSAnYmFuayBjaGFyZ2UnLFxuICAgIEJpbGxQYXltZW50ID0gJ2JpbGwgcGF5bWVudCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBDYXNoYmFjayA9ICdjYXNoYmFjaycsXG4gICAgQ2hlcXVlID0gJ2NoZXF1ZScsXG4gICAgRGlyZWN0RGViaXQgPSAnZGlyZWN0IGRlYml0JyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgUHVyY2hhc2UgPSAncHVyY2hhc2UnLFxuICAgIFN0YW5kaW5nT3JkZXIgPSAnc3RhbmRpbmcgb3JkZXInLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hdGNoZWQgZGlyZWN0IGRlcG9zaXQgdHJhbnNhY3Rpb24gdXNlZCB0byB2ZXJpZnkgYSB1c2VyXFwncyBwYXlyb2xsIGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkRhdGEge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVuZCB1c2VyXFwncyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSB0byBwb3B1bGF0ZSBhcyB0ZXN0IHRyYW5zYWN0aW9uIGRhdGEuIElmIG5vdCBzcGVjaWZpZWQsIHJhbmRvbSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3ZlcnJpZGUge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC4gVHJhbnNhY3Rpb24gZGF0ZXMgaW4gdGhlIHBhc3Qgb3IgcHJlc2VudCB3aWxsIHJlc3VsdCBpbiBwb3N0ZWQgdHJhbnNhY3Rpb25zOyB0cmFuc2FjdGlvbiBkYXRlcyBpbiB0aGUgZnV0dXJlIHdpbGwgcmVzdWx0IGluIHBlbmRpbmcgdHJhbnNhY3Rpb25zLiBUcmFuc2FjdGlvbnMgaW4gU2FuZGJveCB3aWxsIG1vdmUgZnJvbSBwZW5kaW5nIHRvIHBvc3RlZCBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGRhdGUgaGFzIGJlZW4gcmVhY2hlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZV90cmFuc2FjdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIENhbiBiZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBmb3JtYXQgY3VycmVuY3kgY29kZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LiBJZiBzcGVjaWZpZWQsIGBvcHRpb25zYCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbSAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBmaWVsZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSBwYXJzZWQgZGF0YSBwcm92aWRlZCwgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIG9iamVjdCBpbiB0aGUgcmVzcG9uc2UuIFRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgaW4gYmV0YSDigJMgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TX1JFTU9WRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2ZlciB3aXRoaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzczogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdGhhdCBzaG91bGQgYmUgY3JlZGl0ZWQvZGViaXRlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IC0gVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSAtIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCAtIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIC0gTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgLSBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zZmVyQXV0aG9yaXphdGlvbiBjb250YWlucyB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBmb3IgYSBwcm9wb3NlZCB0cmFuc2ZlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb24ge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHJlcHJlc2VudGluZyB3aGVuIHRoZSBhdXRob3JpemF0aW9uIHdhcyBjcmVhdGVkLCBpbiB0aGUgZm9ybWF0IFxcXCIyMDA2LTAxLTAyVDE1OjA0OjA1WlxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgYXBwcm92ZWRgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcuIFBsYWlkIGhhcyBhbHNvIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgaGFzIGFwcHJvdmVkIGl0IGZvciBwcm9jZXNzaW5nLiAgIGBwZXJtaXR0ZWRgIOKAkyBQbGFpZCB3YXMgdW5hYmxlIHRvIGZldGNoIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBhcHByb3ZlIG9yIGRlY2xpbmUgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiBZb3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBmdXJ0aGVyIHJldmlldyBpcyByZWNvbW1lbmRlZC4gUGxhaWQgaXMgYXdhaXRpbmcgZnVydGhlciBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgY2xpZW50LiAgYGRlY2xpbmVkYCDigJMgUGxhaWQgcmV2aWV3ZWQgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGFuZCBkZWNsaW5lZCBwcm9jZXNzaW5nLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBwcm9wb3NlZF90cmFuc2ZlcjogVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2Zlcjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbkVudW0ge1xuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBQZXJtaXR0ZWQgPSAncGVybWl0dGVkJyxcbiAgICBEZWNsaW5lZCA9ICdkZWNsaW5lZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIOKAnDEwLjAw4oCdKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzOiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZXZpY2U7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyBhdXRob3JpemF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBhY2NvdW50IHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByYXRpb25hbGUgZm9yIFBsYWlkXFwncyBkZWNpc2lvbiByZWdhcmRpbmcgYSBwcm9wb3NlZCB0cmFuc2Zlci4gV2lsbCBiZSBudWxsIGZvciBgYXBwcm92ZWRgIGRlY2lzaW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmF0aW9uYWxlIGZvciBwZXJtaXR0aW5nIG9yIGRlY2xpbmluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICBgTlNGYCDigJMgVHJhbnNhY3Rpb24gbGlrZWx5IHRvIHJlc3VsdCBpbiBhIHJldHVybiBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFJJU0tgIC0gVHJhbnNhY3Rpb24gaXMgaGlnaC1yaXNrLiAgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gIOKAkyBJdGVtIGNyZWF0ZWQgdmlhIHNhbWUtZGF5IG1pY3JvIGRlcG9zaXRzLCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gUGxhaWQgY2FuIG9ubHkgb2ZmZXIgYHBlcm1pdHRlZGAgYXMgYSB0cmFuc2FjdGlvbiBkZWNpc2lvbi4gIGBMT0dJTl9SRVFVSVJFRGAg4oCTIFVuYWJsZSB0byBjb2xsZWN0IHRoZSBhY2NvdW50IGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIGR1ZSB0byBJdGVtIHN0YWxlbmVzcy4gQ2FuIGJlIHJlY3RpZmllZCB1c2luZyBMaW5rIHVwZGF0ZSBtb2RlLiAgYEVSUk9SYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gZHVlIHRvIGFuIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgY29kZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHBlcm1pdHRlZCB0cmFuc2ZlciBvciB0cmFuc2ZlciBkZWNsaW5lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGVFbnVtIHtcbiAgICBOc2YgPSAnTlNGJyxcbiAgICBSaXNrID0gJ1JJU0snLFxuICAgIE1hbnVhbGx5VmVyaWZpZWRJdGVtID0gJ01BTlVBTExZX1ZFUklGSUVEX0lURU0nLFxuICAgIExvZ2luUmVxdWlyZWQgPSAnTE9HSU5fUkVRVUlSRUQnLFxuICAgIEVycm9yID0gJ0VSUk9SJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBhZ2VudCBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlciB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNoX2NsYXNzOiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4g4oCcMTAuMDDigJ0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiAtIFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgLSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgLSBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyAtIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIC0gTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBldmVudCBvY2N1cnJlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IFRyYW5zZmVyRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIOKAnDEwLjAw4oCdKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZT86IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFRyYW5zZmVyVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGV2ZW50cyBieSBldmVudCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGVzPzogQXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RUcmFuc2ZlclR5cGVFbnVtIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgKGxhcmdlc3QpIGBldmVudF9pZGAgZmV0Y2hlZCB2aWEgdGhlIHN5bmMgZW5kcG9pbnQsIG9yIDAgaW5pdGlhbGx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2V2ZW50czogQXJyYXk8VHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgdGhpcyB0cmFuc2ZlciByZXByZXNlbnRzLiAgYHBlbmRpbmdgOiBBIG5ldyB0cmFuc2ZlciB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgY2FuY2VsbGVkYDogVGhlIHRyYW5zZmVyIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gIGBmYWlsZWRgOiBUaGUgdHJhbnNmZXIgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHBvc3RlZGA6IFRoZSB0cmFuc2ZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgcmV2ZXJzZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV2ZXJzZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIHR5cGUgb2YgdGhpcyB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV2ZXJzZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRmFpbHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRmFpbHVyZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXZlcnNlZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW0JhbmsgVHJhbnNmZXJzIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvYmFuay10cmFuc2ZlcnMvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyczogQXJyYXk8VHJhbnNmZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBWYWxpZCBvcHRpb25zIGFyZSBgYWNoYCBvciBgc2FtZS1kYXktYWNoYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCdcbn1cblxuLyoqXG4gKiBUaGUgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBudW1iZXIgYW5kIG5hbWUgKGkuZS4sIFxcXCIxMDAgTWFya2V0IFN0LlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXguIFxcXCJTYW4gRnJhbmNpc2NvXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNhbGlmb3JuaWFcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSAoZS5nLiwgXFxcIjk0MTAzXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgKGUuZy4sIFxcXCJVU1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWV0IG51bWJlciBhbmQgbmFtZSAoaS5lLiwgXFxcIjEwMCBNYXJrZXQgU3QuXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXguIFxcXCJTYW4gRnJhbmNpc2NvXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDYWxpZm9ybmlhXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgKGUuZy4sIFxcXCJVU1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2Uge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFNlbmRpbmcgYW4gZW1wdHkgb2JqZWN0IGFzIGEgY29uZmlndXJhdGlvbiB3aWxsIHJlc3VsdCBpbiBhbiBhY2NvdW50IGNvbmZpZ3VyZWQgd2l0aCByYW5kb20gYmFsYW5jZXMgYW5kIHRyYW5zYWN0aW9uIGhpc3RvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDdXN0b21QYXNzd29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDdXN0b21QYXNzd29yZCB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBhc3N3b3JkIHNjaGVtYSB0byB1c2UsIHBvc3NpYmxlIHZhbHVlcyBhcmUgMSBvciAyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyLiBZb3Ugc2hvdWxkIG9ubHkgc3BlY2lmeSAxIGlmIHlvdSBrbm93IGl0IGlzIG5lY2Vzc2FyeSBmb3IgeW91ciB0ZXN0IHN1aXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHZlcnNpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2VlZCwgaW4gdGhlIGZvcm0gb2YgYSBzdHJpbmcsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJhbmRvbWx5IGdlbmVyYXRlIGFjY291bnQgYW5kIHRyYW5zYWN0aW9uIGRhdGEsIGlmIHRoaXMgZGF0YSBpcyBub3Qgc3BlY2lmaWVkIHVzaW5nIHRoZSBgb3ZlcnJpZGVfYWNjb3VudHNgIGFyZ3VtZW50LiBJZiBubyBzZWVkIGlzIHNwZWNpZmllZCwgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCBkYXRhIHdpbGwgYmUgZGlmZmVyZW50IGVhY2ggdGltZS4gIE5vdGUgdGhhdCB0cmFuc2FjdGlvbnMgZGF0YSBpcyBnZW5lcmF0ZWQgcmVsYXRpdmUgdG8gdGhlIEl0ZW1cXCdzIGNyZWF0aW9uIGRhdGUuIERpZmZlcmVudCBJdGVtcyBjcmVhdGVkIG9uIGRpZmZlcmVudCBkYXRlcyB3aXRoIHRoZSBzYW1lIHNlZWQgZm9yIHRyYW5zYWN0aW9ucyBkYXRhIHdpbGwgaGF2ZSBkaWZmZXJlbnQgZGF0ZXMgZm9yIHRoZSB0cmFuc2FjdGlvbnMuIFRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGVhY2ggdHJhbnNhY3Rpb24gYW5kIHRoZSBJdGVtIGNyZWF0aW9uIHdpbGwgcmVtYWluIGNvbnN0YW50LiBGb3IgZXhhbXBsZSwgYW4gSXRlbSBjcmVhdGVkIG9uIERlY2VtYmVyIDE1IG1pZ2h0IHNob3cgYSB0cmFuc2FjdGlvbiBvbiBEZWNlbWJlciAxNC4gQW4gSXRlbSBjcmVhdGVkIG9uIERlY2VtYmVyIDIwLCB1c2luZyB0aGUgc2FtZSBzZWVkLCB3b3VsZCBzaG93IHRoYXQgc2FtZSB0cmFuc2FjdGlvbiBvY2N1cnJpbmcgb24gRGVjZW1iZXIgMTkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgc2VlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgb3ZlcnJpZGVzIHRvIGNvbmZpZ3VyZSB0aGUgYWNjb3VudHMgZm9yIHRoZSBJdGVtLiBCeSBkZWZhdWx0LCBpZiBubyBvdmVycmlkZSBpcyBzcGVjaWZpZWQsIHRyYW5zYWN0aW9ucyBhbmQgYWNjb3VudCBkYXRhIHdpbGwgYmUgcmFuZG9tbHkgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBhY2NvdW50IHR5cGUgYW5kIHN1YnR5cGUsIGFuZCBvdGhlciBwcm9kdWN0cyB3aWxsIGhhdmUgZml4ZWQgb3IgZW1wdHkgZGF0YS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3ZlcnJpZGVBY2NvdW50cz59XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIG92ZXJyaWRlX2FjY291bnRzOiBBcnJheTxPdmVycmlkZUFjY291bnRzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TUZBfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBtZmE6IE1GQTtcbiAgICAvKipcbiAgICAgKiBZb3UgbWF5IHRyaWdnZXIgYSByZUNBUFRDSEEgaW4gUGxhaWQgTGluayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCBieSB1c2luZyB0aGUgcmVjYXB0Y2hhIGZpZWxkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBnb29kYCBvciBgYmFkYC4gQSB2YWx1ZSBvZiBgZ29vZGAgd2lsbCByZXN1bHQgaW4gc3VjY2Vzc2Z1bCBJdGVtIGNyZWF0aW9uIGFuZCBgYmFkYCB3aWxsIHJlc3VsdCBpbiBhIGBSRUNBUFRDSEFfQkFEYCBlcnJvciB0byBzaW11bGF0ZSBhIGZhaWxlZCByZUNBUFRDSEEuIEJvdGggdmFsdWVzIHJlcXVpcmUgdGhlIHJlQ0FQVENIQSB0byBiZSBtYW51YWxseSBzb2x2ZWQgd2l0aGluIFBsYWlkIExpbmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgcmVjYXB0Y2hhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3IgY29kZSB0byBmb3JjZSBvbiBJdGVtIGNyZWF0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgYFxcXCJJTlNUSVRVVElPTl9OT1RfUkVTUE9ORElOR1xcXCJgIGBcXFwiSU5TVElUVVRJT05fTk9fTE9OR0VSX1NVUFBPUlRFRFxcXCJgIGBcXFwiSU5WQUxJRF9DUkVERU5USUFMU1xcXCJgIGBcXFwiSU5WQUxJRF9NRkFcXFwiYCBgXFxcIklURU1fTE9DS0VEXFxcImAgYFxcXCJJVEVNX0xPR0lOX1JFUVVJUkVEXFxcImAgYFxcXCJJVEVNX05PVF9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfTElOS19UT0tFTlxcXCJgIGBcXFwiTUZBX05PVF9TVVBQT1JURURcXFwiYCBgXFxcIk5PX0FDQ09VTlRTXFxcImAgYFxcXCJQTEFJRF9FUlJPUlxcXCJgIGBcXFwiUFJPRFVDVFNfTk9UX1NVUFBPUlRFRFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGAgd2ViaG9vayBpcyBmaXJlZCB0byB3aGVuIGFuIGVuZCB1c2VyIGhhcyB1c2VkIHRoZSBbbXkucGxhaWQuY29tIHBvcnRhbF0oaHR0cHM6Ly9teS5wbGFpZC5jb20pIHRvIHJldm9rZSB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBPbmNlIGFjY2VzcyB0byBhbiBJdGVtIGhhcyBiZWVuIHJldm9rZWQsIGl0IGNhbm5vdCBiZSByZXN0b3JlZC4gSWYgdGhlIHVzZXIgc3Vic2VxdWVudGx5IHJldHVybnMgdG8geW91ciBhcHBsaWNhdGlvbiwgYSBuZXcgSXRlbSBtdXN0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vycm9yfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSB3YXMgbm90IHZlcmlmaWVkIHZpYSBhdXRvbWF0ZWQgbWljcm8tZGVwb3NpdHMgYWZ0ZXIgdGVuIGRheXMgc2luY2UgdGhlIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0IHdhcyBtYWRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXMge1xuICAgIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXNVc2VyUHJlc2VuY2VSZXF1aXJlZCA9ICdWRVJJRklDQVRJT05fUkVGUkVTSF9TVEFUVVNfVVNFUl9QUkVTRU5DRV9SRVFVSVJFRCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUVEXFxcImA6IFRoZSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgYFxcXCJVTlZFUklGSUVEXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBwZXJmb3JtZWQuICBgXFxcIk5FRURTX0lORk9cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiB3YXMgYXR0ZW1wdGVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBtaXNzaW5nIGluZm9ybWF0aW9uLiAgXFxcImBVTkFCTEVfVE9fVkVSSUZZYFxcXCI6IFRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBcXFwiVU5LTk9XTlxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBWZXJpZmllZCA9ICdWRVJJRklFRCcsXG4gICAgVW52ZXJpZmllZCA9ICdVTlZFUklGSUVEJyxcbiAgICBOZWVkc0luZm8gPSAnTkVFRFNfSU5GTycsXG4gICAgVW5hYmxlVG9WZXJpZnkgPSAnVU5BQkxFX1RPX1ZFUklGWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMiB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGF4X3llYXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBzZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfOT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgb3RoZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzPzogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyQm94MTIge1xuICAgIFtrZXk6IHN0cmluZ106IG9iamVjdCB8IGFueTtcblxuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlcyB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBlbXBsb3llcl9zdGF0ZV9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgYW5kIHRpcHMgZnJvbSB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBsb2NhbF93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBsb2NhbGl0eV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXQgaXMgcG9zc2libGUgZm9yIGFuIEFzc2V0IFJlcG9ydCB0byBiZSByZXR1cm5lZCB3aXRoIG1pc3NpbmcgYWNjb3VudCBvd25lciBpbmZvcm1hdGlvbi4gSW4gc3VjaCBjYXNlcywgdGhlIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gd2FybmluZyBkYXRhIGluIHRoZSByZXNwb25zZSwgaW5kaWNhdGluZyB3aHkgb2J0YWluaW5nIHRoZSBvd25lciBpbmZvcm1hdGlvbiBmYWlsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXJuaW5nIHtcbiAgICBba2V5OiBzdHJpbmddOiBvYmplY3QgfCBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQVNTRVRfUkVQT1JUX1dBUk5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gQ3VycmVudGx5LCB0aGUgb25seSBwb3NzaWJsZSB3YXJuaW5nIGNvZGUgaXMgYE9XTkVSU19VTkFWQUlMQUJMRWAsIHdoaWNoIGluZGljYXRlcyB0aGF0IGFjY291bnQtb3duZXIgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBXYXJuaW5nV2FybmluZ0NvZGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYXJuaW5nV2FybmluZ0NvZGVFbnVtIHtcbiAgICBPd25lcnNVbmF2YWlsYWJsZSA9ICdPV05FUlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB3ZWJob29rIGlzIHVwZGF0ZWQuIFRoaXMgd2lsbCBiZSBzZW50IHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9vayB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBJRCAoIGBraWRgICkgZnJvbSB0aGUgSldUIGhlYWRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGtleV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZSB7XG4gICAgW2tleTogc3RyaW5nXTogb2JqZWN0IHwgYW55O1xuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0pXS1B1YmxpY0tleX1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAga2V5OiBKV0tQdWJsaWNLZXk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzQmFsYW5jZUdldDogYXN5bmMgKGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYWNjb3VudHNCYWxhbmNlR2V0JywgJ2FjY291bnRzQmFsYW5jZUdldFJlcXVlc3QnLCBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciBhbnkgbGlua2VkIEl0ZW0uIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzLCBpLmUuIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIGJhbGFuY2VzIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQ6IGFzeW5jIChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzR2V0JywgJ2FjY291bnRzR2V0UmVxdWVzdCcsIGFjY291bnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0OiBhc3luYyAoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhcHBsaWNhdGlvbkdldCcsICdhcHBsaWNhdGlvbkdldFJlcXVlc3QnLCBhcHBsaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FwcGxpY2F0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQ6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0JywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MvI0Fzc2V0cy13ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRDcmVhdGU6IGFzeW5jIChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0Q3JlYXRlJywgJ2Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcykgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEZpbHRlcjogYXN5bmMgKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRGaWx0ZXInLCAnYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0JywgYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvZmlsdGVyYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuICBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEdldCcsICdhc3NldFJlcG9ydEdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFBkZkdldDogYXN5bmMgKGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRQZGZHZXQnLCAnYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaDogYXN5bmMgKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZWZyZXNoJywgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnLCBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZW1vdmUnLCAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBBbHNvIG5vdGUgdGhhdCBgL2F1dGgvZ2V0YCB3aWxsIG5vdCByZXR1cm4gZGF0YSBmb3IgYW55IG5ldyBhY2NvdW50cyBvcGVuZWQgYWZ0ZXIgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQuIFRvIG9idGFpbiBkYXRhIGZvciBuZXcgYWNjb3VudHMsIGNyZWF0ZSBhIG5ldyBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoR2V0OiBhc3luYyAoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2F1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhdXRoR2V0JywgJ2F1dGhHZXRSZXF1ZXN0JywgYXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2F1dGgvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGF1dGhHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXQnLCAnYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsOiBhc3luYyAoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDYW5jZWwnLCAnYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNyZWF0ZTogYXN5bmMgKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQ3JlYXRlJywgJ2JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdCcsICdiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIGJhbmsgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRTeW5jJywgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckdldCcsICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdDogYXN5bmMgKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTGlzdCcsICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudCcsICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdCcsICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgICBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgQ2F0ZWdvcmllc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhdGVnb3JpZXNHZXQ6IGFzeW5jIChib2R5OiBvYmplY3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY2F0ZWdvcmllc0dldCcsICdib2R5JywgYm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY2F0ZWdvcmllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW46IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWF0ZVBheW1lbnRUb2tlbicsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlOiBhc3luYyAoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEdldDogYXN5bmMgKGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaEdldCcsICdkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaDogYXN5bmMgKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95ZXJzU2VhcmNoJywgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnLCBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3llcnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgaWRlbnRpdHkgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldDogYXN5bmMgKGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlHZXQnLCAnaWRlbnRpdHlHZXRSZXF1ZXN0JywgaWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9jcmVhdGVgIGJlZ2lucyB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHJldHVybmluZyBhbiBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgdW5kZXIgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgTGluayBpbnN0YW5jZSB0aGF0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIGdvIHRocm91Z2ggdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdy4gUGxhaWQgd2lsbCBmaXJlIGFuIGBJTkNPTUVgIHdlYmhvb2sgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIFBheXJvbGwgSW5jb21lIGZsb3csIG9yIHdoZW4gdGhlIHVwbG9hZGVkIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUnLCAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBwYXlzdHViIFBERiB0aGF0IHRoZSBlbmQgdXNlciB1cGxvYWRlZCB2aWEgUGF5c3R1YiBJbXBvcnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgd2l0aCB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQnLCAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIGEgc2luZ2xlIHBheXN0dWIgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXQ6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHViL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQ6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0JywgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgcmV0dXJucyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSB0aGUgaW5jb21lIHByb2R1Y3RcbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBlbGlnaWJpbGl0eSBmb3IgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvZHVjdFxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2s6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrJywgJ2luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3JlZnJlc2hgIHJlZnJlc2hlcyBhIGdpdmVuIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2g6IGFzeW5jIChpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luY29tZVZlcmlmaWNhdGlvblJlZnJlc2gnLCAnaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9zdW1tYXJ5L2dldGAgcmV0dXJucyBhIHZlcmlmaWNhdGlvbiBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHRoYXQgd2FzIHZlcmlmaWVkIGZvciBhbiBlbmQgdXNlci4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0JywgJ2luY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vc3VtbWFyeS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGF4Zm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncy4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldDogYXN5bmMgKGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zR2V0JywgJ2luc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zU2VhcmNoOiBhc3luYyAoaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNTZWFyY2gnLCAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcsIGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9zZWFyY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldDogYXN5bmMgKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQnLCAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGU6IGFzeW5jIChpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUnLCAnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QnLCBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3Q6IGFzeW5jIChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1BcHBsaWNhdGlvbkxpc3QnLCAnaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9hcHBsaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUnLCAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbjogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUNyZWF0ZVB1YmxpY1Rva2VuJywgJ2l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1HZXQ6IGFzeW5jIChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1HZXQnLCAnaXRlbUdldFJlcXVlc3QnLCBpdGVtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgUGxhaWQgbmF0aXZlIGFjY291bnQgSUQgZm9yIHRoZSBhY2NvdW50IHRoZSB1c2VyIHdpbGwgc3dpdGNoIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIChgdGFyZ2V0X2FjY291bnRfaWRgKS5cbiAgICAgICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtSW1wb3J0OiBhc3luYyAoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1JbXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtSW1wb3J0JywgJ2l0ZW1JbXBvcnRSZXF1ZXN0JywgaXRlbUltcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vaW1wb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1JbXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtUHVibGljVG9rZW5FeGNoYW5nZScsICdpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QnLCBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gICBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgTm90ZSB0aGF0IGluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaXNzdWluZyBhbiBgL2l0ZW0vcmVtb3ZlYCAgcmVxdWVzdCB3aWxsIG5vdCBkZWNyZW1lbnQgeW91ciBsaXZlIGNyZWRlbnRpYWwgY291bnQuIFRvIGluY3JlYXNlIHlvdXIgY3JlZGVudGlhbCBhY2NvdW50IGluIERldmVsb3BtZW50LCBjb250YWN0IFN1cHBvcnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVJlbW92ZTogYXN5bmMgKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVJlbW92ZScsICdpdGVtUmVtb3ZlUmVxdWVzdCcsIGl0ZW1SZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcy8jaXRlbS13ZWJob29rLXVybC11cGRhdGVkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGU6IGFzeW5jIChpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1XZWJob29rVXBkYXRlJywgJ2l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCcsIGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Rva2Vucy8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaWFiaWxpdGllc0dldDogYXN5bmMgKGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlhYmlsaXRpZXNHZXQnLCAnbGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgbGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saWFiaWxpdGllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5DcmVhdGU6IGFzeW5jIChsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtUb2tlbkNyZWF0ZScsICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JywgbGlua1Rva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGluay90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHktY3JlYXRlZCBgbGlua190b2tlbmAgdXNpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50LiBJdCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldDogYXN5bmMgKGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua1Rva2VuR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua1Rva2VuR2V0JywgJ2xpbmtUb2tlbkdldFJlcXVlc3QnLCBsaW5rVG9rZW5HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL3Rva2VuL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIgb3IgR0JQLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgYW5kIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yaywgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgLyBFVVIuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQuICBBIHBheW1lbnQgY2FuIG9ubHkgYmUgcmV2ZXJzZWQgb25jZSBhbmQgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgb3JpZ2luYWwgc2VuZGVyXFwncyBhY2NvdW50LiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkuICBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlJywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0OiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nIG9yIHNhdmluZ3MgYWNjb3VudCB0aGF0XFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckF1dGhHZXQ6IGFzeW5jIChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckF1dGhHZXQnLCAncHJvY2Vzc29yQXV0aEdldFJlcXVlc3QnLCBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2F1dGgvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbGFuY2VHZXQ6IGFzeW5jIChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckJhbGFuY2VHZXQnLCAncHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QnLCBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZScsICdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySWRlbnRpdHlHZXQ6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5R2V0JywgJ3Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCcsIHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGU6IGFzeW5jIChwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUnLCAncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZScsICdzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9vaycsICdzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0Jywgc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gQ2FsbGluZyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgVHJhbnNhY3Rpb25zIGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1GaXJlV2ViaG9vaycsICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luOiBhc3luYyAoc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVJlc2V0TG9naW4nLCAnc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBOb3RlIHRoYXQgbm90IGFsbCBQbGFpZCBkZXZlbG9wZXIgYWNjb3VudHMgYXJlIGVuYWJsZWQgZm9yIG1pY3JvLWRlcG9zaXQgYmFzZWQgdmVyaWZpY2F0aW9uIGJ5IGRlZmF1bHQuIFlvdXIgYWNjb3VudCBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoaXMgZmVhdHVyZSBpbiBvcmRlciB0byB0ZXN0IGl0IGluIFNhbmRib3guIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmVzIG9yIGNoZWNrIHlvdXIgc3RhdHVzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIG9yIFtzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdH0gc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXM6IGFzeW5jIChzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzJywgJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCcsIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHM6IGFzeW5jIChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzJywgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcsIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9vYXV0aC9zZWxlY3RfYWNjb3VudHNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlJywgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC4gVGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciBpZiBjYWxsZWQgYSBzZWNvbmQgdGltZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIGZvciBgaW5pdGlhdGVkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzaWduYWxEZWNpc2lvblJlcG9ydCcsICdzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZTogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRXZhbHVhdGUnLCAncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL2V2YWx1YXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxSZXR1cm5SZXBvcnQ6IGFzeW5jIChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFJldHVyblJlcG9ydCcsICdzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3JldHVybi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzI2ludmVzdG1lbnRzKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIEFuIEl0ZW1cXCdzIGBzdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1pbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNHZXQnLCAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyNkZWxldGVkLXRyYW5zYWN0aW9ucy1kZXRlY3RlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgQWNjZXNzIHRvIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGluIFByb2R1Y3Rpb24gaXMgc3BlY2lmaWMgdG8gY2VydGFpbiBwcmljaW5nIHBsYW5zLiBJZiB5b3UgY2Fubm90IGFjY2VzcyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpbiBQcm9kdWN0aW9uLCBbY29udGFjdCBTYWxlc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2NvbnRhY3QpIGZvciBhc3Npc3RhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoOiBhc3luYyAodHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWZyZXNoJywgJ3RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRyYW5zZmVyIGZhaWx1cmUgcmlzay4gIEluIFBsYWlkXFwncyBzYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYGRlY2xpbmVkX25zZl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGBkZWNsaW5lZF9yaXNrX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCAgICAtIFRvIHBlcm1pdCBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIHBlcm1pdCBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBMT0dJTl9SRVFVSVJFRGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICBBbGwgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb25zIG90aGVyIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIHdpbGwgcmVzdWx0IGluIGEgZGVjaXNpb24gb2YgcGVybWl0dGVkIGFuZCByYXRpb25hbGUgY29kZSBgRVJST1JgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlJywgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNhbmNlbCcsICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDcmVhdGUnLCAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3Q6IGFzeW5jICh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRMaXN0JywgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jOiBhc3luYyAodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckV2ZW50U3luYycsICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyR2V0JywgJ3RyYW5zZmVyR2V0UmVxdWVzdCcsIHRyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3Q6IGFzeW5jICh0cmFuc2Zlckxpc3RSZXF1ZXN0OiBUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGlzdCcsICd0cmFuc2Zlckxpc3RSZXF1ZXN0JywgdHJhbnNmZXJMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldDogYXN5bmMgKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCcsICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcsIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIGFueSBsaW5rZWQgSXRlbS4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMsIGkuZS4gYWNjb3VudHMgdGhhdCBhcmUgbm90IGNsb3NlZCBhbmQgYXJlIGNhcGFibGUgb2YgY2FycnlpbmcgYSBiYWxhbmNlLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgYmFsYW5jZXMgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXBwbGljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcy8jQXNzZXRzLXdlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuICBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcykgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBhdXRoYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuICBBbHNvIG5vdGUgdGhhdCBgL2F1dGgvZ2V0YCB3aWxsIG5vdCByZXR1cm4gZGF0YSBmb3IgYW55IG5ldyBhY2NvdW50cyBvcGVuZWQgYWZ0ZXIgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQuIFRvIG9idGFpbiBkYXRhIGZvciBuZXcgYWNjb3VudHMsIGNyZWF0ZSBhIG5ldyBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIGJhbmsgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBDYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB3aXRob3V0IHVzaW5nIFBsYWlkIEV4Y2hhbmdlXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95ZXJzL3NlYXJjaGAgYWxsb3dzIHlvdSB0aGUgYWJpbGl0eSB0byBzZWFyY2ggUGxhaWTigJlzIGRhdGFiYXNlIG9mIGtub3duIGVtcGxveWVycywgZm9yIHVzZSB3aXRoIERlcG9zaXQgU3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGVuZHBvaW50IHRvIGxvb2sgdXAgYSB1c2VyXFwncyBlbXBsb3llciBpbiBvcmRlciB0byBjb25maXJtIHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiBVc2VycyB3aXRoIG5vbi1zdXBwb3J0ZWQgZW1wbG95ZXJzIGNhbiB0aGVuIGJlIHJvdXRlZCBvdXQgb2YgdGhlIERlcG9zaXQgU3dpdGNoIGZsb3cuICBUaGUgZGF0YSBpbiB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgY3VycmVudGx5IGxpbWl0ZWQuIEFzIHRoZSBEZXBvc2l0IFN3aXRjaCBhbmQgSW5jb21lIHByb2R1Y3RzIHByb2dyZXNzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBiZXRhIHBlcmlvZHMsIG1vcmUgZW1wbG95ZXJzIGFyZSBiZWluZyByZWd1bGFybHkgYWRkZWQuIEJlY2F1c2UgdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGZyZXF1ZW50bHkgdXBkYXRlZCwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGRvIG5vdCBjYWNoZSBvciBzdG9yZSBkYXRhIGZyb20gdGhpcyBlbmRwb2ludCBmb3IgbW9yZSB0aGFuIGEgZGF5LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RW1wbG95ZXJzU2VhcmNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgcGF5c3R1YiBQREYgdGhhdCB0aGUgZW5kIHVzZXIgdXBsb2FkZWQgdmlhIFBheXN0dWIgSW1wb3J0LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZSBhdmFpbGFibGUgZm9yIGRvd25sb2FkIHdpdGggdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSBhIHNpbmdsZSBwYXlzdHViIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AgcmV0dXJucyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSB0aGUgaW5jb21lIHByb2R1Y3RcbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBlbGlnaWJpbGl0eSBmb3IgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvZHVjdFxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaChpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblJlZnJlc2goaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vc3VtbWFyeS9nZXRgIHJldHVybnMgYSB2ZXJpZmljYXRpb24gc3VtbWFyeSBmb3IgdGhlIGluY29tZSB0aGF0IHdhcyB2ZXJpZmllZCBmb3IgYW4gZW5kIHVzZXIuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGluZm9ybWF0aW9uIGRlcml2ZWQgZnJvbSBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldChpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXQoaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0YXhmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEludmVzdG1lbnQgaG9sZGluZ3NcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUdldChpdGVtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIFBsYWlkIG5hdGl2ZSBhY2NvdW50IElEIGZvciB0aGUgYWNjb3VudCB0aGUgdXNlciB3aWxsIHN3aXRjaCB0aGVpciBkaXJlY3QgZGVwb3NpdCB0byAoYHRhcmdldF9hY2NvdW50X2lkYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUltcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICBOb3RlIHRoYXQgaW4gdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LCBpc3N1aW5nIGFuIGAvaXRlbS9yZW1vdmVgICByZXF1ZXN0IHdpbGwgbm90IGRlY3JlbWVudCB5b3VyIGxpdmUgY3JlZGVudGlhbCBjb3VudC4gVG8gaW5jcmVhc2UgeW91ciBjcmVkZW50aWFsIGFjY291bnQgaW4gRGV2ZWxvcG1lbnQsIGNvbnRhY3QgU3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNpdGVtLXdlYmhvb2stdXJsLXVwZGF0ZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlhYmlsaXRpZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHktY3JlYXRlZCBgbGlua190b2tlbmAgdXNpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50LiBJdCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtUb2tlbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiBvciBHQlAuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBhbmQgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIHRoZSBEZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCAvIEVVUi4gRm9yIGRldGFpbHMgb24gYW55IHBheW1lbnQgbGltaXRzIGluIFByb2R1Y3Rpb24sIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXZlcnNlIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudC4gIEEgcGF5bWVudCBjYW4gb25seSBiZSByZXZlcnNlZCBvbmNlIGFuZCB3aWxsIGJlIHJlZnVuZGVkIHRvIHRoZSBvcmlnaW5hbCBzZW5kZXJcXCdzIGFjY291bnQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkuICBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gQ2FsbGluZyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgVHJhbnNhY3Rpb25zIGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIE5vdGUgdGhhdCBub3QgYWxsIFBsYWlkIGRldmVsb3BlciBhY2NvdW50cyBhcmUgZW5hYmxlZCBmb3IgbWljcm8tZGVwb3NpdCBiYXNlZCB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdC4gWW91ciBhY2NvdW50IG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlIGluIG9yZGVyIHRvIHRlc3QgaXQgaW4gU2FuZGJveC4gVG8gZW5hYmxlIHRoaXMgZmVhdHVyZXMgb3IgY2hlY2sgeW91ciBzdGF0dXMsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgb3IgW3N1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIFN1cHBvcnQgdGlja2V0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcmVxdWVzdC1wcm9kdWN0LWFjY2VzcykuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxvYmplY3Q+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC4gVGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciBpZiBjYWxsZWQgYSBzZWNvbmQgdGltZSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIGZvciBgaW5pdGlhdGVkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cyNpbnZlc3RtZW50cykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjdHJhbnNhY3Rpb25zLWhpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgYSBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjZGVsZXRlZC10cmFuc2FjdGlvbnMtZGV0ZWN0ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEFjY2VzcyB0byBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpbiBQcm9kdWN0aW9uIGlzIHNwZWNpZmljIHRvIGNlcnRhaW4gcHJpY2luZyBwbGFucy4gSWYgeW91IGNhbm5vdCBhY2Nlc3MgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaW4gUHJvZHVjdGlvbiwgW2NvbnRhY3QgU2FsZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9jb250YWN0KSBmb3IgYXNzaXN0YW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGRldGVybWluZSB0cmFuc2ZlciBmYWlsdXJlIHJpc2suICBJbiBQbGFpZFxcJ3Mgc2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGBkZWNsaW5lZF9uc2ZfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgZGVjbGluZWRfcmlza19nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgQWxsIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSB3aWxsIHJlc3VsdCBpbiBhIGRlY2lzaW9uIG9mIHBlcm1pdHRlZCBhbmQgcmF0aW9uYWxlIGNvZGUgYEVSUk9SYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgUGxhaWRBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFBsYWlkQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIGFueSBsaW5rZWQgSXRlbS4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMsIGkuZS4gYWNjb3VudHMgdGhhdCBhcmUgbm90IGNsb3NlZCBhbmQgYXJlIGNhcGFibGUgb2YgY2FycnlpbmcgYSBiYWxhbmNlLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgYmFsYW5jZXMgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFwcGxpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNBc3NldHMtd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGaWx0ZXJSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiAgVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGF1dGhgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIEFsc28gbm90ZSB0aGF0IGAvYXV0aC9nZXRgIHdpbGwgbm90IHJldHVybiBkYXRhIGZvciBhbnkgbmV3IGFjY291bnRzIG9wZW5lZCBhZnRlciB0aGUgSXRlbSB3YXMgY3JlYXRlZC4gVG8gb2J0YWluIGRhdGEgZm9yIG5ldyBhY2NvdW50cywgY3JlYXRlIGEgbmV3IEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCBiYW5rIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgICBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgQ2F0ZWdvcmllc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhdGVnb3JpZXNHZXQoYm9keTogb2JqZWN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhdGVnb3JpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB3aXRob3V0IHVzaW5nIFBsYWlkIEV4Y2hhbmdlXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGlkZW50aXR5IHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5R2V0UmVxdWVzdH0gaWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0OiBJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIHBheXN0dWIgUERGIHRoYXQgdGhlIGVuZCB1c2VyIHVwbG9hZGVkIHZpYSBQYXlzdHViIEltcG9ydC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCB3aXRoIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIGEgc2luZ2xlIHBheXN0dWIgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIHJldHVybnMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgdGhlIGluY29tZSBwcm9kdWN0XG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGEgdXNlclxcJ3MgZWxpZ2liaWxpdHkgZm9yIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2R1Y3RcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoKGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluY29tZVZlcmlmaWNhdGlvblJlZnJlc2goaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vc3VtbWFyeS9nZXRgIHJldHVybnMgYSB2ZXJpZmljYXRpb24gc3VtbWFyeSBmb3IgdGhlIGluY29tZSB0aGF0IHdhcyB2ZXJpZmllZCBmb3IgYW4gZW5kIHVzZXIuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGluZm9ybWF0aW9uIGRlcml2ZWQgZnJvbSBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldChpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0KGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGF4Zm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncy4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBmb3IgaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsIHVwIHRvIGEgbWF4aW11bSBvZiB0ZW4gaW5zdGl0dXRpb25zIHBlciBxdWVyeS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHNjb3BlcyBvZiBhY2Nlc3MgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHB1YmxpYyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUdldChpdGVtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIFBsYWlkIG5hdGl2ZSBhY2NvdW50IElEIGZvciB0aGUgYWNjb3VudCB0aGUgdXNlciB3aWxsIHN3aXRjaCB0aGVpciBkaXJlY3QgZGVwb3NpdCB0byAoYHRhcmdldF9hY2NvdW50X2lkYCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUltcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgICBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNpdGVtLXdlYmhvb2stdXJsLXVwZGF0ZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdG9rZW5zLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgdXBkYXRlIG1vZGUgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2dldGAgZW5kcG9pbnQgZ2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHByZXZpb3VzbHktY3JlYXRlZCBgbGlua190b2tlbmAgdXNpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50LiBJdCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtUb2tlbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIgb3IgR0JQLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgYW5kIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yaywgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgLyBFVVIuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQuICBBIHBheW1lbnQgY2FuIG9ubHkgYmUgcmV2ZXJzZWQgb25jZSBhbmQgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgb3JpZ2luYWwgc2VuZGVyXFwncyBhY2NvdW50LiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKS4gIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gQ2FsbGluZyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgVHJhbnNhY3Rpb25zIGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgTm90ZSB0aGF0IG5vdCBhbGwgUGxhaWQgZGV2ZWxvcGVyIGFjY291bnRzIGFyZSBlbmFibGVkIGZvciBtaWNyby1kZXBvc2l0IGJhc2VkIHZlcmlmaWNhdGlvbiBieSBkZWZhdWx0LiBZb3VyIGFjY291bnQgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmUgaW4gb3JkZXIgdG8gdGVzdCBpdCBpbiBTYW5kYm94LiBUbyBlbmFibGUgdGhpcyBmZWF0dXJlcyBvciBjaGVjayB5b3VyIHN0YXR1cywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBvciBbc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgU3VwcG9ydCB0aWNrZXRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9yZXF1ZXN0LXByb2R1Y3QtYWNjZXNzKS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxvYmplY3Q+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgICBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuIFRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3IgaWYgY2FsbGVkIGEgc2Vjb25kIHRpbWUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgYGluaXRpYXRlZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRXZhbHVhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNpZ25hbEV2YWx1YXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMjaW52ZXN0bWVudHMpIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gQW4gSXRlbVxcJ3MgYHN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjdHJhbnNhY3Rpb25zLWluaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1oaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyNkZWxldGVkLXRyYW5zYWN0aW9ucy1kZXRlY3RlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgQWNjZXNzIHRvIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGluIFByb2R1Y3Rpb24gaXMgc3BlY2lmaWMgdG8gY2VydGFpbiBwcmljaW5nIHBsYW5zLiBJZiB5b3UgY2Fubm90IGFjY2VzcyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpbiBQcm9kdWN0aW9uLCBbY29udGFjdCBTYWxlc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2NvbnRhY3QpIGZvciBhc3Npc3RhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGRldGVybWluZSB0cmFuc2ZlciBmYWlsdXJlIHJpc2suICBJbiBQbGFpZFxcJ3Mgc2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGBkZWNsaW5lZF9uc2ZfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgZGVjbGluZWRfcmlza19nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgQWxsIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSB3aWxsIHJlc3VsdCBpbiBhIGRlY2lzaW9uIG9mIHBlcm1pdHRlZCBhbmQgcmF0aW9uYWxlIGNvZGUgYEVSUk9SYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUGxhaWRBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgUGxhaWRBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciBhbnkgbGlua2VkIEl0ZW0uIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzLCBpLmUuIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIGJhbGFuY2VzIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MvI0Fzc2V0cy13ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzKSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiAgVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgYXV0aGAgd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBkYXRhLiAgQWxzbyBub3RlIHRoYXQgYC9hdXRoL2dldGAgd2lsbCBub3QgcmV0dXJuIGRhdGEgZm9yIGFueSBuZXcgYWNjb3VudHMgb3BlbmVkIGFmdGVyIHRoZSBJdGVtIHdhcyBjcmVhdGVkLiBUbyBvYnRhaW4gZGF0YSBmb3IgbmV3IGFjY291bnRzLCBjcmVhdGUgYSBuZXcgSXRlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXV0aEdldChhdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIGJhbmsgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgICBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBDYXRlZ29yaWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBpZGVudGl0eSB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGRhdGEuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBwYXlzdHViIFBERiB0aGF0IHRoZSBlbmQgdXNlciB1cGxvYWRlZCB2aWEgUGF5c3R1YiBJbXBvcnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgd2l0aCB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIGEgc2luZ2xlIHBheXN0dWIgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHViR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIHJldHVybnMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgdGhlIGluY29tZSBwcm9kdWN0XG4gICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBlbGlnaWJpbGl0eSBmb3IgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvZHVjdFxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3JlZnJlc2hgIHJlZnJlc2hlcyBhIGdpdmVuIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoKGluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblJlZnJlc2goaW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9zdW1tYXJ5L2dldGAgcmV0dXJucyBhIHZlcmlmaWNhdGlvbiBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHRoYXQgd2FzIHZlcmlmaWVkIGZvciBhbiBlbmQgdXNlci4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldChpbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uU3VtbWFyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25TdW1tYXJ5R2V0KGluY29tZVZlcmlmaWNhdGlvblN1bW1hcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0YXhmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LlxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICogQHN1bW1hcnkgSW52YWxpZGF0ZSBhY2Nlc3NfdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBQbGFpZCBuYXRpdmUgYWNjb3VudCBJRCBmb3IgdGhlIGFjY291bnQgdGhlIHVzZXIgd2lsbCBzd2l0Y2ggdGhlaXIgZGlyZWN0IGRlcG9zaXQgdG8gKGB0YXJnZXRfYWNjb3VudF9pZGApLlxuICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICogQHBhcmFtIHtJdGVtSW1wb3J0UmVxdWVzdH0gaXRlbUltcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaXRlbS9yZW1vdmVgICBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCAgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gIE5vdGUgdGhhdCBpbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGlzc3VpbmcgYW4gYC9pdGVtL3JlbW92ZWAgIHJlcXVlc3Qgd2lsbCBub3QgZGVjcmVtZW50IHlvdXIgbGl2ZSBjcmVkZW50aWFsIGNvdW50LiBUbyBpbmNyZWFzZSB5b3VyIGNyZWRlbnRpYWwgYWNjb3VudCBpbiBEZXZlbG9wbWVudCwgY29udGFjdCBTdXBwb3J0LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzLyNpdGVtLXdlYmhvb2stdXJsLXVwZGF0ZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS90b2tlbnMvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIHVwZGF0ZSBtb2RlIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBQYXltZW50IEluaXRpYXRpb24gKEV1cm9wZSkgZmxvdy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseS1jcmVhdGVkIGBsaW5rX3Rva2VuYCB1c2luZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQuIEl0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIgb3IgR0JQLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgYW5kIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yaywgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiB0aGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgLyBFVVIuIEZvciBkZXRhaWxzIG9uIGFueSBwYXltZW50IGxpbWl0cyBpbiBQcm9kdWN0aW9uLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudC4gIEEgcGF5bWVudCBjYW4gb25seSBiZSByZXZlcnNlZCBvbmNlIGFuZCB3aWxsIGJlIHJlZnVuZGVkIHRvIHRoZSBvcmlnaW5hbCBzZW5kZXJcXCdzIGFjY291bnQuIFxuICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpLiAgRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcgb3Igc2F2aW5ncyBhY2NvdW50IHRoYXRcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBDYWxsaW5nIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBUcmFuc2FjdGlvbnMgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuXG4gICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgTm90ZSB0aGF0IG5vdCBhbGwgUGxhaWQgZGV2ZWxvcGVyIGFjY291bnRzIGFyZSBlbmFibGVkIGZvciBtaWNyby1kZXBvc2l0IGJhc2VkIHZlcmlmaWNhdGlvbiBieSBkZWZhdWx0LiBZb3VyIGFjY291bnQgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmUgaW4gb3JkZXIgdG8gdGVzdCBpdCBpbiBTYW5kYm94LiBUbyBlbmFibGUgdGhpcyBmZWF0dXJlcyBvciBjaGVjayB5b3VyIHN0YXR1cywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBvciBbc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgU3VwcG9ydCB0aWNrZXRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9zdXBwb3J0L25ldy9wcm9kdWN0LWFuZC1kZXZlbG9wbWVudC9wcm9kdWN0LXRyb3VibGVzaG9vdGluZy9yZXF1ZXN0LXByb2R1Y3QtYWNjZXNzKS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgICBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuIFRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3IgaWYgY2FsbGVkIGEgc2Vjb25kIHRpbWUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgYGluaXRpYXRlZGAuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsRXZhbHVhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRXZhbHVhdGUocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cyNpbnZlc3RtZW50cykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBBbiBJdGVtXFwncyBgc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyN0cmFuc2FjdGlvbnMtaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvd2ViaG9va3MjdHJhbnNhY3Rpb25zLWhpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyBhIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS93ZWJob29rcyNkZWxldGVkLXRyYW5zYWN0aW9ucy1kZXRlY3RlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3dlYmhvb2tzI3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgQWNjZXNzIHRvIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGluIFByb2R1Y3Rpb24gaXMgc3BlY2lmaWMgdG8gY2VydGFpbiBwcmljaW5nIHBsYW5zLiBJZiB5b3UgY2Fubm90IGFjY2VzcyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpbiBQcm9kdWN0aW9uLCBbY29udGFjdCBTYWxlc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2NvbnRhY3QpIGZvciBhc3Npc3RhbmNlLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGRldGVybWluZSB0cmFuc2ZlciBmYWlsdXJlIHJpc2suICBJbiBQbGFpZFxcJ3Mgc2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgd2l0aCB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHdpdGggdGhlIHVzZXJuYW1lIGBkZWNsaW5lZF9uc2ZfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB3aXRoIHRoZSB1c2VybmFtZSBgZGVjbGluZWRfcmlza19nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBwZXJtaXQgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTE9HSU5fUkVRVUlSRURgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgQWxsIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSB3aWxsIHJlc3VsdCBpbiBhIGRlY2lzaW9uIG9mIHBlcm1pdHRlZCBhbmQgcmF0aW9uYWxlIGNvZGUgYEVSUk9SYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG59XG5cblxuIl19 \ No newline at end of file diff --git a/dist/base.d.ts b/dist/base.d.ts index a19cf342..8d5bbed8 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.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 1c3dcd6e..16a420f6 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjI2LjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG5cbmV4cG9ydCBjb25zdCBCQVNFX1BBVEggPSBcImh0dHBzOi8vcHJvZHVjdGlvbi5wbGFpZC5jb21cIi5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBDT0xMRUNUSU9OX0ZPUk1BVFMgPSB7XG4gICAgY3N2OiBcIixcIixcbiAgICBzc3Y6IFwiIFwiLFxuICAgIHRzdjogXCJcXHRcIixcbiAgICBwaXBlczogXCJ8XCIsXG59O1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlcXVlc3RBcmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFyZ3Mge1xuICAgIHVybDogc3RyaW5nO1xuICAgIG9wdGlvbnM6IGFueTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIEJhc2VBUElcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VBUEkge1xuICAgIHByb3RlY3RlZCBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24sIHByb3RlY3RlZCBiYXNlUGF0aDogc3RyaW5nID0gQkFTRV9QQVRILCBwcm90ZWN0ZWQgYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcykge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhdGggPSBjb25maWd1cmF0aW9uLmJhc2VQYXRoIHx8IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUmVxdWlyZWRFcnJvclxuICogQGV4dGVuZHMge0Vycm9yfVxuICovXG5leHBvcnQgY2xhc3MgUmVxdWlyZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBuYW1lOiBcIlJlcXVpcmVkRXJyb3JcIiA9IFwiUmVxdWlyZWRFcnJvclwiO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBmaWVsZDogc3RyaW5nLCBtc2c/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobXNnKTtcbiAgICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjMxLjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG5cbmV4cG9ydCBjb25zdCBCQVNFX1BBVEggPSBcImh0dHBzOi8vcHJvZHVjdGlvbi5wbGFpZC5jb21cIi5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBDT0xMRUNUSU9OX0ZPUk1BVFMgPSB7XG4gICAgY3N2OiBcIixcIixcbiAgICBzc3Y6IFwiIFwiLFxuICAgIHRzdjogXCJcXHRcIixcbiAgICBwaXBlczogXCJ8XCIsXG59O1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlcXVlc3RBcmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFyZ3Mge1xuICAgIHVybDogc3RyaW5nO1xuICAgIG9wdGlvbnM6IGFueTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIEJhc2VBUElcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VBUEkge1xuICAgIHByb3RlY3RlZCBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24sIHByb3RlY3RlZCBiYXNlUGF0aDogc3RyaW5nID0gQkFTRV9QQVRILCBwcm90ZWN0ZWQgYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcykge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhdGggPSBjb25maWd1cmF0aW9uLmJhc2VQYXRoIHx8IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUmVxdWlyZWRFcnJvclxuICogQGV4dGVuZHMge0Vycm9yfVxuICovXG5leHBvcnQgY2xhc3MgUmVxdWlyZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBuYW1lOiBcIlJlcXVpcmVkRXJyb3JcIiA9IFwiUmVxdWlyZWRFcnJvclwiO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBmaWVsZDogc3RyaW5nLCBtc2c/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobXNnKTtcbiAgICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/common.d.ts b/dist/common.d.ts index 8234dac6..c8ab6f69 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.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 56188368..34f9223c 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.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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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS4yNi4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgUmVxdWlyZWRFcnJvcizjgIBSZXF1ZXN0QXJncyB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IERVTU1ZX0JBU0VfVVJMID0gJ2h0dHBzOi8vZXhhbXBsZS5jb20nXG5cbi8qKlxuICpcbiAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRQYXJhbUV4aXN0cyA9IGZ1bmN0aW9uIChmdW5jdGlvbk5hbWU6IHN0cmluZywgcGFyYW1OYW1lOiBzdHJpbmcsIHBhcmFtVmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAocGFyYW1WYWx1ZSA9PT0gbnVsbCB8fCBwYXJhbVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkRXJyb3IocGFyYW1OYW1lLCBgUmVxdWlyZWQgcGFyYW1ldGVyICR7cGFyYW1OYW1lfSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nICR7ZnVuY3Rpb25OYW1lfS5gKTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEFwaUtleVRvT2JqZWN0ID0gYXN5bmMgZnVuY3Rpb24gKG9iamVjdDogYW55LCBrZXlQYXJhbU5hbWU6IHN0cmluZywgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFwaUtleSkge1xuICAgICAgICBjb25zdCBsb2NhbFZhckFwaUtleVZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYXBpS2V5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5KGtleVBhcmFtTmFtZSlcbiAgICAgICAgICAgIDogYXdhaXQgY29uZmlndXJhdGlvbi5hcGlLZXk7XG4gICAgICAgIG9iamVjdFtrZXlQYXJhbU5hbWVdID0gbG9jYWxWYXJBcGlLZXlWYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJhc2ljQXV0aFRvT2JqZWN0ID0gZnVuY3Rpb24gKG9iamVjdDogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIChjb25maWd1cmF0aW9uLnVzZXJuYW1lIHx8IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQpKSB7XG4gICAgICAgIG9iamVjdFtcImF1dGhcIl0gPSB7IHVzZXJuYW1lOiBjb25maWd1cmF0aW9uLnVzZXJuYW1lLCBwYXNzd29yZDogY29uZmlndXJhdGlvbi5wYXNzd29yZCB9O1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0QmVhcmVyQXV0aFRvT2JqZWN0ID0gYXN5bmMgZnVuY3Rpb24gKG9iamVjdDogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSB0eXBlb2YgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKClcbiAgICAgICAgICAgIDogYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbjtcbiAgICAgICAgb2JqZWN0W1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgYWNjZXNzVG9rZW47XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRPQXV0aFRvT2JqZWN0ID0gYXN5bmMgZnVuY3Rpb24gKG9iamVjdDogYW55LCBuYW1lOiBzdHJpbmcsIHNjb3Blczogc3RyaW5nW10sIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbikge1xuICAgICAgICBjb25zdCBsb2NhbFZhckFjY2Vzc1Rva2VuVmFsdWUgPSB0eXBlb2YgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKG5hbWUsIHNjb3BlcylcbiAgICAgICAgICAgIDogYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbjtcbiAgICAgICAgb2JqZWN0W1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHVybDogVVJMLCAuLi5vYmplY3RzOiBhbnlbXSkge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgZm9yIChjb25zdCBvYmplY3Qgb2Ygb2JqZWN0cykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqZWN0W2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoUGFyYW1zLnNldChrZXksIG9iamVjdFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB1cmwuc2VhcmNoID0gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCA9IGZ1bmN0aW9uICh2YWx1ZTogYW55LCByZXF1ZXN0T3B0aW9uczogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IG5vblN0cmluZyA9IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZyc7XG4gICAgY29uc3QgbmVlZHNTZXJpYWxpemF0aW9uID0gbm9uU3RyaW5nICYmIGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5pc0pzb25NaW1lXG4gICAgICAgID8gY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKHJlcXVlc3RPcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKVxuICAgICAgICA6IG5vblN0cmluZztcbiAgICByZXR1cm4gbmVlZHNTZXJpYWxpemF0aW9uXG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pXG4gICAgICAgIDogKHZhbHVlIHx8IFwiXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCB0b1BhdGhTdHJpbmcgPSBmdW5jdGlvbiAodXJsOiBVUkwpIHtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCArIHVybC5oYXNoXG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiA9IGZ1bmN0aW9uIChheGlvc0FyZ3M6IFJlcXVlc3RBcmdzLCBnbG9iYWxBeGlvczogQXhpb3NJbnN0YW5jZSwgQkFTRV9QQVRIOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIChheGlvczogQXhpb3NJbnN0YW5jZSA9IGdsb2JhbEF4aW9zLCBiYXNlUGF0aDogc3RyaW5nID0gQkFTRV9QQVRIKSA9PiB7XG4gICAgICAgIGNvbnN0IGF4aW9zUmVxdWVzdEFyZ3MgPSB7Li4uYXhpb3NBcmdzLm9wdGlvbnMsIHVybDogKGNvbmZpZ3VyYXRpb24/LmJhc2VQYXRoIHx8IGJhc2VQYXRoKSArIGF4aW9zQXJncy51cmx9O1xuICAgICAgICByZXR1cm4gYXhpb3MucmVxdWVzdChheGlvc1JlcXVlc3RBcmdzKTtcbiAgICB9O1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS4zMS4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgUmVxdWlyZWRFcnJvcizjgIBSZXF1ZXN0QXJncyB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IERVTU1ZX0JBU0VfVVJMID0gJ2h0dHBzOi8vZXhhbXBsZS5jb20nXG5cbi8qKlxuICpcbiAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRQYXJhbUV4aXN0cyA9IGZ1bmN0aW9uIChmdW5jdGlvbk5hbWU6IHN0cmluZywgcGFyYW1OYW1lOiBzdHJpbmcsIHBhcmFtVmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAocGFyYW1WYWx1ZSA9PT0gbnVsbCB8fCBwYXJhbVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVkRXJyb3IocGFyYW1OYW1lLCBgUmVxdWlyZWQgcGFyYW1ldGVyICR7cGFyYW1OYW1lfSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nICR7ZnVuY3Rpb25OYW1lfS5gKTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEFwaUtleVRvT2JqZWN0ID0gYXN5bmMgZnVuY3Rpb24gKG9iamVjdDogYW55LCBrZXlQYXJhbU5hbWU6IHN0cmluZywgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFwaUtleSkge1xuICAgICAgICBjb25zdCBsb2NhbFZhckFwaUtleVZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYXBpS2V5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5KGtleVBhcmFtTmFtZSlcbiAgICAgICAgICAgIDogYXdhaXQgY29uZmlndXJhdGlvbi5hcGlLZXk7XG4gICAgICAgIG9iamVjdFtrZXlQYXJhbU5hbWVdID0gbG9jYWxWYXJBcGlLZXlWYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJhc2ljQXV0aFRvT2JqZWN0ID0gZnVuY3Rpb24gKG9iamVjdDogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIChjb25maWd1cmF0aW9uLnVzZXJuYW1lIHx8IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQpKSB7XG4gICAgICAgIG9iamVjdFtcImF1dGhcIl0gPSB7IHVzZXJuYW1lOiBjb25maWd1cmF0aW9uLnVzZXJuYW1lLCBwYXNzd29yZDogY29uZmlndXJhdGlvbi5wYXNzd29yZCB9O1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0QmVhcmVyQXV0aFRvT2JqZWN0ID0gYXN5bmMgZnVuY3Rpb24gKG9iamVjdDogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSB0eXBlb2YgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKClcbiAgICAgICAgICAgIDogYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbjtcbiAgICAgICAgb2JqZWN0W1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgYWNjZXNzVG9rZW47XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRPQXV0aFRvT2JqZWN0ID0gYXN5bmMgZnVuY3Rpb24gKG9iamVjdDogYW55LCBuYW1lOiBzdHJpbmcsIHNjb3Blczogc3RyaW5nW10sIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbikge1xuICAgICAgICBjb25zdCBsb2NhbFZhckFjY2Vzc1Rva2VuVmFsdWUgPSB0eXBlb2YgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKG5hbWUsIHNjb3BlcylcbiAgICAgICAgICAgIDogYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbjtcbiAgICAgICAgb2JqZWN0W1wiQXV0aG9yaXphdGlvblwiXSA9IFwiQmVhcmVyIFwiICsgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0U2VhcmNoUGFyYW1zID0gZnVuY3Rpb24gKHVybDogVVJMLCAuLi5vYmplY3RzOiBhbnlbXSkge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgZm9yIChjb25zdCBvYmplY3Qgb2Ygb2JqZWN0cykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqZWN0W2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoUGFyYW1zLnNldChrZXksIG9iamVjdFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB1cmwuc2VhcmNoID0gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCA9IGZ1bmN0aW9uICh2YWx1ZTogYW55LCByZXF1ZXN0T3B0aW9uczogYW55LCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IG5vblN0cmluZyA9IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZyc7XG4gICAgY29uc3QgbmVlZHNTZXJpYWxpemF0aW9uID0gbm9uU3RyaW5nICYmIGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5pc0pzb25NaW1lXG4gICAgICAgID8gY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKHJlcXVlc3RPcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKVxuICAgICAgICA6IG5vblN0cmluZztcbiAgICByZXR1cm4gbmVlZHNTZXJpYWxpemF0aW9uXG4gICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pXG4gICAgICAgIDogKHZhbHVlIHx8IFwiXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCB0b1BhdGhTdHJpbmcgPSBmdW5jdGlvbiAodXJsOiBVUkwpIHtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCArIHVybC5oYXNoXG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiA9IGZ1bmN0aW9uIChheGlvc0FyZ3M6IFJlcXVlc3RBcmdzLCBnbG9iYWxBeGlvczogQXhpb3NJbnN0YW5jZSwgQkFTRV9QQVRIOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIChheGlvczogQXhpb3NJbnN0YW5jZSA9IGdsb2JhbEF4aW9zLCBiYXNlUGF0aDogc3RyaW5nID0gQkFTRV9QQVRIKSA9PiB7XG4gICAgICAgIGNvbnN0IGF4aW9zUmVxdWVzdEFyZ3MgPSB7Li4uYXhpb3NBcmdzLm9wdGlvbnMsIHVybDogKGNvbmZpZ3VyYXRpb24/LmJhc2VQYXRoIHx8IGJhc2VQYXRoKSArIGF4aW9zQXJncy51cmx9O1xuICAgICAgICByZXR1cm4gYXhpb3MucmVxdWVzdChheGlvc1JlcXVlc3RBcmdzKTtcbiAgICB9O1xufVxuIl19 \ No newline at end of file diff --git a/dist/configuration.d.ts b/dist/configuration.d.ts index 44ce4222..c01a2dea 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.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 b33ee4f1..ea80b59c 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -32,7 +32,7 @@ class Configuration { this.baseOptions = {}; if (!this.baseOptions.headers) this.baseOptions.headers = {}; - this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v9.1.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); + this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v9.2.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); } /** * Check if the given MIME is a JSON MIME. @@ -50,4 +50,4 @@ class Configuration { } } exports.Configuration = Configuration; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxXQUFXLEVBQUUsK0JBQStCO0NBQzdDLENBQUM7QUFFRixNQUFhLGFBQWE7SUFtRHRCLFlBQVksUUFBaUMsRUFBRTtRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sbUJBQ3RCLENBQUMsWUFBWSxDQUFDLEVBQUUsbUJBQW1CLEVBQ25DLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxJQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDNUIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUMxQixNQUFNLFFBQVEsR0FBVyxJQUFJLE1BQU0sQ0FBQywrREFBK0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Q0FDSjtBQW5GRCxzQ0FtRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS4yNi4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIHtcbiAgICBhcGlLZXk/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nKSB8ICgobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gc3RyaW5nKSB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgZm9ybURhdGFDdG9yPzogbmV3ICgpID0+IGFueTtcbn1cblxuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lcyAxNi0yNVxuaW50ZXJmYWNlIFBsYWlkRW52aXJvbm1lbnQge1xuICBbZW52OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBQbGFpZEVudmlyb25tZW50czogUGxhaWRFbnZpcm9ubWVudCA9IHtcbiAgcHJvZHVjdGlvbjogJ2h0dHBzOi8vcHJvZHVjdGlvbi5wbGFpZC5jb20nLFxuICBzYW5kYm94OiAnaHR0cHM6Ly9zYW5kYm94LnBsYWlkLmNvbScsXG4gIGRldmVsb3BtZW50OiAnaHR0cHM6Ly9kZXZlbG9wbWVudC5wbGFpZC5jb20nLFxufTtcblxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYXBpS2V5IHNlY3VyaXR5XG4gICAgICogQHBhcmFtIG5hbWUgc2VjdXJpdHkgbmFtZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYXBpS2V5Pzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lOiBzdHJpbmcpID0+IHN0cmluZykgfCAoKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGJhc2ljIHNlY3VyaXR5XG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3Igb2F1dGgyIHNlY3VyaXR5XG4gICAgICogQHBhcmFtIG5hbWUgc2VjdXJpdHkgbmFtZVxuICAgICAqIEBwYXJhbSBzY29wZXMgb2F1dGgyIHNjb3BlXG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IHN0cmluZykgfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIC8qKlxuICAgICAqIG92ZXJyaWRlIGJhc2UgcGF0aFxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGJhc2Ugb3B0aW9ucyBmb3IgYXhpb3MgY2FsbHNcbiAgICAgKlxuICAgICAqIEB0eXBlIHthbnl9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICAvKipcbiAgICAgKiBUaGUgRm9ybURhdGEgY29uc3RydWN0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIG11bHRpcGFydCBmb3JtIGRhdGFcbiAgICAgKiByZXF1ZXN0cy4gWW91IGNhbiBpbmplY3QgdGhpcyBoZXJlIHNvIHRoYXQgZXhlY3V0aW9uIGVudmlyb25tZW50cyB0aGF0XG4gICAgICogZG8gbm90IHN1cHBvcnQgdGhlIEZvcm1EYXRhIGNsYXNzIGNhbiBzdGlsbCBydW4gdGhlIGdlbmVyYXRlZCBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7bmV3ICgpID0+IEZvcm1EYXRhfVxuICAgICAqL1xuICAgIGZvcm1EYXRhQ3Rvcj86IG5ldyAoKSA9PiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbTogQ29uZmlndXJhdGlvblBhcmFtZXRlcnMgPSB7fSkge1xuICAgICAgICB0aGlzLmFwaUtleSA9IHBhcmFtLmFwaUtleTtcbiAgICAgICAgdGhpcy51c2VybmFtZSA9IHBhcmFtLnVzZXJuYW1lO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFyYW0ucGFzc3dvcmQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBwYXJhbS5hY2Nlc3NUb2tlbjtcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IHBhcmFtLmJhc2VQYXRoO1xuICAgICAgICB0aGlzLmJhc2VPcHRpb25zID0gcGFyYW0uYmFzZU9wdGlvbnM7XG4gICAgICAgIHRoaXMuZm9ybURhdGFDdG9yID0gcGFyYW0uZm9ybURhdGFDdG9yO1xuXG4gICAgICAgIGlmKCF0aGlzLmJhc2VPcHRpb25zKSB0aGlzLmJhc2VPcHRpb25zID0ge307XG4gICAgICAgIGlmKCF0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMpIHRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyA9IHt9O1xuICAgICAgICB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgWydVc2VyLUFnZW50J106IGBQbGFpZCBOb2RlIHY5LjEuMGAsXG4gICAgICAgICAgWydQbGFpZC1WZXJzaW9uJ106ICcyMDIwLTA5LTE0JyxcbiAgICAgICAgICAuLi50aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gTUlNRSBpcyBhIEpTT04gTUlNRS5cbiAgICAgKiBKU09OIE1JTUUgZXhhbXBsZXM6XG4gICAgICogICBhcHBsaWNhdGlvbi9qc29uXG4gICAgICogICBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURjhcbiAgICAgKiAgIEFQUExJQ0FUSU9OL0pTT05cbiAgICAgKiAgIGFwcGxpY2F0aW9uL3ZuZC5jb21wYW55K2pzb25cbiAgICAgKiBAcGFyYW0gbWltZSAtIE1JTUUgKE11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbnMpXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBNSU1FIGlzIEpTT04sIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNKc29uTWltZShtaW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QganNvbk1pbWU6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14oYXBwbGljYXRpb25cXC9qc29ufFteOy8gXFx0XStcXC9bXjsvIFxcdF0rWytdanNvbilbIFxcdF0qKDsuKik/JCcsICdpJyk7XG4gICAgICAgIHJldHVybiBtaW1lICE9PSBudWxsICYmIChqc29uTWltZS50ZXN0KG1pbWUpIHx8IG1pbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicpO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtJQUNwQyxXQUFXLEVBQUUsK0JBQStCO0NBQzdDLENBQUM7QUFFRixNQUFhLGFBQWE7SUFtRHRCLFlBQVksUUFBaUMsRUFBRTtRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFdkMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sbUJBQ3RCLENBQUMsWUFBWSxDQUFDLEVBQUUsbUJBQW1CLEVBQ25DLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxJQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDNUIsQ0FBQTtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUMxQixNQUFNLFFBQVEsR0FBVyxJQUFJLE1BQU0sQ0FBQywrREFBK0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Q0FDSjtBQW5GRCxzQ0FtRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS4zMS4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIHtcbiAgICBhcGlLZXk/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nKSB8ICgobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gc3RyaW5nKSB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgZm9ybURhdGFDdG9yPzogbmV3ICgpID0+IGFueTtcbn1cblxuLy8gRWRpdGVkIGJ5IFBsYWlkLCBsaW5lcyAxNi0yNVxuaW50ZXJmYWNlIFBsYWlkRW52aXJvbm1lbnQge1xuICBbZW52OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBQbGFpZEVudmlyb25tZW50czogUGxhaWRFbnZpcm9ubWVudCA9IHtcbiAgcHJvZHVjdGlvbjogJ2h0dHBzOi8vcHJvZHVjdGlvbi5wbGFpZC5jb20nLFxuICBzYW5kYm94OiAnaHR0cHM6Ly9zYW5kYm94LnBsYWlkLmNvbScsXG4gIGRldmVsb3BtZW50OiAnaHR0cHM6Ly9kZXZlbG9wbWVudC5wbGFpZC5jb20nLFxufTtcblxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYXBpS2V5IHNlY3VyaXR5XG4gICAgICogQHBhcmFtIG5hbWUgc2VjdXJpdHkgbmFtZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYXBpS2V5Pzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgKChuYW1lOiBzdHJpbmcpID0+IHN0cmluZykgfCAoKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGJhc2ljIHNlY3VyaXR5XG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3Igb2F1dGgyIHNlY3VyaXR5XG4gICAgICogQHBhcmFtIG5hbWUgc2VjdXJpdHkgbmFtZVxuICAgICAqIEBwYXJhbSBzY29wZXMgb2F1dGgyIHNjb3BlXG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZT86IHN0cmluZywgc2NvcGVzPzogc3RyaW5nW10pID0+IHN0cmluZykgfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICAgIC8qKlxuICAgICAqIG92ZXJyaWRlIGJhc2UgcGF0aFxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGJhc2Ugb3B0aW9ucyBmb3IgYXhpb3MgY2FsbHNcbiAgICAgKlxuICAgICAqIEB0eXBlIHthbnl9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICAvKipcbiAgICAgKiBUaGUgRm9ybURhdGEgY29uc3RydWN0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIG11bHRpcGFydCBmb3JtIGRhdGFcbiAgICAgKiByZXF1ZXN0cy4gWW91IGNhbiBpbmplY3QgdGhpcyBoZXJlIHNvIHRoYXQgZXhlY3V0aW9uIGVudmlyb25tZW50cyB0aGF0XG4gICAgICogZG8gbm90IHN1cHBvcnQgdGhlIEZvcm1EYXRhIGNsYXNzIGNhbiBzdGlsbCBydW4gdGhlIGdlbmVyYXRlZCBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7bmV3ICgpID0+IEZvcm1EYXRhfVxuICAgICAqL1xuICAgIGZvcm1EYXRhQ3Rvcj86IG5ldyAoKSA9PiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbTogQ29uZmlndXJhdGlvblBhcmFtZXRlcnMgPSB7fSkge1xuICAgICAgICB0aGlzLmFwaUtleSA9IHBhcmFtLmFwaUtleTtcbiAgICAgICAgdGhpcy51c2VybmFtZSA9IHBhcmFtLnVzZXJuYW1lO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFyYW0ucGFzc3dvcmQ7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBwYXJhbS5hY2Nlc3NUb2tlbjtcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IHBhcmFtLmJhc2VQYXRoO1xuICAgICAgICB0aGlzLmJhc2VPcHRpb25zID0gcGFyYW0uYmFzZU9wdGlvbnM7XG4gICAgICAgIHRoaXMuZm9ybURhdGFDdG9yID0gcGFyYW0uZm9ybURhdGFDdG9yO1xuXG4gICAgICAgIGlmKCF0aGlzLmJhc2VPcHRpb25zKSB0aGlzLmJhc2VPcHRpb25zID0ge307XG4gICAgICAgIGlmKCF0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMpIHRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyA9IHt9O1xuICAgICAgICB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgWydVc2VyLUFnZW50J106IGBQbGFpZCBOb2RlIHY5LjIuMGAsXG4gICAgICAgICAgWydQbGFpZC1WZXJzaW9uJ106ICcyMDIwLTA5LTE0JyxcbiAgICAgICAgICAuLi50aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gTUlNRSBpcyBhIEpTT04gTUlNRS5cbiAgICAgKiBKU09OIE1JTUUgZXhhbXBsZXM6XG4gICAgICogICBhcHBsaWNhdGlvbi9qc29uXG4gICAgICogICBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURjhcbiAgICAgKiAgIEFQUExJQ0FUSU9OL0pTT05cbiAgICAgKiAgIGFwcGxpY2F0aW9uL3ZuZC5jb21wYW55K2pzb25cbiAgICAgKiBAcGFyYW0gbWltZSAtIE1JTUUgKE11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbnMpXG4gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBnaXZlbiBNSU1FIGlzIEpTT04sIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNKc29uTWltZShtaW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QganNvbk1pbWU6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14oYXBwbGljYXRpb25cXC9qc29ufFteOy8gXFx0XStcXC9bXjsvIFxcdF0rWytdanNvbilbIFxcdF0qKDsuKik/JCcsICdpJyk7XG4gICAgICAgIHJldHVybiBtaW1lICE9PSBudWxsICYmIChqc29uTWltZS50ZXN0KG1pbWUpIHx8IG1pbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicpO1xuICAgIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/coverage/lcov-report/prettify.d.ts b/dist/coverage/lcov-report/prettify.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/dist/coverage/lcov-report/prettify.js b/dist/coverage/lcov-report/prettify.js deleted file mode 100644 index cbeac640..00000000 --- a/dist/coverage/lcov-report/prettify.js +++ /dev/null @@ -1,477 +0,0 @@ -"use strict"; -window.PR_SHOULD_USE_CONTINUATION = true; -(function () { var h = ["break,continue,do,else,for,if,return,while"]; var u = [h, "auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"]; var p = [u, "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"]; var l = [p, "alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"]; var x = [p, "abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"]; var R = [x, "as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"]; var r = "all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes"; var w = [p, "debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"]; var s = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"; var I = [h, "and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"]; var f = [h, "alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"]; var H = [h, "case,done,elif,esac,eval,fi,function,in,local,set,then,until"]; var A = [l, R, w, s + I, f, H]; var e = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/; var C = "str"; var z = "kwd"; var j = "com"; var O = "typ"; var G = "lit"; var L = "pun"; var F = "pln"; var m = "tag"; var E = "dec"; var J = "src"; var P = "atn"; var n = "atv"; var N = "nocode"; var M = "(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*"; function k(Z) { var ad = 0; var S = false; var ac = false; for (var V = 0, U = Z.length; V < U; ++V) { - var ae = Z[V]; - if (ae.ignoreCase) { - ac = true; - } - else { - if (/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ""))) { - S = true; - ac = false; - break; - } - } -} var Y = { b: 8, t: 9, n: 10, v: 11, f: 12, r: 13 }; function ab(ah) { var ag = ah.charCodeAt(0); if (ag !== 92) { - return ag; -} var af = ah.charAt(1); ag = Y[af]; if (ag) { - return ag; -} -else { - if ("0" <= af && af <= "7") { - return parseInt(ah.substring(1), 8); - } - else { - if (af === "u" || af === "x") { - return parseInt(ah.substring(2), 16); - } - else { - return ah.charCodeAt(1); - } - } -} } function T(af) { if (af < 32) { - return (af < 16 ? "\\x0" : "\\x") + af.toString(16); -} var ag = String.fromCharCode(af); if (ag === "\\" || ag === "-" || ag === "[" || ag === "]") { - ag = "\\" + ag; -} return ag; } function X(am) { var aq = am.substring(1, am.length - 1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]", "g")); var ak = []; var af = []; var ao = aq[0] === "^"; for (var ar = ao ? 1 : 0, aj = aq.length; ar < aj; ++ar) { - var ah = aq[ar]; - if (/\\[bdsw]/i.test(ah)) { - ak.push(ah); - } - else { - var ag = ab(ah); - var al; - if (ar + 2 < aj && "-" === aq[ar + 1]) { - al = ab(aq[ar + 2]); - ar += 2; - } - else { - al = ag; - } - af.push([ag, al]); - if (!(al < 65 || ag > 122)) { - if (!(al < 65 || ag > 90)) { - af.push([Math.max(65, ag) | 32, Math.min(al, 90) | 32]); - } - if (!(al < 97 || ag > 122)) { - af.push([Math.max(97, ag) & ~32, Math.min(al, 122) & ~32]); - } - } - } -} af.sort(function (av, au) { return (av[0] - au[0]) || (au[1] - av[1]); }); var ai = []; var ap = [NaN, NaN]; for (var ar = 0; ar < af.length; ++ar) { - var at = af[ar]; - if (at[0] <= ap[1] + 1) { - ap[1] = Math.max(ap[1], at[1]); - } - else { - ai.push(ap = at); - } -} var an = ["["]; if (ao) { - an.push("^"); -} an.push.apply(an, ak); for (var ar = 0; ar < ai.length; ++ar) { - var at = ai[ar]; - an.push(T(at[0])); - if (at[1] > at[0]) { - if (at[1] + 1 > at[0]) { - an.push("-"); - } - an.push(T(at[1])); - } -} an.push("]"); return an.join(""); } function W(al) { var aj = al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)", "g")); var ah = aj.length; var an = []; for (var ak = 0, am = 0; ak < ah; ++ak) { - var ag = aj[ak]; - if (ag === "(") { - ++am; - } - else { - if ("\\" === ag.charAt(0)) { - var af = +ag.substring(1); - if (af && af <= am) { - an[af] = -1; - } - } - } -} for (var ak = 1; ak < an.length; ++ak) { - if (-1 === an[ak]) { - an[ak] = ++ad; - } -} for (var ak = 0, am = 0; ak < ah; ++ak) { - var ag = aj[ak]; - if (ag === "(") { - ++am; - if (an[am] === undefined) { - aj[ak] = "(?:"; - } - } - else { - if ("\\" === ag.charAt(0)) { - var af = +ag.substring(1); - if (af && af <= am) { - aj[ak] = "\\" + an[am]; - } - } - } -} for (var ak = 0, am = 0; ak < ah; ++ak) { - if ("^" === aj[ak] && "^" !== aj[ak + 1]) { - aj[ak] = ""; - } -} if (al.ignoreCase && S) { - for (var ak = 0; ak < ah; ++ak) { - var ag = aj[ak]; - var ai = ag.charAt(0); - if (ag.length >= 2 && ai === "[") { - aj[ak] = X(ag); - } - else { - if (ai !== "\\") { - aj[ak] = ag.replace(/[a-zA-Z]/g, function (ao) { var ap = ao.charCodeAt(0); return "[" + String.fromCharCode(ap & ~32, ap | 32) + "]"; }); - } - } - } -} return aj.join(""); } var aa = []; for (var V = 0, U = Z.length; V < U; ++V) { - var ae = Z[V]; - if (ae.global || ae.multiline) { - throw new Error("" + ae); - } - aa.push("(?:" + W(ae) + ")"); -} return new RegExp(aa.join("|"), ac ? "gi" : "g"); } function a(V) { var U = /(?:^|\s)nocode(?:\s|$)/; var X = []; var T = 0; var Z = []; var W = 0; var S; if (V.currentStyle) { - S = V.currentStyle.whiteSpace; -} -else { - if (window.getComputedStyle) { - S = document.defaultView.getComputedStyle(V, null).getPropertyValue("white-space"); - } -} var Y = S && "pre" === S.substring(0, 3); function aa(ab) { switch (ab.nodeType) { - case 1: - if (U.test(ab.className)) { - return; - } - for (var ae = ab.firstChild; ae; ae = ae.nextSibling) { - aa(ae); - } - var ad = ab.nodeName; - if ("BR" === ad || "LI" === ad) { - X[W] = "\n"; - Z[W << 1] = T++; - Z[(W++ << 1) | 1] = ab; - } - break; - case 3: - case 4: - var ac = ab.nodeValue; - if (ac.length) { - if (!Y) { - ac = ac.replace(/[ \t\r\n]+/g, " "); - } - else { - ac = ac.replace(/\r\n?/g, "\n"); - } - X[W] = ac; - Z[W << 1] = T; - T += ac.length; - Z[(W++ << 1) | 1] = ab; - } - break; -} } aa(V); return { sourceCode: X.join("").replace(/\n$/, ""), spans: Z }; } function B(S, U, W, T) { if (!U) { - return; -} var V = { sourceCode: U, basePos: S }; W(V); T.push.apply(T, V.decorations); } var v = /\S/; function o(S) { var V = undefined; for (var U = S.firstChild; U; U = U.nextSibling) { - var T = U.nodeType; - V = (T === 1) ? (V ? S : U) : (T === 3) ? (v.test(U.nodeValue) ? S : V) : V; -} return V === S ? undefined : V; } function g(U, T) { var S = {}; var V; (function () { var ad = U.concat(T); var ah = []; var ag = {}; for (var ab = 0, Z = ad.length; ab < Z; ++ab) { - var Y = ad[ab]; - var ac = Y[3]; - if (ac) { - for (var ae = ac.length; --ae >= 0;) { - S[ac.charAt(ae)] = Y; - } - } - var af = Y[1]; - var aa = "" + af; - if (!ag.hasOwnProperty(aa)) { - ah.push(af); - ag[aa] = null; - } -} ah.push(/[\0-\uffff]/); V = k(ah); })(); var X = T.length; var W = function (ah) { var Z = ah.sourceCode, Y = ah.basePos; var ad = [Y, F]; var af = 0; var an = Z.match(V) || []; var aj = {}; for (var ae = 0, aq = an.length; ae < aq; ++ae) { - var ag = an[ae]; - var ap = aj[ag]; - var ai = void 0; - var am; - if (typeof ap === "string") { - am = false; - } - else { - var aa = S[ag.charAt(0)]; - if (aa) { - ai = ag.match(aa[1]); - ap = aa[0]; - } - else { - for (var ao = 0; ao < X; ++ao) { - aa = T[ao]; - ai = ag.match(aa[1]); - if (ai) { - ap = aa[0]; - break; - } - } - if (!ai) { - ap = F; - } - } - am = ap.length >= 5 && "lang-" === ap.substring(0, 5); - if (am && !(ai && typeof ai[1] === "string")) { - am = false; - ap = J; - } - if (!am) { - aj[ag] = ap; - } - } - var ab = af; - af += ag.length; - if (!am) { - ad.push(Y + ab, ap); - } - else { - var al = ai[1]; - var ak = ag.indexOf(al); - var ac = ak + al.length; - if (ai[2]) { - ac = ag.length - ai[2].length; - ak = ac - al.length; - } - var ar = ap.substring(5); - B(Y + ab, ag.substring(0, ak), W, ad); - B(Y + ab + ak, al, q(ar, al), ad); - B(Y + ab + ac, ag.substring(ac), W, ad); - } -} ah.decorations = ad; }; return W; } function i(T) { var W = [], S = []; if (T.tripleQuotedStrings) { - W.push([C, /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, null, "'\""]); -} -else { - if (T.multiLineStrings) { - W.push([C, /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, null, "'\"`"]); - } - else { - W.push([C, /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, null, "\"'"]); - } -} if (T.verbatimStrings) { - S.push([C, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]); -} var Y = T.hashComments; if (Y) { - if (T.cStyleComments) { - if (Y > 1) { - W.push([j, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, "#"]); - } - else { - W.push([j, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, null, "#"]); - } - S.push([C, /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, null]); - } - else { - W.push([j, /^#[^\r\n]*/, null, "#"]); - } -} if (T.cStyleComments) { - S.push([j, /^\/\/[^\r\n]*/, null]); - S.push([j, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); -} if (T.regexLiterals) { - var X = ("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/"); - S.push(["lang-regex", new RegExp("^" + M + "(" + X + ")")]); -} var V = T.types; if (V) { - S.push([O, V]); -} var U = ("" + T.keywords).replace(/^ | $/g, ""); if (U.length) { - S.push([z, new RegExp("^(?:" + U.replace(/[\s,]+/g, "|") + ")\\b"), null]); -} W.push([F, /^\s+/, null, " \r\n\t\xA0"]); S.push([G, /^@[a-z_$][a-z_$@0-9]*/i, null], [O, /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null], [F, /^[a-z_$][a-z_$@0-9]*/i, null], [G, new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*", "i"), null, "0123456789"], [F, /^\\[\s\S]?/, null], [L, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]); return g(W, S); } var K = i({ keywords: A, hashComments: true, cStyleComments: true, multiLineStrings: true, regexLiterals: true }); function Q(V, ag) { var U = /(?:^|\s)nocode(?:\s|$)/; var ab = /\r\n?|\n/; var ac = V.ownerDocument; var S; if (V.currentStyle) { - S = V.currentStyle.whiteSpace; -} -else { - if (window.getComputedStyle) { - S = ac.defaultView.getComputedStyle(V, null).getPropertyValue("white-space"); - } -} var Z = S && "pre" === S.substring(0, 3); var af = ac.createElement("LI"); while (V.firstChild) { - af.appendChild(V.firstChild); -} var W = [af]; function ae(al) { switch (al.nodeType) { - case 1: - if (U.test(al.className)) { - break; - } - if ("BR" === al.nodeName) { - ad(al); - if (al.parentNode) { - al.parentNode.removeChild(al); - } - } - else { - for (var an = al.firstChild; an; an = an.nextSibling) { - ae(an); - } - } - break; - case 3: - case 4: - if (Z) { - var am = al.nodeValue; - var aj = am.match(ab); - if (aj) { - var ai = am.substring(0, aj.index); - al.nodeValue = ai; - var ah = am.substring(aj.index + aj[0].length); - if (ah) { - var ak = al.parentNode; - ak.insertBefore(ac.createTextNode(ah), al.nextSibling); - } - ad(al); - if (!ai) { - al.parentNode.removeChild(al); - } - } - } - break; -} } function ad(ak) { while (!ak.nextSibling) { - ak = ak.parentNode; - if (!ak) { - return; - } -} function ai(al, ar) { var aq = ar ? al.cloneNode(false) : al; var ao = al.parentNode; if (ao) { - var ap = ai(ao, 1); - var an = al.nextSibling; - ap.appendChild(aq); - for (var am = an; am; am = an) { - an = am.nextSibling; - ap.appendChild(am); - } -} return aq; } var ah = ai(ak.nextSibling, 0); for (var aj; (aj = ah.parentNode) && aj.nodeType === 1;) { - ah = aj; -} W.push(ah); } for (var Y = 0; Y < W.length; ++Y) { - ae(W[Y]); -} if (ag === (ag | 0)) { - W[0].setAttribute("value", ag); -} var aa = ac.createElement("OL"); aa.className = "linenums"; var X = Math.max(0, ((ag - 1)) | 0) || 0; for (var Y = 0, T = W.length; Y < T; ++Y) { - af = W[Y]; - af.className = "L" + ((Y + X) % 10); - if (!af.firstChild) { - af.appendChild(ac.createTextNode("\xA0")); - } - aa.appendChild(af); -} V.appendChild(aa); } function D(ac) { var aj = /\bMSIE\b/.test(navigator.userAgent); var am = /\n/g; var al = ac.sourceCode; var an = al.length; var V = 0; var aa = ac.spans; var T = aa.length; var ah = 0; var X = ac.decorations; var Y = X.length; var Z = 0; X[Y] = an; var ar, aq; for (aq = ar = 0; aq < Y;) { - if (X[aq] !== X[aq + 2]) { - X[ar++] = X[aq++]; - X[ar++] = X[aq++]; - } - else { - aq += 2; - } -} Y = ar; for (aq = ar = 0; aq < Y;) { - var at = X[aq]; - var ab = X[aq + 1]; - var W = aq + 2; - while (W + 2 <= Y && X[W + 1] === ab) { - W += 2; - } - X[ar++] = at; - X[ar++] = ab; - aq = W; -} Y = X.length = ar; var ae = null; while (ah < T) { - var af = aa[ah]; - var S = aa[ah + 2] || an; - var ag = X[Z]; - var ap = X[Z + 2] || an; - var W = Math.min(S, ap); - var ak = aa[ah + 1]; - var U; - if (ak.nodeType !== 1 && (U = al.substring(V, W))) { - if (aj) { - U = U.replace(am, "\r"); - } - ak.nodeValue = U; - var ai = ak.ownerDocument; - var ao = ai.createElement("SPAN"); - ao.className = X[Z + 1]; - var ad = ak.parentNode; - ad.replaceChild(ao, ak); - ao.appendChild(ak); - if (V < S) { - aa[ah + 1] = ak = ai.createTextNode(al.substring(W, S)); - ad.insertBefore(ak, ao.nextSibling); - } - } - V = W; - if (V >= S) { - ah += 2; - } - if (V >= ap) { - Z += 2; - } -} } var t = {}; function c(U, V) { for (var S = V.length; --S >= 0;) { - var T = V[S]; - if (!t.hasOwnProperty(T)) { - t[T] = U; - } - else { - if (window.console) { - console.warn("cannot override language handler %s", T); - } - } -} } function q(T, S) { if (!(T && t.hasOwnProperty(T))) { - T = /^\s*]*(?:>|$)/], [j, /^<\!--[\s\S]*?(?:-\->|$)/], ["lang-", /^<\?([\s\S]+?)(?:\?>|$)/], ["lang-", /^<%([\s\S]+?)(?:%>|$)/], [L, /^(?:<[%?]|[%?]>)/], ["lang-", /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], ["lang-js", /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], ["lang-css", /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], ["lang-in.tag", /^(<\/?[a-z][^<>]*>)/i]]), ["default-markup", "htm", "html", "mxml", "xhtml", "xml", "xsl"]); c(g([[F, /^[\s]+/, null, " \t\r\n"], [n, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, "\"'"]], [[m, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i], [P, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], ["lang-uq.val", /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/], [L, /^[=<>\/]+/], ["lang-js", /^on\w+\s*=\s*\"([^\"]+)\"/i], ["lang-js", /^on\w+\s*=\s*\'([^\']+)\'/i], ["lang-js", /^on\w+\s*=\s*([^\"\'>\s]+)/i], ["lang-css", /^style\s*=\s*\"([^\"]+)\"/i], ["lang-css", /^style\s*=\s*\'([^\']+)\'/i], ["lang-css", /^style\s*=\s*([^\"\'>\s]+)/i]]), ["in.tag"]); c(g([], [[n, /^[\s\S]+/]]), ["uq.val"]); c(i({ keywords: l, hashComments: true, cStyleComments: true, types: e }), ["c", "cc", "cpp", "cxx", "cyc", "m"]); c(i({ keywords: "null,true,false" }), ["json"]); c(i({ keywords: R, hashComments: true, cStyleComments: true, verbatimStrings: true, types: e }), ["cs"]); c(i({ keywords: x, cStyleComments: true }), ["java"]); c(i({ keywords: H, hashComments: true, multiLineStrings: true }), ["bsh", "csh", "sh"]); c(i({ keywords: I, hashComments: true, multiLineStrings: true, tripleQuotedStrings: true }), ["cv", "py"]); c(i({ keywords: s, hashComments: true, multiLineStrings: true, regexLiterals: true }), ["perl", "pl", "pm"]); c(i({ keywords: f, hashComments: true, multiLineStrings: true, regexLiterals: true }), ["rb"]); c(i({ keywords: w, cStyleComments: true, regexLiterals: true }), ["js"]); c(i({ keywords: r, hashComments: 3, cStyleComments: true, multilineStrings: true, tripleQuotedStrings: true, regexLiterals: true }), ["coffee"]); c(g([], [[C, /^[\s\S]+/]]), ["regex"]); function d(V) { var U = V.langExtension; try { - var S = a(V.sourceNode); - var T = S.sourceCode; - V.sourceCode = T; - V.spans = S.spans; - V.basePos = 0; - q(U, T)(V); - D(V); -} -catch (W) { - if ("console" in window) { - console.log(W && W.stack ? W.stack : W); - } -} } function y(W, V, U) { var S = document.createElement("PRE"); S.innerHTML = W; if (U) { - Q(S, U); -} var T = { langExtension: V, numberLines: U, sourceNode: S }; d(T); return S.innerHTML; } function b(ad) { function Y(af) { return document.getElementsByTagName(af); } var ac = [Y("pre"), Y("code"), Y("xmp")]; var T = []; for (var aa = 0; aa < ac.length; ++aa) { - for (var Z = 0, V = ac[aa].length; Z < V; ++Z) { - T.push(ac[aa][Z]); - } -} ac = null; var W = Date; if (!W.now) { - W = { now: function () { return +(new Date); } }; -} var X = 0; var S; var ab = /\blang(?:uage)?-([\w.]+)(?!\S)/; var ae = /\bprettyprint\b/; function U() { var ag = (window.PR_SHOULD_USE_CONTINUATION ? W.now() + 250 : Infinity); for (; X < T.length && W.now() < ag; X++) { - var aj = T[X]; - var ai = aj.className; - if (ai.indexOf("prettyprint") >= 0) { - var ah = ai.match(ab); - var am; - if (!ah && (am = o(aj)) && "CODE" === am.tagName) { - ah = am.className.match(ab); - } - if (ah) { - ah = ah[1]; - } - var al = false; - for (var ak = aj.parentNode; ak; ak = ak.parentNode) { - if ((ak.tagName === "pre" || ak.tagName === "code" || ak.tagName === "xmp") && ak.className && ak.className.indexOf("prettyprint") >= 0) { - al = true; - break; - } - } - if (!al) { - var af = aj.className.match(/\blinenums\b(?::(\d+))?/); - af = af ? af[1] && af[1].length ? +af[1] : true : false; - if (af) { - Q(aj, af); - } - S = { langExtension: ah, sourceNode: aj, numberLines: af }; - d(S); - } - } -} if (X < T.length) { - setTimeout(U, 250); -} -else { - if (ad) { - ad(); - } -} } U(); } window.prettyPrintOne = y; window.prettyPrint = b; window.PR = { createSimpleLexer: g, registerLangHandler: c, sourceDecorator: i, PR_ATTRIB_NAME: P, PR_ATTRIB_VALUE: n, PR_COMMENT: j, PR_DECLARATION: E, PR_KEYWORD: z, PR_LITERAL: G, PR_NOCODE: N, PR_PLAIN: F, PR_PUNCTUATION: L, PR_SOURCE: J, PR_STRING: C, PR_TAG: m, PR_TYPE: O }; })(); -PR.registerLangHandler(PR.createSimpleLexer([], [[PR.PR_DECLARATION, /^]*(?:>|$)/], [PR.PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/], [PR.PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/], ["lang-", /^<\?([\s\S]+?)(?:\?>|$)/], ["lang-", /^<%([\s\S]+?)(?:%>|$)/], ["lang-", /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], ["lang-handlebars", /^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i], ["lang-js", /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], ["lang-css", /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], ["lang-in.tag", /^(<\/?[a-z][^<>]*>)/i], [PR.PR_DECLARATION, /^{{[#^>/]?\s*[\w.][^}]*}}/], [PR.PR_DECLARATION, /^{{&?\s*[\w.][^}]*}}/], [PR.PR_DECLARATION, /^{{{>?\s*[\w.][^}]*}}}/], [PR.PR_COMMENT, /^{{![^}]*}}/]]), ["handlebars", "hbs"]); -PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN, /^[ \t\r\n\f]+/, null, " \t\r\n\f"]], [[PR.PR_STRING, /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, null], [PR.PR_STRING, /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, null], ["lang-css-str", /^url\(([^\)\"\']*)\)/i], [PR.PR_KEYWORD, /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i, null], ["lang-css-kw", /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i], [PR.PR_COMMENT, /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], [PR.PR_COMMENT, /^(?:)/], [PR.PR_LITERAL, /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i], [PR.PR_LITERAL, /^#(?:[0-9a-f]{3}){1,2}/i], [PR.PR_PLAIN, /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i], [PR.PR_PUNCTUATION, /^[^\s\w\'\"]+/]]), ["css"]); -PR.registerLangHandler(PR.createSimpleLexer([], [[PR.PR_KEYWORD, /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]), ["css-kw"]); -PR.registerLangHandler(PR.createSimpleLexer([], [[PR.PR_STRING, /^[^\)\"\']+/]]), ["css-str"]); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldHRpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb3ZlcmFnZS9sY292LXJlcG9ydC9wcmV0dGlmeS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxDQUFDLDBCQUEwQixHQUFDLElBQUksQ0FBQztBQUFBLENBQUMsY0FBVyxJQUFJLENBQUMsR0FBQyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxDQUFDLENBQUMsRUFBQyw0SkFBNEosQ0FBQyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLEVBQUMsa0dBQWtHLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQyxFQUFDLDhQQUE4UCxDQUFDLENBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxDQUFDLENBQUMsRUFBQywySUFBMkksQ0FBQyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLEVBQUMsd1FBQXdRLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLDhKQUE4SixDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLEVBQUMsNEVBQTRFLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLGdMQUFnTCxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLEVBQUMsc0pBQXNKLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQyxFQUFDLHdLQUF3SyxDQUFDLENBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxDQUFDLENBQUMsRUFBQyw4REFBOEQsQ0FBQyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLGdIQUFnSCxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsUUFBUSxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsMlNBQTJTLENBQUMsQ0FBQSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUUsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsS0FBSyxDQUFDLENBQUEsS0FBSSxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxHQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsRUFBQztJQUFDLElBQUksRUFBRSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUFBLElBQUcsRUFBRSxDQUFDLFVBQVUsRUFBQztRQUFDLEVBQUUsR0FBQyxJQUFJLENBQUE7S0FBQztTQUFJO1FBQUMsSUFBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHlDQUF5QyxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUM7WUFBQyxDQUFDLEdBQUMsSUFBSSxDQUFDO1lBQUEsRUFBRSxHQUFDLEtBQUssQ0FBQztZQUFBLE1BQUs7U0FBQztLQUFDO0NBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQSxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUUsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLElBQUcsRUFBRSxLQUFHLEVBQUUsRUFBQztJQUFDLE9BQU8sRUFBRSxDQUFBO0NBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsRUFBRSxHQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBLElBQUcsRUFBRSxFQUFDO0lBQUMsT0FBTyxFQUFFLENBQUE7Q0FBQztLQUFJO0lBQUMsSUFBRyxHQUFHLElBQUUsRUFBRSxJQUFFLEVBQUUsSUFBRSxHQUFHLEVBQUM7UUFBQyxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFBO0tBQUM7U0FBSTtRQUFDLElBQUcsRUFBRSxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsR0FBRyxFQUFDO1lBQUMsT0FBTyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQTtTQUFDO2FBQUk7WUFBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FBQztLQUFDO0NBQUMsQ0FBQSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFFLElBQUcsRUFBRSxHQUFDLEVBQUUsRUFBQztJQUFDLE9BQU0sQ0FBQyxFQUFFLEdBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQSxNQUFNLENBQUEsQ0FBQyxDQUFBLEtBQUssQ0FBQyxHQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7Q0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQSxJQUFHLEVBQUUsS0FBRyxJQUFJLElBQUUsRUFBRSxLQUFHLEdBQUcsSUFBRSxFQUFFLEtBQUcsR0FBRyxJQUFFLEVBQUUsS0FBRyxHQUFHLEVBQUM7SUFBQyxFQUFFLEdBQUMsSUFBSSxHQUFDLEVBQUUsQ0FBQTtDQUFDLENBQUEsT0FBTyxFQUFFLENBQUEsQ0FBQSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFFLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLG9HQUFvRyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUcsR0FBRyxDQUFDLENBQUEsS0FBSSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxFQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsTUFBTSxFQUFDLEVBQUUsR0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFFLEVBQUM7SUFBQyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFBQSxJQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUM7UUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0tBQUM7U0FBSTtRQUFDLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFBLElBQUksRUFBRSxDQUFDO1FBQUEsSUFBRyxFQUFFLEdBQUMsQ0FBQyxHQUFDLEVBQUUsSUFBRSxHQUFHLEtBQUcsRUFBRSxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsRUFBQztZQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUEsRUFBRSxJQUFFLENBQUMsQ0FBQTtTQUFDO2FBQUk7WUFBQyxFQUFFLEdBQUMsRUFBRSxDQUFBO1NBQUM7UUFBQSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFBQSxJQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUMsRUFBRSxJQUFFLEVBQUUsR0FBQyxHQUFHLENBQUMsRUFBQztZQUFDLElBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBQyxFQUFFLElBQUUsRUFBRSxHQUFDLEVBQUUsQ0FBQyxFQUFDO2dCQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBQyxFQUFFLENBQUMsR0FBQyxFQUFFLEVBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTthQUFDO1lBQUEsSUFBRyxDQUFDLENBQUMsRUFBRSxHQUFDLEVBQUUsSUFBRSxFQUFFLEdBQUMsR0FBRyxDQUFDLEVBQUM7Z0JBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxHQUFDLENBQUMsRUFBRSxFQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFDLEdBQUcsQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTthQUFDO1NBQUM7S0FBQztDQUFDLENBQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFTLEVBQUUsRUFBQyxFQUFFLElBQUUsT0FBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsQ0FBQyxHQUFHLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQSxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsRUFBQztJQUFDLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUFBLElBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLEVBQUM7UUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FBQztTQUFJO1FBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLENBQUE7S0FBQztDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBLElBQUcsRUFBRSxFQUFDO0lBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtDQUFDLENBQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsS0FBSSxJQUFJLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUM7SUFBQyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFBQSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFDO1FBQUMsSUFBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBQztZQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7U0FBQztRQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FBQztDQUFDLENBQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUUsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsMkpBQTJKLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQSxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFFLEVBQUM7SUFBQyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFBQSxJQUFHLEVBQUUsS0FBRyxHQUFHLEVBQUM7UUFBQyxFQUFFLEVBQUUsQ0FBQTtLQUFDO1NBQUk7UUFBQyxJQUFHLElBQUksS0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDO1lBQUMsSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUEsSUFBRyxFQUFFLElBQUUsRUFBRSxJQUFFLEVBQUUsRUFBQztnQkFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUE7YUFBQztTQUFDO0tBQUM7Q0FBQyxDQUFBLEtBQUksSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsTUFBTSxFQUFDLEVBQUUsRUFBRSxFQUFDO0lBQUMsSUFBRyxDQUFDLENBQUMsS0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUM7UUFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUMsRUFBRSxFQUFFLENBQUE7S0FBQztDQUFDLENBQUEsS0FBSSxJQUFJLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsRUFBRSxFQUFDLEVBQUUsRUFBRSxFQUFDO0lBQUMsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQUEsSUFBRyxFQUFFLEtBQUcsR0FBRyxFQUFDO1FBQUMsRUFBRSxFQUFFLENBQUM7UUFBQSxJQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBRyxTQUFTLEVBQUM7WUFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUMsS0FBSyxDQUFBO1NBQUM7S0FBQztTQUFJO1FBQUMsSUFBRyxJQUFJLEtBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQztZQUFDLElBQUksRUFBRSxHQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFBLElBQUcsRUFBRSxJQUFFLEVBQUUsSUFBRSxFQUFFLEVBQUM7Z0JBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFDLElBQUksR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7YUFBQztTQUFDO0tBQUM7Q0FBQyxDQUFBLEtBQUksSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxHQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsRUFBQztJQUFDLElBQUcsR0FBRyxLQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBRSxHQUFHLEtBQUcsRUFBRSxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsRUFBQztRQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBQyxFQUFFLENBQUE7S0FBQztDQUFDLENBQUEsSUFBRyxFQUFFLENBQUMsVUFBVSxJQUFFLENBQUMsRUFBQztJQUFDLEtBQUksSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFFLEVBQUM7UUFBQyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUEsSUFBRyxFQUFFLENBQUMsTUFBTSxJQUFFLENBQUMsSUFBRSxFQUFFLEtBQUcsR0FBRyxFQUFDO1lBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUFDO2FBQUk7WUFBQyxJQUFHLEVBQUUsS0FBRyxJQUFJLEVBQUM7Z0JBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFDLFVBQVMsRUFBRSxJQUFFLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxPQUFNLEdBQUcsR0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUUsRUFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLEdBQUMsR0FBRyxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUE7YUFBQztTQUFDO0tBQUM7Q0FBQyxDQUFBLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQSxLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBQyxDQUFDLEdBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxFQUFDO0lBQUMsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBRyxFQUFFLENBQUMsTUFBTSxJQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUM7UUFBQyxNQUFNLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQTtLQUFDO0lBQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFDLEdBQUcsQ0FBQyxDQUFBO0NBQUMsQ0FBQSxPQUFPLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUEsQ0FBQyxDQUFBLEdBQUcsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFBLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBRSxJQUFJLENBQUMsR0FBQyx3QkFBd0IsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxDQUFDLENBQUEsSUFBRyxDQUFDLENBQUMsWUFBWSxFQUFDO0lBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFBO0NBQUM7S0FBSTtJQUFDLElBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFDO1FBQUMsQ0FBQyxHQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFBO0tBQUM7Q0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLENBQUMsSUFBRSxLQUFLLEtBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUUsUUFBTyxFQUFFLENBQUMsUUFBUSxFQUFDO0lBQUMsS0FBSyxDQUFDO1FBQUMsSUFBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBQztZQUFDLE9BQU07U0FBQztRQUFBLEtBQUksSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsRUFBQyxFQUFFLEVBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUM7WUFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7U0FBQztRQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFBQSxJQUFHLElBQUksS0FBRyxFQUFFLElBQUUsSUFBSSxLQUFHLEVBQUUsRUFBQztZQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJLENBQUM7WUFBQSxDQUFDLENBQUMsQ0FBQyxJQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDO1lBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFBO1NBQUM7UUFBQSxNQUFNO0lBQUEsS0FBSyxDQUFDLENBQUM7SUFBQSxLQUFLLENBQUM7UUFBQyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQUEsSUFBRyxFQUFFLENBQUMsTUFBTSxFQUFDO1lBQUMsSUFBRyxDQUFDLENBQUMsRUFBQztnQkFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUMsR0FBRyxDQUFDLENBQUE7YUFBQztpQkFBSTtnQkFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUMsSUFBSSxDQUFDLENBQUE7YUFBQztZQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUM7WUFBQSxDQUFDLENBQUMsQ0FBQyxJQUFFLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQztZQUFBLENBQUMsSUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUUsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFBO1NBQUM7UUFBQSxNQUFLO0NBQUMsQ0FBQSxDQUFDLENBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsT0FBTSxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUMsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxDQUFBLENBQUEsQ0FBQyxDQUFBLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsSUFBRSxJQUFHLENBQUMsQ0FBQyxFQUFDO0lBQUMsT0FBTTtDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsSUFBSSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksQ0FBQyxHQUFDLFNBQVMsQ0FBQyxDQUFBLEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBQyxDQUFDLEVBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUM7SUFBQyxJQUFJLENBQUMsR0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQUEsQ0FBQyxHQUFDLENBQUMsQ0FBQyxLQUFHLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLEtBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQTtDQUFDLENBQUEsT0FBTyxDQUFDLEtBQUcsQ0FBQyxDQUFBLENBQUMsQ0FBQSxTQUFTLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxJQUFFLElBQUksQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFBLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQyxjQUFXLElBQUksRUFBRSxHQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQSxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLE1BQU0sRUFBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBRSxFQUFDO0lBQUMsSUFBSSxDQUFDLEdBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQUEsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBRyxFQUFFLEVBQUM7UUFBQyxLQUFJLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUMsRUFBRSxFQUFFLElBQUUsQ0FBQyxHQUFFO1lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUE7U0FBQztLQUFDO0lBQUEsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQztJQUFBLElBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFDO1FBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFBLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBQyxJQUFJLENBQUE7S0FBQztDQUFDLENBQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLFVBQVMsRUFBRSxJQUFFLElBQUksQ0FBQyxHQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLENBQUMsQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUUsRUFBRSxDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLENBQUEsS0FBSSxJQUFJLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUMsRUFBRSxHQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsRUFBQztJQUFDLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUFBLElBQUksRUFBRSxHQUFDLEtBQUssQ0FBQyxDQUFDO0lBQUEsSUFBSSxFQUFFLENBQUM7SUFBQSxJQUFHLE9BQU8sRUFBRSxLQUFHLFFBQVEsRUFBQztRQUFDLEVBQUUsR0FBQyxLQUFLLENBQUE7S0FBQztTQUFJO1FBQUMsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFBLElBQUcsRUFBRSxFQUFDO1lBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQSxFQUFFLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQUM7YUFBSTtZQUFDLEtBQUksSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxFQUFFLEVBQUM7Z0JBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFBQSxFQUFFLEdBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQSxJQUFHLEVBQUUsRUFBQztvQkFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUFBLE1BQUs7aUJBQUM7YUFBQztZQUFBLElBQUcsQ0FBQyxFQUFFLEVBQUM7Z0JBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQTthQUFDO1NBQUM7UUFBQSxFQUFFLEdBQUMsRUFBRSxDQUFDLE1BQU0sSUFBRSxDQUFDLElBQUUsT0FBTyxLQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUEsSUFBRyxFQUFFLElBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBRyxRQUFRLENBQUMsRUFBQztZQUFDLEVBQUUsR0FBQyxLQUFLLENBQUM7WUFBQSxFQUFFLEdBQUMsQ0FBQyxDQUFBO1NBQUM7UUFBQSxJQUFHLENBQUMsRUFBRSxFQUFDO1lBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFDLEVBQUUsQ0FBQTtTQUFDO0tBQUM7SUFBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUM7SUFBQSxFQUFFLElBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUFBLElBQUcsQ0FBQyxFQUFFLEVBQUM7UUFBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLENBQUE7S0FBQztTQUFJO1FBQUMsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQUEsSUFBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUM7WUFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLE1BQU0sR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQUEsRUFBRSxHQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsTUFBTSxDQUFBO1NBQUM7UUFBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUEsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQUEsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFLEdBQUMsRUFBRSxFQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQUEsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFLEdBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFBO0tBQUM7Q0FBQyxDQUFBLEVBQUUsQ0FBQyxXQUFXLEdBQUMsRUFBRSxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUEsT0FBTyxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksQ0FBQyxHQUFDLEVBQUUsRUFBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUEsSUFBRyxDQUFDLENBQUMsbUJBQW1C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LFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUEsT0FBTSxDQUFDLENBQUMsVUFBVSxFQUFDO0lBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7Q0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQSxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUUsUUFBTyxFQUFFLENBQUMsUUFBUSxFQUFDO0lBQUMsS0FBSyxDQUFDO1FBQUMsSUFBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBQztZQUFDLE1BQUs7U0FBQztRQUFBLElBQUcsSUFBSSxLQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUM7WUFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFBQSxJQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUM7Z0JBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7YUFBQztTQUFDO2FBQUk7WUFBQyxLQUFJLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUMsRUFBRSxFQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsV0FBVyxFQUFDO2dCQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTthQUFDO1NBQUM7UUFBQSxNQUFNO0lBQUEsS0FBSyxDQUFDLENBQUM7SUFBQSxLQUFLLENBQUM7UUFBQyxJQUFHLENBQUMsRUFBQztZQUFDLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQUEsSUFBRyxFQUFFLEVBQUM7Z0JBQUMsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUFBLEVBQUUsQ0FBQyxTQUFTLEdBQUMsRUFBRSxDQUFDO2dCQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQUEsSUFBRyxFQUFFLEVBQUM7b0JBQUMsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQztvQkFBQSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2lCQUFDO2dCQUFBLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFBQSxJQUFHLENBQUMsRUFBRSxFQUFDO29CQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2lCQUFDO2FBQUM7U0FBQztRQUFBLE1BQUs7Q0FBQyxDQUFBLENBQUMsQ0FBQSxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUUsT0FBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUM7SUFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQztJQUFBLElBQUcsQ0FBQyxFQUFFLEVBQUM7UUFBQyxPQUFNO0tBQUM7Q0FBQyxDQUFBLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBQyxFQUFFLElBQUUsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUMsQ0FBQSxFQUFFLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUEsSUFBRyxFQUFFLEVBQUM7SUFBQyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztJQUFBLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFBQSxLQUFJLElBQUksRUFBRSxHQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxHQUFDLEVBQUUsRUFBQztRQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBQUEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtLQUFDO0NBQUMsQ0FBQSxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLEtBQUksSUFBSSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUcsQ0FBQyxHQUFFO0lBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQTtDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQSxLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBQyxFQUFFLENBQUMsRUFBQztJQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtDQUFDLENBQUEsSUFBRyxFQUFFLEtBQUcsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLEVBQUM7SUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBQyxFQUFFLENBQUMsQ0FBQTtDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBLEVBQUUsQ0FBQyxTQUFTLEdBQUMsVUFBVSxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxJQUFFLENBQUMsQ0FBQyxDQUFBLEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsTUFBTSxFQUFDLENBQUMsR0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLEVBQUM7SUFBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsRUFBRSxDQUFDLFNBQVMsR0FBQyxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsQ0FBQztJQUFBLElBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFDO1FBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7S0FBQztJQUFBLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUE7Q0FBQyxDQUFBLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFFLElBQUksRUFBRSxHQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLENBQUMsQ0FBQyxDQUFBLElBQUksQ0FBQyxHQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFBLElBQUksRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFBLEtBQUksRUFBRSxHQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxHQUFDLENBQUMsR0FBRTtJQUFDLElBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLEVBQUM7UUFBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUFBLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0tBQUM7U0FBSTtRQUFDLEVBQUUsSUFBRSxDQUFDLENBQUE7S0FBQztDQUFDLENBQUEsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFBLEtBQUksRUFBRSxHQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxHQUFDLENBQUMsR0FBRTtJQUFDLElBQUksRUFBRSxHQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUFBLElBQUksRUFBRSxHQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUM7SUFBQSxJQUFJLENBQUMsR0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDO0lBQUEsT0FBTSxDQUFDLEdBQUMsQ0FBQyxJQUFFLENBQUMsSUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxLQUFHLEVBQUUsRUFBQztRQUFDLENBQUMsSUFBRSxDQUFDLENBQUE7S0FBQztJQUFBLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFDLEVBQUUsQ0FBQztJQUFBLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFDLEVBQUUsQ0FBQztJQUFBLEVBQUUsR0FBQyxDQUFDLENBQUE7Q0FBQyxDQUFBLENBQUMsR0FBQyxDQUFDLENBQUMsTUFBTSxHQUFDLEVBQUUsQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLElBQUksQ0FBQyxDQUFBLE9BQU0sRUFBRSxHQUFDLENBQUMsRUFBQztJQUFDLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUFBLElBQUksQ0FBQyxHQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLElBQUUsRUFBRSxDQUFDO0lBQUEsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsSUFBRSxFQUFFLENBQUM7SUFBQSxJQUFJLENBQUMsR0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUM7SUFBQSxJQUFJLENBQUMsQ0FBQztJQUFBLElBQUcsRUFBRSxDQUFDLFFBQVEsS0FBRyxDQUFDLElBQUUsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztRQUFDLElBQUcsRUFBRSxFQUFDO1lBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFDLElBQUksQ0FBQyxDQUFBO1NBQUM7UUFBQSxFQUFFLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztRQUFBLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFBQSxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQUEsRUFBRSxDQUFDLFNBQVMsR0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUFBLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQUEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFBLElBQUcsQ0FBQyxHQUFDLENBQUMsRUFBQztZQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxDQUFDLEdBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFBLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtTQUFDO0tBQUM7SUFBQSxDQUFDLEdBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBRyxDQUFDLElBQUUsQ0FBQyxFQUFDO1FBQUMsRUFBRSxJQUFFLENBQUMsQ0FBQTtLQUFDO0lBQUEsSUFBRyxDQUFDLElBQUUsRUFBRSxFQUFDO1FBQUMsQ0FBQyxJQUFFLENBQUMsQ0FBQTtLQUFDO0NBQUMsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsRUFBRSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsSUFBRSxLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUMsRUFBRSxDQUFDLElBQUUsQ0FBQyxHQUFFO0lBQUMsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBRyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUM7UUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFBO0tBQUM7U0FBSTtRQUFDLElBQUcsTUFBTSxDQUFDLE9BQU8sRUFBQztZQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUMsQ0FBQyxDQUFDLENBQUE7U0FBQztLQUFDO0NBQUMsQ0FBQSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsSUFBRSxJQUFHLENBQUMsQ0FBQyxDQUFDLElBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDO0lBQUMsQ0FBQyxHQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFBLGdCQUFnQixDQUFBLENBQUMsQ0FBQSxjQUFjLENBQUE7Q0FBQyxDQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLDBCQUEwQixDQUFDLEVBQUMsQ0FBQyxPQUFPLEVBQUMseUJBQXlCLENBQUMsRUFBQyxDQUFDLE9BQU8sRUFBQyx1QkFBdUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxPQUFPLEVBQUMsd0NBQXdDLENBQUMsRUFBQyxDQUFDLFNBQVMsRUFBQyxnREFBZ0QsQ0FBQyxFQUFDLENBQUMsVUFBVSxFQUFDLDhDQUE4QyxDQUFDLEVBQUMsQ0FBQyxhQUFhLEVBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxnQkFBZ0IsRUFBQyxLQUFLLEVBQUMsTUFBTSxFQUFDLE1BQU0sRUFBQyxPQUFPLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLElBQUksRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyw4QkFBOEIsRUFBQyxJQUFJLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLG1DQUFtQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsd0NBQXdDLENBQUMsRUFBQyxDQUFDLGFBQWEsRUFBQyw2Q0FBNkMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsU0FBUyxFQUFDLDRCQUE0QixDQUFDLEVBQUMsQ0FBQyxTQUFTLEVBQUMsNEJBQTRCLENBQUMsRUFBQyxDQUFDLFNBQVMsRUFBQyw2QkFBNkIsQ0FBQyxFQUFDLENBQUMsVUFBVSxFQUFDLDRCQUE0QixDQUFDLEVBQUMsQ0FBQyxVQUFVLEVBQUMsNEJBQTRCLENBQUMsRUFBQyxDQUFDLFVBQVUsRUFBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxZQUFZLEVBQUMsSUFBSSxFQUFDLGNBQWMsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLGlCQUFpQixFQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxZQUFZLEVBQUMsSUFBSSxFQUFDLGNBQWMsRUFBQyxJQUFJLEVBQUMsZUFBZSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxjQUFjLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxZQUFZLEVBQUMsSUFBSSxFQUFDLGdCQUFnQixFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsQ0FBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxZQUFZLEVBQUMsSUFBSSxFQUFDLGdCQUFnQixFQUFDLElBQUksRUFBQyxtQkFBbUIsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLENBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxZQUFZLEVBQUMsSUFBSSxFQUFDLGdCQUFnQixFQUFDLElBQUksRUFBQyxhQUFhLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxFQUFDLFlBQVksRUFBQyxJQUFJLEVBQUMsZ0JBQWdCLEVBQUMsSUFBSSxFQUFDLGFBQWEsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxFQUFDLGNBQWMsRUFBQyxJQUFJLEVBQUMsYUFBYSxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxjQUFjLEVBQUMsSUFBSSxFQUFDLGdCQUFnQixFQUFDLElBQUksRUFBQyxtQkFBbUIsRUFBQyxJQUFJLEVBQUMsYUFBYSxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQSxJQUFHO0lBQUMsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUFBLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFBQSxDQUFDLENBQUMsVUFBVSxHQUFDLENBQUMsQ0FBQztJQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUFBLENBQUMsQ0FBQyxPQUFPLEdBQUMsQ0FBQyxDQUFDO0lBQUEsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtDQUFDO0FBQUEsT0FBTSxDQUFDLEVBQUM7SUFBQyxJQUFHLFNBQVMsSUFBSSxNQUFNLEVBQUM7UUFBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBRSxDQUFDLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQTtLQUFDO0NBQUMsQ0FBQSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLElBQUUsSUFBSSxDQUFDLEdBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLEdBQUMsQ0FBQyxDQUFDLENBQUEsSUFBRyxDQUFDLEVBQUM7SUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFBO0NBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUEsQ0FBQSxDQUFDLENBQUEsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBRSxPQUFPLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxFQUFFLENBQUMsQ0FBQSxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsRUFBRSxDQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsRUFBQztJQUFDLEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsR0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFDLENBQUMsR0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLEVBQUM7UUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQUM7Q0FBQyxDQUFBLEVBQUUsR0FBQyxJQUFJLENBQUMsQ0FBQSxJQUFJLENBQUMsR0FBQyxJQUFJLENBQUMsQ0FBQSxJQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQztJQUFDLENBQUMsR0FBQyxFQUFDLEdBQUcsRUFBQyxjQUFXLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUEsQ0FBQSxDQUFDLEVBQUMsQ0FBQTtDQUFDLENBQUEsSUFBSSxDQUFDLEdBQUMsQ0FBQyxDQUFDLENBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQSxJQUFJLEVBQUUsR0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBLElBQUksRUFBRSxHQUFDLGlCQUFpQixDQUFDLENBQUEsU0FBUyxDQUFDLEtBQUcsSUFBSSxFQUFFLEdBQUMsQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBQyxHQUFHLENBQUEsQ0FBQyxDQUFBLFFBQVEsQ0FBQyxDQUFDLENBQUEsT0FBSyxDQUFDLEdBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUMsRUFBRSxFQUFDLENBQUMsRUFBRSxFQUFDO0lBQUMsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUEsSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztJQUFBLElBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBRSxDQUFDLEVBQUM7UUFBQyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQUEsSUFBSSxFQUFFLENBQUM7UUFBQSxJQUFHLENBQUMsRUFBRSxJQUFFLENBQUMsRUFBRSxHQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFFLE1BQU0sS0FBRyxFQUFFLENBQUMsT0FBTyxFQUFDO1lBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQUM7UUFBQSxJQUFHLEVBQUUsRUFBQztZQUFDLEVBQUUsR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FBQztRQUFBLElBQUksRUFBRSxHQUFDLEtBQUssQ0FBQztRQUFBLEtBQUksSUFBSSxFQUFFLEdBQUMsRUFBRSxDQUFDLFVBQVUsRUFBQyxFQUFFLEVBQUMsRUFBRSxHQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUM7WUFBQyxJQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sS0FBRyxLQUFLLElBQUUsRUFBRSxDQUFDLE9BQU8sS0FBRyxNQUFNLElBQUUsRUFBRSxDQUFDLE9BQU8sS0FBRyxLQUFLLENBQUMsSUFB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QUMsQ0FBQyxFQUFDLENBQUMsWUFBWSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFDLGVBQWUsRUFBQyxJQUFJLEVBQUMsV0FBVyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBQyxvREFBb0QsRUFBQyxJQUFJLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUMsb0RBQW9ELEVBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxjQUFjLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUMsOEVBQThFLEVBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxhQUFhLEVBQUMsNEVBQTRFLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUMsb0NBQW9DLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFDLGlDQUFpQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFDLHlCQUF5QixDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFDLG1FQUFtRSxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsid2luZG93LlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OPXRydWU7KGZ1bmN0aW9uKCl7dmFyIGg9W1wiYnJlYWssY29udGludWUsZG8sZWxzZSxmb3IsaWYscmV0dXJuLHdoaWxlXCJdO3ZhciB1PVtoLFwiYXV0byxjYXNlLGNoYXIsY29uc3QsZGVmYXVsdCxkb3VibGUsZW51bSxleHRlcm4sZmxvYXQsZ290byxpbnQsbG9uZyxyZWdpc3RlcixzaG9ydCxzaWduZWQsc2l6ZW9mLHN0YXRpYyxzdHJ1Y3Qsc3dpdGNoLHR5cGVkZWYsdW5pb24sdW5zaWduZWQsdm9pZCx2b2xhdGlsZVwiXTt2YXIgcD1bdSxcImNhdGNoLGNsYXNzLGRlbGV0ZSxmYWxzZSxpbXBvcnQsbmV3LG9wZXJhdG9yLHByaXZhdGUscHJvdGVjdGVkLHB1YmxpYyx0aGlzLHRocm93LHRydWUsdHJ5LHR5cGVvZlwiXTt2YXIgbD1bcCxcImFsaWdub2YsYWxpZ25fdW5pb24sYXNtLGF4aW9tLGJvb2wsY29uY2VwdCxjb25jZXB0X21hcCxjb25zdF9jYXN0LGNvbnN0ZXhwcixkZWNsdHlwZSxkeW5hbWljX2Nhc3QsZXhwbGljaXQsZXhwb3J0LGZyaWVuZCxpbmxpbmUsbGF0ZV9jaGVjayxtdXRhYmxlLG5hbWVzcGFjZSxudWxscHRyLHJlaW50ZXJwcmV0X2Nhc3Qsc3RhdGljX2Fzc2VydCxzdGF0aWNfY2FzdCx0ZW1wbGF0ZSx0eXBlaWQsdHlwZW5hbWUsdXNpbmcsdmlydHVhbCx3aGVyZVwiXTt2YXIgeD1bcCxcImFic3RyYWN0LGJvb2xlYW4sYnl0ZSxleHRlbmRzLGZpbmFsLGZpbmFsbHksaW1wbGVtZW50cyxpbXBvcnQsaW5zdGFuY2VvZixudWxsLG5hdGl2ZSxwYWNrYWdlLHN0cmljdGZwLHN1cGVyLHN5bmNocm9uaXplZCx0aHJvd3MsdHJhbnNpZW50XCJdO3ZhciBSPVt4LFwiYXMsYmFzZSxieSxjaGVja2VkLGRlY2ltYWwsZGVsZWdhdGUsZGVzY2VuZGluZyxkeW5hbWljLGV2ZW50LGZpeGVkLGZvcmVhY2gsZnJvbSxncm91cCxpbXBsaWNpdCxpbixpbnRlcmZhY2UsaW50ZXJuYWwsaW50byxpcyxsb2NrLG9iamVjdCxvdXQsb3ZlcnJpZGUsb3JkZXJieSxwYXJhbXMscGFydGlhbCxyZWFkb25seSxyZWYsc2J5dGUsc2VhbGVkLHN0YWNrYWxsb2Msc3RyaW5nLHNlbGVjdCx1aW50LHVsb25nLHVuY2hlY2tlZCx1bnNhZmUsdXNob3J0LHZhclwiXTt2YXIgcj1cImFsbCxhbmQsYnksY2F0Y2gsY2xhc3MsZWxzZSxleHRlbmRzLGZhbHNlLGZpbmFsbHksZm9yLGlmLGluLGlzLGlzbnQsbG9vcCxuZXcsbm8sbm90LG51bGwsb2Ysb2ZmLG9uLG9yLHJldHVybixzdXBlcix0aGVuLHRydWUsdHJ5LHVubGVzcyx1bnRpbCx3aGVuLHdoaWxlLHllc1wiO3ZhciB3PVtwLFwiZGVidWdnZXIsZXZhbCxleHBvcnQsZnVuY3Rpb24sZ2V0LG51bGwsc2V0LHVuZGVmaW5lZCx2YXIsd2l0aCxJbmZpbml0eSxOYU5cIl07dmFyIHM9XCJjYWxsZXIsZGVsZXRlLGRpZSxkbyxkdW1wLGVsc2lmLGV2YWwsZXhpdCxmb3JlYWNoLGZvcixnb3RvLGlmLGltcG9ydCxsYXN0LGxvY2FsLG15LG5leHQsbm8sb3VyLHByaW50LHBhY2thZ2UscmVkbyxyZXF1aXJlLHN1Yix1bmRlZix1bmxlc3MsdW50aWwsdXNlLHdhbnRhcnJheSx3aGlsZSxCRUdJTixFTkRcIjt2YXIgST1baCxcImFuZCxhcyxhc3NlcnQsY2xhc3MsZGVmLGRlbCxlbGlmLGV4Y2VwdCxleGVjLGZpbmFsbHksZnJvbSxnbG9iYWwsaW1wb3J0LGluLGlzLGxhbWJkYSxub25sb2NhbCxub3Qsb3IscGFzcyxwcmludCxyYWlzZSx0cnksd2l0aCx5aWVsZCxGYWxzZSxUcnVlLE5vbmVcIl07dmFyIGY9W2gsXCJhbGlhcyxhbmQsYmVnaW4sY2FzZSxjbGFzcyxkZWYsZGVmaW5lZCxlbHNpZixlbmQsZW5zdXJlLGZhbHNlLGluLG1vZHVsZSxuZXh0LG5pbCxub3Qsb3IscmVkbyxyZXNjdWUscmV0cnksc2VsZixzdXBlcix0aGVuLHRydWUsdW5kZWYsdW5sZXNzLHVudGlsLHdoZW4seWllbGQsQkVHSU4sRU5EXCJdO3ZhciBIPVtoLFwiY2FzZSxkb25lLGVsaWYsZXNhYyxldmFsLGZpLGZ1bmN0aW9uLGluLGxvY2FsLHNldCx0aGVuLHVudGlsXCJdO3ZhciBBPVtsLFIsdyxzK0ksZixIXTt2YXIgZT0vXihESVJ8RklMRXx2ZWN0b3J8KGRlfHByaW9yaXR5Xyk/cXVldWV8bGlzdHxzdGFja3woY29uc3RfKT9pdGVyYXRvcnwobXVsdGkpPyhzZXR8bWFwKXxiaXRzZXR8dT8oaW50fGZsb2F0KVxcZCopLzt2YXIgQz1cInN0clwiO3ZhciB6PVwia3dkXCI7dmFyIGo9XCJjb21cIjt2YXIgTz1cInR5cFwiO3ZhciBHPVwibGl0XCI7dmFyIEw9XCJwdW5cIjt2YXIgRj1cInBsblwiO3ZhciBtPVwidGFnXCI7dmFyIEU9XCJkZWNcIjt2YXIgSj1cInNyY1wiO3ZhciBQPVwiYXRuXCI7dmFyIG49XCJhdHZcIjt2YXIgTj1cIm5vY29kZVwiO3ZhciBNPVwiKD86Xl5cXFxcLj98WystXXxcXFxcIXxcXFxcIT18XFxcXCE9PXxcXFxcI3xcXFxcJXxcXFxcJT18JnwmJnwmJj18Jj18XFxcXCh8XFxcXCp8XFxcXCo9fFxcXFwrPXxcXFxcLHxcXFxcLT18XFxcXC0+fFxcXFwvfFxcXFwvPXw6fDo6fFxcXFw7fDx8PDx8PDw9fDw9fD18PT18PT09fD58Pj18Pj58Pj49fD4+Pnw+Pj49fFxcXFw/fFxcXFxAfFxcXFxbfFxcXFxefFxcXFxePXxcXFxcXlxcXFxefFxcXFxeXFxcXF49fFxcXFx7fFxcXFx8fFxcXFx8PXxcXFxcfFxcXFx8fFxcXFx8XFxcXHw9fFxcXFx+fGJyZWFrfGNhc2V8Y29udGludWV8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mKVxcXFxzKlwiO2Z1bmN0aW9uIGsoWil7dmFyIGFkPTA7dmFyIFM9ZmFsc2U7dmFyIGFjPWZhbHNlO2Zvcih2YXIgVj0wLFU9Wi5sZW5ndGg7VjxVOysrVil7dmFyIGFlPVpbVl07aWYoYWUuaWdub3JlQ2FzZSl7YWM9dHJ1ZX1lbHNle2lmKC9bYS16XS9pLnRlc3QoYWUuc291cmNlLnJlcGxhY2UoL1xcXFx1WzAtOWEtZl17NH18XFxcXHhbMC05YS1mXXsyfXxcXFxcW151eF0vZ2ksXCJcIikpKXtTPXRydWU7YWM9ZmFsc2U7YnJlYWt9fX12YXIgWT17Yjo4LHQ6OSxuOjEwLHY6MTEsZjoxMixyOjEzfTtmdW5jdGlvbiBhYihhaCl7dmFyIGFnPWFoLmNoYXJDb2RlQXQoMCk7aWYoYWchPT05Mil7cmV0dXJuIGFnfXZhciBhZj1haC5jaGFyQXQoMSk7YWc9WVthZl07aWYoYWcpe3JldHVybiBhZ31lbHNle2lmKFwiMFwiPD1hZiYmYWY8PVwiN1wiKXtyZXR1cm4gcGFyc2VJbnQoYWguc3Vic3RyaW5nKDEpLDgpfWVsc2V7aWYoYWY9PT1cInVcInx8YWY9PT1cInhcIil7cmV0dXJuIHBhcnNlSW50KGFoLnN1YnN0cmluZygyKSwxNil9ZWxzZXtyZXR1cm4gYWguY2hhckNvZGVBdCgxKX19fX1mdW5jdGlvbiBUKGFmKXtpZihhZjwzMil7cmV0dXJuKGFmPDE2P1wiXFxcXHgwXCI6XCJcXFxceFwiKSthZi50b1N0cmluZygxNil9dmFyIGFnPVN0cmluZy5mcm9tQ2hhckNvZGUoYWYpO2lmKGFnPT09XCJcXFxcXCJ8fGFnPT09XCItXCJ8fGFnPT09XCJbXCJ8fGFnPT09XCJdXCIpe2FnPVwiXFxcXFwiK2FnfXJldHVybiBhZ31mdW5jdGlvbiBYKGFtKXt2YXIgYXE9YW0uc3Vic3RyaW5nKDEsYW0ubGVuZ3RoLTEpLm1hdGNoKG5ldyBSZWdFeHAoXCJcXFxcXFxcXHVbMC05QS1GYS1mXXs0fXxcXFxcXFxcXHhbMC05QS1GYS1mXXsyfXxcXFxcXFxcXFswLTNdWzAtN117MCwyfXxcXFxcXFxcXFswLTddezEsMn18XFxcXFxcXFxbXFxcXHNcXFxcU118LXxbXi1cXFxcXFxcXF1cIixcImdcIikpO3ZhciBhaz1bXTt2YXIgYWY9W107dmFyIGFvPWFxWzBdPT09XCJeXCI7Zm9yKHZhciBhcj1hbz8xOjAsYWo9YXEubGVuZ3RoO2FyPGFqOysrYXIpe3ZhciBhaD1hcVthcl07aWYoL1xcXFxbYmRzd10vaS50ZXN0KGFoKSl7YWsucHVzaChhaCl9ZWxzZXt2YXIgYWc9YWIoYWgpO3ZhciBhbDtpZihhcisyPGFqJiZcIi1cIj09PWFxW2FyKzFdKXthbD1hYihhcVthcisyXSk7YXIrPTJ9ZWxzZXthbD1hZ31hZi5wdXNoKFthZyxhbF0pO2lmKCEoYWw8NjV8fGFnPjEyMikpe2lmKCEoYWw8NjV8fGFnPjkwKSl7YWYucHVzaChbTWF0aC5tYXgoNjUsYWcpfDMyLE1hdGgubWluKGFsLDkwKXwzMl0pfWlmKCEoYWw8OTd8fGFnPjEyMikpe2FmLnB1c2goW01hdGgubWF4KDk3LGFnKSZ+MzIsTWF0aC5taW4oYWwsMTIyKSZ+MzJdKX19fX1hZi5zb3J0KGZ1bmN0aW9uKGF2LGF1KXtyZXR1cm4oYXZbMF0tYXVbMF0pfHwoYXVbMV0tYXZbMV0pfSk7dmFyIGFpPVtdO3ZhciBhcD1bTmFOLE5hTl07Zm9yKHZhciBhcj0wO2FyPGFmLmxlbmd0aDsrK2FyKXt2YXIgYXQ9YWZbYXJdO2lmKGF0WzBdPD1hcFsxXSsxKXthcFsxXT1NYXRoLm1heChhcFsxXSxhdFsxXSl9ZWxzZXthaS5wdXNoKGFwPWF0KX19dmFyIGFuPVtcIltcIl07aWYoYW8pe2FuLnB1c2goXCJeXCIpfWFuLnB1c2guYXBwbHkoYW4sYWspO2Zvcih2YXIgYXI9MDthcjxhaS5sZW5ndGg7Kythcil7dmFyIGF0PWFpW2FyXTthbi5wdXNoKFQoYXRbMF0pKTtpZihhdFsxXT5hdFswXSl7aWYoYXRbMV0rMT5hdFswXSl7YW4ucHVzaChcIi1cIil9YW4ucHVzaChUKGF0WzFdKSl9fWFuLnB1c2goXCJdXCIpO3JldHVybiBhbi5qb2luKFwiXCIpfWZ1bmN0aW9uIFcoYWwpe3ZhciBhaj1hbC5zb3VyY2UubWF0Y2gobmV3IFJlZ0V4cChcIig/OlxcXFxbKD86W15cXFxceDVDXFxcXHg1RF18XFxcXFxcXFxbXFxcXHNcXFxcU10pKlxcXFxdfFxcXFxcXFxcdVtBLUZhLWYwLTldezR9fFxcXFxcXFxceFtBLUZhLWYwLTldezJ9fFxcXFxcXFxcWzAtOV0rfFxcXFxcXFxcW151eDAtOV18XFxcXChcXFxcP1s6IT1dfFtcXFxcKFxcXFwpXFxcXF5dfFteXFxcXHg1QlxcXFx4NUNcXFxcKFxcXFwpXFxcXF5dKylcIixcImdcIikpO3ZhciBhaD1hai5sZW5ndGg7dmFyIGFuPVtdO2Zvcih2YXIgYWs9MCxhbT0wO2FrPGFoOysrYWspe3ZhciBhZz1haltha107aWYoYWc9PT1cIihcIil7KythbX1lbHNle2lmKFwiXFxcXFwiPT09YWcuY2hhckF0KDApKXt2YXIgYWY9K2FnLnN1YnN0cmluZygxKTtpZihhZiYmYWY8PWFtKXthblthZl09LTF9fX19Zm9yKHZhciBhaz0xO2FrPGFuLmxlbmd0aDsrK2FrKXtpZigtMT09PWFuW2FrXSl7YW5bYWtdPSsrYWR9fWZvcih2YXIgYWs9MCxhbT0wO2FrPGFoOysrYWspe3ZhciBhZz1haltha107aWYoYWc9PT1cIihcIil7KythbTtpZihhblthbV09PT11bmRlZmluZWQpe2FqW2FrXT1cIig/OlwifX1lbHNle2lmKFwiXFxcXFwiPT09YWcuY2hhckF0KDApKXt2YXIgYWY9K2FnLnN1YnN0cmluZygxKTtpZihhZiYmYWY8PWFtKXthaltha109XCJcXFxcXCIrYW5bYW1dfX19fWZvcih2YXIgYWs9MCxhbT0wO2FrPGFoOysrYWspe2lmKFwiXlwiPT09YWpbYWtdJiZcIl5cIiE9PWFqW2FrKzFdKXthaltha109XCJcIn19aWYoYWwuaWdub3JlQ2FzZSYmUyl7Zm9yKHZhciBhaz0wO2FrPGFoOysrYWspe3ZhciBhZz1haltha107dmFyIGFpPWFnLmNoYXJBdCgwKTtpZihhZy5sZW5ndGg+PTImJmFpPT09XCJbXCIpe2FqW2FrXT1YKGFnKX1lbHNle2lmKGFpIT09XCJcXFxcXCIpe2FqW2FrXT1hZy5yZXBsYWNlKC9bYS16QS1aXS9nLGZ1bmN0aW9uKGFvKXt2YXIgYXA9YW8uY2hhckNvZGVBdCgwKTtyZXR1cm5cIltcIitTdHJpbmcuZnJvbUNoYXJDb2RlKGFwJn4zMixhcHwzMikrXCJdXCJ9KX19fX1yZXR1cm4gYWouam9pbihcIlwiKX12YXIgYWE9W107Zm9yKHZhciBWPTAsVT1aLmxlbmd0aDtWPFU7KytWKXt2YXIgYWU9WltWXTtpZihhZS5nbG9iYWx8fGFlLm11bHRpbGluZSl7dGhyb3cgbmV3IEVycm9yKFwiXCIrYWUpfWFhLnB1c2goXCIoPzpcIitXKGFlKStcIilcIil9cmV0dXJuIG5ldyBSZWdFeHAoYWEuam9pbihcInxcIiksYWM/XCJnaVwiOlwiZ1wiKX1mdW5jdGlvbiBhKFYpe3ZhciBVPS8oPzpefFxccylub2NvZGUoPzpcXHN8JCkvO3ZhciBYPVtdO3ZhciBUPTA7dmFyIFo9W107dmFyIFc9MDt2YXIgUztpZihWLmN1cnJlbnRTdHlsZSl7Uz1WLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlfWVsc2V7aWYod2luZG93LmdldENvbXB1dGVkU3R5bGUpe1M9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShWLG51bGwpLmdldFByb3BlcnR5VmFsdWUoXCJ3aGl0ZS1zcGFjZVwiKX19dmFyIFk9UyYmXCJwcmVcIj09PVMuc3Vic3RyaW5nKDAsMyk7ZnVuY3Rpb24gYWEoYWIpe3N3aXRjaChhYi5ub2RlVHlwZSl7Y2FzZSAxOmlmKFUudGVzdChhYi5jbGFzc05hbWUpKXtyZXR1cm59Zm9yKHZhciBhZT1hYi5maXJzdENoaWxkO2FlO2FlPWFlLm5leHRTaWJsaW5nKXthYShhZSl9dmFyIGFkPWFiLm5vZGVOYW1lO2lmKFwiQlJcIj09PWFkfHxcIkxJXCI9PT1hZCl7WFtXXT1cIlxcblwiO1pbVzw8MV09VCsrO1pbKFcrKzw8MSl8MV09YWJ9YnJlYWs7Y2FzZSAzOmNhc2UgNDp2YXIgYWM9YWIubm9kZVZhbHVlO2lmKGFjLmxlbmd0aCl7aWYoIVkpe2FjPWFjLnJlcGxhY2UoL1sgXFx0XFxyXFxuXSsvZyxcIiBcIil9ZWxzZXthYz1hYy5yZXBsYWNlKC9cXHJcXG4/L2csXCJcXG5cIil9WFtXXT1hYztaW1c8PDFdPVQ7VCs9YWMubGVuZ3RoO1pbKFcrKzw8MSl8MV09YWJ9YnJlYWt9fWFhKFYpO3JldHVybntzb3VyY2VDb2RlOlguam9pbihcIlwiKS5yZXBsYWNlKC9cXG4kLyxcIlwiKSxzcGFuczpafX1mdW5jdGlvbiBCKFMsVSxXLFQpe2lmKCFVKXtyZXR1cm59dmFyIFY9e3NvdXJjZUNvZGU6VSxiYXNlUG9zOlN9O1coVik7VC5wdXNoLmFwcGx5KFQsVi5kZWNvcmF0aW9ucyl9dmFyIHY9L1xcUy87ZnVuY3Rpb24gbyhTKXt2YXIgVj11bmRlZmluZWQ7Zm9yKHZhciBVPVMuZmlyc3RDaGlsZDtVO1U9VS5uZXh0U2libGluZyl7dmFyIFQ9VS5ub2RlVHlwZTtWPShUPT09MSk/KFY/UzpVKTooVD09PTMpPyh2LnRlc3QoVS5ub2RlVmFsdWUpP1M6Vik6Vn1yZXR1cm4gVj09PVM/dW5kZWZpbmVkOlZ9ZnVuY3Rpb24gZyhVLFQpe3ZhciBTPXt9O3ZhciBWOyhmdW5jdGlvbigpe3ZhciBhZD1VLmNvbmNhdChUKTt2YXIgYWg9W107dmFyIGFnPXt9O2Zvcih2YXIgYWI9MCxaPWFkLmxlbmd0aDthYjxaOysrYWIpe3ZhciBZPWFkW2FiXTt2YXIgYWM9WVszXTtpZihhYyl7Zm9yKHZhciBhZT1hYy5sZW5ndGg7LS1hZT49MDspe1NbYWMuY2hhckF0KGFlKV09WX19dmFyIGFmPVlbMV07dmFyIGFhPVwiXCIrYWY7aWYoIWFnLmhhc093blByb3BlcnR5KGFhKSl7YWgucHVzaChhZik7YWdbYWFdPW51bGx9fWFoLnB1c2goL1tcXDAtXFx1ZmZmZl0vKTtWPWsoYWgpfSkoKTt2YXIgWD1ULmxlbmd0aDt2YXIgVz1mdW5jdGlvbihhaCl7dmFyIFo9YWguc291cmNlQ29kZSxZPWFoLmJhc2VQb3M7dmFyIGFkPVtZLEZdO3ZhciBhZj0wO3ZhciBhbj1aLm1hdGNoKFYpfHxbXTt2YXIgYWo9e307Zm9yKHZhciBhZT0wLGFxPWFuLmxlbmd0aDthZTxhcTsrK2FlKXt2YXIgYWc9YW5bYWVdO3ZhciBhcD1halthZ107dmFyIGFpPXZvaWQgMDt2YXIgYW07aWYodHlwZW9mIGFwPT09XCJzdHJpbmdcIil7YW09ZmFsc2V9ZWxzZXt2YXIgYWE9U1thZy5jaGFyQXQoMCldO2lmKGFhKXthaT1hZy5tYXRjaChhYVsxXSk7YXA9YWFbMF19ZWxzZXtmb3IodmFyIGFvPTA7YW88WDsrK2FvKXthYT1UW2FvXTthaT1hZy5tYXRjaChhYVsxXSk7aWYoYWkpe2FwPWFhWzBdO2JyZWFrfX1pZighYWkpe2FwPUZ9fWFtPWFwLmxlbmd0aD49NSYmXCJsYW5nLVwiPT09YXAuc3Vic3RyaW5nKDAsNSk7aWYoYW0mJiEoYWkmJnR5cGVvZiBhaVsxXT09PVwic3RyaW5nXCIpKXthbT1mYWxzZTthcD1KfWlmKCFhbSl7YWpbYWddPWFwfX12YXIgYWI9YWY7YWYrPWFnLmxlbmd0aDtpZighYW0pe2FkLnB1c2goWSthYixhcCl9ZWxzZXt2YXIgYWw9YWlbMV07dmFyIGFrPWFnLmluZGV4T2YoYWwpO3ZhciBhYz1haythbC5sZW5ndGg7aWYoYWlbMl0pe2FjPWFnLmxlbmd0aC1haVsyXS5sZW5ndGg7YWs9YWMtYWwubGVuZ3RofXZhciBhcj1hcC5zdWJzdHJpbmcoNSk7QihZK2FiLGFnLnN1YnN0cmluZygwLGFrKSxXLGFkKTtCKFkrYWIrYWssYWwscShhcixhbCksYWQpO0IoWSthYithYyxhZy5zdWJzdHJpbmcoYWMpLFcsYWQpfX1haC5kZWNvcmF0aW9ucz1hZH07cmV0dXJuIFd9ZnVuY3Rpb24gaShUKXt2YXIgVz1bXSxTPVtdO2lmKFQudHJpcGxlUXVvdGVkU3RyaW5ncyl7Vy5wdXNoKFtDLC9eKD86XFwnXFwnXFwnKD86W15cXCdcXFxcXXxcXFxcW1xcc1xcU118XFwnezEsMn0oPz1bXlxcJ10pKSooPzpcXCdcXCdcXCd8JCl8XFxcIlxcXCJcXFwiKD86W15cXFwiXFxcXF18XFxcXFtcXHNcXFNdfFxcXCJ7MSwyfSg/PVteXFxcIl0pKSooPzpcXFwiXFxcIlxcXCJ8JCl8XFwnKD86W15cXFxcXFwnXXxcXFxcW1xcc1xcU10pKig/OlxcJ3wkKXxcXFwiKD86W15cXFxcXFxcIl18XFxcXFtcXHNcXFNdKSooPzpcXFwifCQpKS8sbnVsbCxcIidcXFwiXCJdKX1lbHNle2lmKFQubXVsdGlMaW5lU3RyaW5ncyl7Vy5wdXNoKFtDLC9eKD86XFwnKD86W15cXFxcXFwnXXxcXFxcW1xcc1xcU10pKig/OlxcJ3wkKXxcXFwiKD86W15cXFxcXFxcIl18XFxcXFtcXHNcXFNdKSooPzpcXFwifCQpfFxcYCg/OlteXFxcXFxcYF18XFxcXFtcXHNcXFNdKSooPzpcXGB8JCkpLyxudWxsLFwiJ1xcXCJgXCJdKX1lbHNle1cucHVzaChbQywvXig/OlxcJyg/OlteXFxcXFxcJ1xcclxcbl18XFxcXC4pKig/OlxcJ3wkKXxcXFwiKD86W15cXFxcXFxcIlxcclxcbl18XFxcXC4pKig/OlxcXCJ8JCkpLyxudWxsLFwiXFxcIidcIl0pfX1pZihULnZlcmJhdGltU3RyaW5ncyl7Uy5wdXNoKFtDLC9eQFxcXCIoPzpbXlxcXCJdfFxcXCJcXFwiKSooPzpcXFwifCQpLyxudWxsXSl9dmFyIFk9VC5oYXNoQ29tbWVudHM7aWYoWSl7aWYoVC5jU3R5bGVDb21tZW50cyl7aWYoWT4xKXtXLnB1c2goW2osL14jKD86IyMoPzpbXiNdfCMoPyEjIykpKig/OiMjI3wkKXwuKikvLG51bGwsXCIjXCJdKX1lbHNle1cucHVzaChbaiwvXiMoPzooPzpkZWZpbmV8ZWxpZnxlbHNlfGVuZGlmfGVycm9yfGlmZGVmfGluY2x1ZGV8aWZuZGVmfGxpbmV8cHJhZ21hfHVuZGVmfHdhcm5pbmcpXFxifFteXFxyXFxuXSopLyxudWxsLFwiI1wiXSl9Uy5wdXNoKFtDLC9ePCg/Oig/Oig/OlxcLlxcLlxcLykqfFxcLz8pKD86W1xcdy1dKyg/OlxcL1tcXHctXSspKyk/W1xcdy1dK1xcLmh8W2Etel1cXHcqKT4vLG51bGxdKX1lbHNle1cucHVzaChbaiwvXiNbXlxcclxcbl0qLyxudWxsLFwiI1wiXSl9fWlmKFQuY1N0eWxlQ29tbWVudHMpe1MucHVzaChbaiwvXlxcL1xcL1teXFxyXFxuXSovLG51bGxdKTtTLnB1c2goW2osL15cXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxudWxsXSl9aWYoVC5yZWdleExpdGVyYWxzKXt2YXIgWD0oXCIvKD89W14vKl0pKD86W14vXFxcXHg1QlxcXFx4NUNdfFxcXFx4NUNbXFxcXHNcXFxcU118XFxcXHg1Qig/OlteXFxcXHg1Q1xcXFx4NURdfFxcXFx4NUNbXFxcXHNcXFxcU10pKig/OlxcXFx4NUR8JCkpKy9cIik7Uy5wdXNoKFtcImxhbmctcmVnZXhcIixuZXcgUmVnRXhwKFwiXlwiK00rXCIoXCIrWCtcIilcIildKX12YXIgVj1ULnR5cGVzO2lmKFYpe1MucHVzaChbTyxWXSl9dmFyIFU9KFwiXCIrVC5rZXl3b3JkcykucmVwbGFjZSgvXiB8ICQvZyxcIlwiKTtpZihVLmxlbmd0aCl7Uy5wdXNoKFt6LG5ldyBSZWdFeHAoXCJeKD86XCIrVS5yZXBsYWNlKC9bXFxzLF0rL2csXCJ8XCIpK1wiKVxcXFxiXCIpLG51bGxdKX1XLnB1c2goW0YsL15cXHMrLyxudWxsLFwiIFxcclxcblxcdFxceEEwXCJdKTtTLnB1c2goW0csL15AW2Etel8kXVthLXpfJEAwLTldKi9pLG51bGxdLFtPLC9eKD86W0BfXT9bQS1aXStbYS16XVtBLVphLXpfJEAwLTldKnxcXHcrX3RcXGIpLyxudWxsXSxbRiwvXlthLXpfJF1bYS16XyRAMC05XSovaSxudWxsXSxbRyxuZXcgUmVnRXhwKFwiXig/OjB4W2EtZjAtOV0rfCg/OlxcXFxkKD86X1xcXFxkKykqXFxcXGQqKD86XFxcXC5cXFxcZCopP3xcXFxcLlxcXFxkXFxcXCspKD86ZVsrXFxcXC1dP1xcXFxkKyk/KVthLXpdKlwiLFwiaVwiKSxudWxsLFwiMDEyMzQ1Njc4OVwiXSxbRiwvXlxcXFxbXFxzXFxTXT8vLG51bGxdLFtMLC9eLlteXFxzXFx3XFwuJEBcXCdcXFwiXFxgXFwvXFwjXFxcXF0qLyxudWxsXSk7cmV0dXJuIGcoVyxTKX12YXIgSz1pKHtrZXl3b3JkczpBLGhhc2hDb21tZW50czp0cnVlLGNTdHlsZUNvbW1lbnRzOnRydWUsbXVsdGlMaW5lU3RyaW5nczp0cnVlLHJlZ2V4TGl0ZXJhbHM6dHJ1ZX0pO2Z1bmN0aW9uIFEoVixhZyl7dmFyIFU9Lyg/Ol58XFxzKW5vY29kZSg/Olxcc3wkKS87dmFyIGFiPS9cXHJcXG4/fFxcbi87dmFyIGFjPVYub3duZXJEb2N1bWVudDt2YXIgUztpZihWLmN1cnJlbnRTdHlsZSl7Uz1WLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlfWVsc2V7aWYod2luZG93LmdldENvbXB1dGVkU3R5bGUpe1M9YWMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShWLG51bGwpLmdldFByb3BlcnR5VmFsdWUoXCJ3aGl0ZS1zcGFjZVwiKX19dmFyIFo9UyYmXCJwcmVcIj09PVMuc3Vic3RyaW5nKDAsMyk7dmFyIGFmPWFjLmNyZWF0ZUVsZW1lbnQoXCJMSVwiKTt3aGlsZShWLmZpcnN0Q2hpbGQpe2FmLmFwcGVuZENoaWxkKFYuZmlyc3RDaGlsZCl9dmFyIFc9W2FmXTtmdW5jdGlvbiBhZShhbCl7c3dpdGNoKGFsLm5vZGVUeXBlKXtjYXNlIDE6aWYoVS50ZXN0KGFsLmNsYXNzTmFtZSkpe2JyZWFrfWlmKFwiQlJcIj09PWFsLm5vZGVOYW1lKXthZChhbCk7aWYoYWwucGFyZW50Tm9kZSl7YWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhbCl9fWVsc2V7Zm9yKHZhciBhbj1hbC5maXJzdENoaWxkO2FuO2FuPWFuLm5leHRTaWJsaW5nKXthZShhbil9fWJyZWFrO2Nhc2UgMzpjYXNlIDQ6aWYoWil7dmFyIGFtPWFsLm5vZGVWYWx1ZTt2YXIgYWo9YW0ubWF0Y2goYWIpO2lmKGFqKXt2YXIgYWk9YW0uc3Vic3RyaW5nKDAsYWouaW5kZXgpO2FsLm5vZGVWYWx1ZT1haTt2YXIgYWg9YW0uc3Vic3RyaW5nKGFqLmluZGV4K2FqWzBdLmxlbmd0aCk7aWYoYWgpe3ZhciBhaz1hbC5wYXJlbnROb2RlO2FrLmluc2VydEJlZm9yZShhYy5jcmVhdGVUZXh0Tm9kZShhaCksYWwubmV4dFNpYmxpbmcpfWFkKGFsKTtpZighYWkpe2FsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYWwpfX19YnJlYWt9fWZ1bmN0aW9uIGFkKGFrKXt3aGlsZSghYWsubmV4dFNpYmxpbmcpe2FrPWFrLnBhcmVudE5vZGU7aWYoIWFrKXtyZXR1cm59fWZ1bmN0aW9uIGFpKGFsLGFyKXt2YXIgYXE9YXI/YWwuY2xvbmVOb2RlKGZhbHNlKTphbDt2YXIgYW89YWwucGFyZW50Tm9kZTtpZihhbyl7dmFyIGFwPWFpKGFvLDEpO3ZhciBhbj1hbC5uZXh0U2libGluZzthcC5hcHBlbmRDaGlsZChhcSk7Zm9yKHZhciBhbT1hbjthbTthbT1hbil7YW49YW0ubmV4dFNpYmxpbmc7YXAuYXBwZW5kQ2hpbGQoYW0pfX1yZXR1cm4gYXF9dmFyIGFoPWFpKGFrLm5leHRTaWJsaW5nLDApO2Zvcih2YXIgYWo7KGFqPWFoLnBhcmVudE5vZGUpJiZhai5ub2RlVHlwZT09PTE7KXthaD1han1XLnB1c2goYWgpfWZvcih2YXIgWT0wO1k8Vy5sZW5ndGg7KytZKXthZShXW1ldKX1pZihhZz09PShhZ3wwKSl7V1swXS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLGFnKX12YXIgYWE9YWMuY3JlYXRlRWxlbWVudChcIk9MXCIpO2FhLmNsYXNzTmFtZT1cImxpbmVudW1zXCI7dmFyIFg9TWF0aC5tYXgoMCwoKGFnLTEpKXwwKXx8MDtmb3IodmFyIFk9MCxUPVcubGVuZ3RoO1k8VDsrK1kpe2FmPVdbWV07YWYuY2xhc3NOYW1lPVwiTFwiKygoWStYKSUxMCk7aWYoIWFmLmZpcnN0Q2hpbGQpe2FmLmFwcGVuZENoaWxkKGFjLmNyZWF0ZVRleHROb2RlKFwiXFx4QTBcIikpfWFhLmFwcGVuZENoaWxkKGFmKX1WLmFwcGVuZENoaWxkKGFhKX1mdW5jdGlvbiBEKGFjKXt2YXIgYWo9L1xcYk1TSUVcXGIvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dmFyIGFtPS9cXG4vZzt2YXIgYWw9YWMuc291cmNlQ29kZTt2YXIgYW49YWwubGVuZ3RoO3ZhciBWPTA7dmFyIGFhPWFjLnNwYW5zO3ZhciBUPWFhLmxlbmd0aDt2YXIgYWg9MDt2YXIgWD1hYy5kZWNvcmF0aW9uczt2YXIgWT1YLmxlbmd0aDt2YXIgWj0wO1hbWV09YW47dmFyIGFyLGFxO2ZvcihhcT1hcj0wO2FxPFk7KXtpZihYW2FxXSE9PVhbYXErMl0pe1hbYXIrK109WFthcSsrXTtYW2FyKytdPVhbYXErK119ZWxzZXthcSs9Mn19WT1hcjtmb3IoYXE9YXI9MDthcTxZOyl7dmFyIGF0PVhbYXFdO3ZhciBhYj1YW2FxKzFdO3ZhciBXPWFxKzI7d2hpbGUoVysyPD1ZJiZYW1crMV09PT1hYil7Vys9Mn1YW2FyKytdPWF0O1hbYXIrK109YWI7YXE9V31ZPVgubGVuZ3RoPWFyO3ZhciBhZT1udWxsO3doaWxlKGFoPFQpe3ZhciBhZj1hYVthaF07dmFyIFM9YWFbYWgrMl18fGFuO3ZhciBhZz1YW1pdO3ZhciBhcD1YW1orMl18fGFuO3ZhciBXPU1hdGgubWluKFMsYXApO3ZhciBhaz1hYVthaCsxXTt2YXIgVTtpZihhay5ub2RlVHlwZSE9PTEmJihVPWFsLnN1YnN0cmluZyhWLFcpKSl7aWYoYWope1U9VS5yZXBsYWNlKGFtLFwiXFxyXCIpfWFrLm5vZGVWYWx1ZT1VO3ZhciBhaT1hay5vd25lckRvY3VtZW50O3ZhciBhbz1haS5jcmVhdGVFbGVtZW50KFwiU1BBTlwiKTthby5jbGFzc05hbWU9WFtaKzFdO3ZhciBhZD1hay5wYXJlbnROb2RlO2FkLnJlcGxhY2VDaGlsZChhbyxhayk7YW8uYXBwZW5kQ2hpbGQoYWspO2lmKFY8Uyl7YWFbYWgrMV09YWs9YWkuY3JlYXRlVGV4dE5vZGUoYWwuc3Vic3RyaW5nKFcsUykpO2FkLmluc2VydEJlZm9yZShhayxhby5uZXh0U2libGluZyl9fVY9VztpZihWPj1TKXthaCs9Mn1pZihWPj1hcCl7Wis9Mn19fXZhciB0PXt9O2Z1bmN0aW9uIGMoVSxWKXtmb3IodmFyIFM9Vi5sZW5ndGg7LS1TPj0wOyl7dmFyIFQ9VltTXTtpZighdC5oYXNPd25Qcm9wZXJ0eShUKSl7dFtUXT1VfWVsc2V7aWYod2luZG93LmNvbnNvbGUpe2NvbnNvbGUud2FybihcImNhbm5vdCBvdmVycmlkZSBsYW5ndWFnZSBoYW5kbGVyICVzXCIsVCl9fX19ZnVuY3Rpb24gcShULFMpe2lmKCEoVCYmdC5oYXNPd25Qcm9wZXJ0eShUKSkpe1Q9L15cXHMqPC8udGVzdChTKT9cImRlZmF1bHQtbWFya3VwXCI6XCJkZWZhdWx0LWNvZGVcIn1yZXR1cm4gdFtUXX1jKEssW1wiZGVmYXVsdC1jb2RlXCJdKTtjKGcoW10sW1tGLC9eW148P10rL10sW0UsL148IVxcd1tePl0qKD86PnwkKS9dLFtqLC9ePFxcIS0tW1xcc1xcU10qPyg/Oi1cXC0+fCQpL10sW1wibGFuZy1cIiwvXjxcXD8oW1xcc1xcU10rPykoPzpcXD8+fCQpL10sW1wibGFuZy1cIiwvXjwlKFtcXHNcXFNdKz8pKD86JT58JCkvXSxbTCwvXig/OjxbJT9dfFslP10+KS9dLFtcImxhbmctXCIsL148eG1wXFxiW14+XSo+KFtcXHNcXFNdKz8pPFxcL3htcFxcYltePl0qPi9pXSxbXCJsYW5nLWpzXCIsL148c2NyaXB0XFxiW14+XSo+KFtcXHNcXFNdKj8pKDxcXC9zY3JpcHRcXGJbXj5dKj4pL2ldLFtcImxhbmctY3NzXCIsL148c3R5bGVcXGJbXj5dKj4oW1xcc1xcU10qPykoPFxcL3N0eWxlXFxiW14+XSo+KS9pXSxbXCJsYW5nLWluLnRhZ1wiLC9eKDxcXC8/W2Etel1bXjw+XSo+KS9pXV0pLFtcImRlZmF1bHQtbWFya3VwXCIsXCJodG1cIixcImh0bWxcIixcIm14bWxcIixcInhodG1sXCIsXCJ4bWxcIixcInhzbFwiXSk7YyhnKFtbRiwvXltcXHNdKy8sbnVsbCxcIiBcXHRcXHJcXG5cIl0sW24sL14oPzpcXFwiW15cXFwiXSpcXFwiP3xcXCdbXlxcJ10qXFwnPykvLG51bGwsXCJcXFwiJ1wiXV0sW1ttLC9eXjxcXC8/W2Etel0oPzpbXFx3LjotXSpcXHcpP3xcXC8/PiQvaV0sW1AsL14oPyFzdHlsZVtcXHM9XXxvbilbYS16XSg/OltcXHc6LV0qXFx3KT8vaV0sW1wibGFuZy11cS52YWxcIiwvXj1cXHMqKFtePlxcJ1xcXCJcXHNdKig/OltePlxcJ1xcXCJcXHNcXC9dfFxcLyg/PVxccykpKS9dLFtMLC9eWz08PlxcL10rL10sW1wibGFuZy1qc1wiLC9eb25cXHcrXFxzKj1cXHMqXFxcIihbXlxcXCJdKylcXFwiL2ldLFtcImxhbmctanNcIiwvXm9uXFx3K1xccyo9XFxzKlxcJyhbXlxcJ10rKVxcJy9pXSxbXCJsYW5nLWpzXCIsL15vblxcdytcXHMqPVxccyooW15cXFwiXFwnPlxcc10rKS9pXSxbXCJsYW5nLWNzc1wiLC9ec3R5bGVcXHMqPVxccypcXFwiKFteXFxcIl0rKVxcXCIvaV0sW1wibGFuZy1jc3NcIiwvXnN0eWxlXFxzKj1cXHMqXFwnKFteXFwnXSspXFwnL2ldLFtcImxhbmctY3NzXCIsL15zdHlsZVxccyo9XFxzKihbXlxcXCJcXCc+XFxzXSspL2ldXSksW1wiaW4udGFnXCJdKTtjKGcoW10sW1tuLC9eW1xcc1xcU10rL11dKSxbXCJ1cS52YWxcIl0pO2MoaSh7a2V5d29yZHM6bCxoYXNoQ29tbWVudHM6dHJ1ZSxjU3R5bGVDb21tZW50czp0cnVlLHR5cGVzOmV9KSxbXCJjXCIsXCJjY1wiLFwiY3BwXCIsXCJjeHhcIixcImN5Y1wiLFwibVwiXSk7YyhpKHtrZXl3b3JkczpcIm51bGwsdHJ1ZSxmYWxzZVwifSksW1wianNvblwiXSk7YyhpKHtrZXl3b3JkczpSLGhhc2hDb21tZW50czp0cnVlLGNTdHlsZUNvbW1lbnRzOnRydWUsdmVyYmF0aW1TdHJpbmdzOnRydWUsdHlwZXM6ZX0pLFtcImNzXCJdKTtjKGkoe2tleXdvcmRzOngsY1N0eWxlQ29tbWVudHM6dHJ1ZX0pLFtcImphdmFcIl0pO2MoaSh7a2V5d29yZHM6SCxoYXNoQ29tbWVudHM6dHJ1ZSxtdWx0aUxpbmVTdHJpbmdzOnRydWV9KSxbXCJic2hcIixcImNzaFwiLFwic2hcIl0pO2MoaSh7a2V5d29yZHM6SSxoYXNoQ29tbWVudHM6dHJ1ZSxtdWx0aUxpbmVTdHJpbmdzOnRydWUsdHJpcGxlUXVvdGVkU3RyaW5nczp0cnVlfSksW1wiY3ZcIixcInB5XCJdKTtjKGkoe2tleXdvcmRzOnMsaGFzaENvbW1lbnRzOnRydWUsbXVsdGlMaW5lU3RyaW5nczp0cnVlLHJlZ2V4TGl0ZXJhbHM6dHJ1ZX0pLFtcInBlcmxcIixcInBsXCIsXCJwbVwiXSk7YyhpKHtrZXl3b3JkczpmLGhhc2hDb21tZW50czp0cnVlLG11bHRpTGluZVN0cmluZ3M6dHJ1ZSxyZWdleExpdGVyYWxzOnRydWV9KSxbXCJyYlwiXSk7YyhpKHtrZXl3b3Jkczp3LGNTdHlsZUNvbW1lbnRzOnRydWUscmVnZXhMaXRlcmFsczp0cnVlfSksW1wianNcIl0pO2MoaSh7a2V5d29yZHM6cixoYXNoQ29tbWVudHM6MyxjU3R5bGVDb21tZW50czp0cnVlLG11bHRpbGluZVN0cmluZ3M6dHJ1ZSx0cmlwbGVRdW90ZWRTdHJpbmdzOnRydWUscmVnZXhMaXRlcmFsczp0cnVlfSksW1wiY29mZmVlXCJdKTtjKGcoW10sW1tDLC9eW1xcc1xcU10rL11dKSxbXCJyZWdleFwiXSk7ZnVuY3Rpb24gZChWKXt2YXIgVT1WLmxhbmdFeHRlbnNpb247dHJ5e3ZhciBTPWEoVi5zb3VyY2VOb2RlKTt2YXIgVD1TLnNvdXJjZUNvZGU7Vi5zb3VyY2VDb2RlPVQ7Vi5zcGFucz1TLnNwYW5zO1YuYmFzZVBvcz0wO3EoVSxUKShWKTtEKFYpfWNhdGNoKFcpe2lmKFwiY29uc29sZVwiIGluIHdpbmRvdyl7Y29uc29sZS5sb2coVyYmVy5zdGFjaz9XLnN0YWNrOlcpfX19ZnVuY3Rpb24geShXLFYsVSl7dmFyIFM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIlBSRVwiKTtTLmlubmVySFRNTD1XO2lmKFUpe1EoUyxVKX12YXIgVD17bGFuZ0V4dGVuc2lvbjpWLG51bWJlckxpbmVzOlUsc291cmNlTm9kZTpTfTtkKFQpO3JldHVybiBTLmlubmVySFRNTH1mdW5jdGlvbiBiKGFkKXtmdW5jdGlvbiBZKGFmKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYWYpfXZhciBhYz1bWShcInByZVwiKSxZKFwiY29kZVwiKSxZKFwieG1wXCIpXTt2YXIgVD1bXTtmb3IodmFyIGFhPTA7YWE8YWMubGVuZ3RoOysrYWEpe2Zvcih2YXIgWj0wLFY9YWNbYWFdLmxlbmd0aDtaPFY7KytaKXtULnB1c2goYWNbYWFdW1pdKX19YWM9bnVsbDt2YXIgVz1EYXRlO2lmKCFXLm5vdyl7Vz17bm93OmZ1bmN0aW9uKCl7cmV0dXJuICsobmV3IERhdGUpfX19dmFyIFg9MDt2YXIgUzt2YXIgYWI9L1xcYmxhbmcoPzp1YWdlKT8tKFtcXHcuXSspKD8hXFxTKS87dmFyIGFlPS9cXGJwcmV0dHlwcmludFxcYi87ZnVuY3Rpb24gVSgpe3ZhciBhZz0od2luZG93LlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OP1cubm93KCkrMjUwOkluZmluaXR5KTtmb3IoO1g8VC5sZW5ndGgmJlcubm93KCk8YWc7WCsrKXt2YXIgYWo9VFtYXTt2YXIgYWk9YWouY2xhc3NOYW1lO2lmKGFpLmluZGV4T2YoXCJwcmV0dHlwcmludFwiKT49MCl7dmFyIGFoPWFpLm1hdGNoKGFiKTt2YXIgYW07aWYoIWFoJiYoYW09byhhaikpJiZcIkNPREVcIj09PWFtLnRhZ05hbWUpe2FoPWFtLmNsYXNzTmFtZS5tYXRjaChhYil9aWYoYWgpe2FoPWFoWzFdfXZhciBhbD1mYWxzZTtmb3IodmFyIGFrPWFqLnBhcmVudE5vZGU7YWs7YWs9YWsucGFyZW50Tm9kZSl7aWYoKGFrLnRhZ05hbWU9PT1cInByZVwifHxhay50YWdOYW1lPT09XCJjb2RlXCJ8fGFrLnRhZ05hbWU9PT1cInhtcFwiKSYmYWsuY2xhc3NOYW1lJiZhay5jbGFzc05hbWUuaW5kZXhPZihcInByZXR0eXByaW50XCIpPj0wKXthbD10cnVlO2JyZWFrfX1pZighYWwpe3ZhciBhZj1hai5jbGFzc05hbWUubWF0Y2goL1xcYmxpbmVudW1zXFxiKD86OihcXGQrKSk/Lyk7YWY9YWY/YWZbMV0mJmFmWzFdLmxlbmd0aD8rYWZbMV06dHJ1ZTpmYWxzZTtpZihhZil7UShhaixhZil9Uz17bGFuZ0V4dGVuc2lvbjphaCxzb3VyY2VOb2RlOmFqLG51bWJlckxpbmVzOmFmfTtkKFMpfX19aWYoWDxULmxlbmd0aCl7c2V0VGltZW91dChVLDI1MCl9ZWxzZXtpZihhZCl7YWQoKX19fVUoKX13aW5kb3cucHJldHR5UHJpbnRPbmU9eTt3aW5kb3cucHJldHR5UHJpbnQ9Yjt3aW5kb3cuUFI9e2NyZWF0ZVNpbXBsZUxleGVyOmcscmVnaXN0ZXJMYW5nSGFuZGxlcjpjLHNvdXJjZURlY29yYXRvcjppLFBSX0FUVFJJQl9OQU1FOlAsUFJfQVRUUklCX1ZBTFVFOm4sUFJfQ09NTUVOVDpqLFBSX0RFQ0xBUkFUSU9OOkUsUFJfS0VZV09SRDp6LFBSX0xJVEVSQUw6RyxQUl9OT0NPREU6TixQUl9QTEFJTjpGLFBSX1BVTkNUVUFUSU9OOkwsUFJfU09VUkNFOkosUFJfU1RSSU5HOkMsUFJfVEFHOm0sUFJfVFlQRTpPfX0pKCk7UFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbXSxbW1BSLlBSX0RFQ0xBUkFUSU9OLC9ePCFcXHdbXj5dKig/Oj58JCkvXSxbUFIuUFJfQ09NTUVOVCwvXjxcXCEtLVtcXHNcXFNdKj8oPzotXFwtPnwkKS9dLFtQUi5QUl9QVU5DVFVBVElPTiwvXig/OjxbJT9dfFslP10+KS9dLFtcImxhbmctXCIsL148XFw/KFtcXHNcXFNdKz8pKD86XFw/PnwkKS9dLFtcImxhbmctXCIsL148JShbXFxzXFxTXSs/KSg/OiU+fCQpL10sW1wibGFuZy1cIiwvXjx4bXBcXGJbXj5dKj4oW1xcc1xcU10rPyk8XFwveG1wXFxiW14+XSo+L2ldLFtcImxhbmctaGFuZGxlYmFyc1wiLC9ePHNjcmlwdFxcYltePl0qdHlwZVxccyo9XFxzKlsnXCJdP3RleHRcXC94LWhhbmRsZWJhcnMtdGVtcGxhdGVbJ1wiXT9cXGJbXj5dKj4oW1xcc1xcU10qPykoPFxcL3NjcmlwdFxcYltePl0qPikvaV0sW1wibGFuZy1qc1wiLC9ePHNjcmlwdFxcYltePl0qPihbXFxzXFxTXSo/KSg8XFwvc2NyaXB0XFxiW14+XSo+KS9pXSxbXCJsYW5nLWNzc1wiLC9ePHN0eWxlXFxiW14+XSo+KFtcXHNcXFNdKj8pKDxcXC9zdHlsZVxcYltePl0qPikvaV0sW1wibGFuZy1pbi50YWdcIiwvXig8XFwvP1thLXpdW148Pl0qPikvaV0sW1BSLlBSX0RFQ0xBUkFUSU9OLC9ee3tbI14+L10/XFxzKltcXHcuXVtefV0qfX0vXSxbUFIuUFJfREVDTEFSQVRJT04sL157eyY/XFxzKltcXHcuXVtefV0qfX0vXSxbUFIuUFJfREVDTEFSQVRJT04sL157e3s+P1xccypbXFx3Ll1bXn1dKn19fS9dLFtQUi5QUl9DT01NRU5ULC9ee3shW159XSp9fS9dXSksW1wiaGFuZGxlYmFyc1wiLFwiaGJzXCJdKTtQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbUFIuUFJfUExBSU4sL15bIFxcdFxcclxcblxcZl0rLyxudWxsLFwiIFxcdFxcclxcblxcZlwiXV0sW1tQUi5QUl9TVFJJTkcsL15cXFwiKD86W15cXG5cXHJcXGZcXFxcXFxcIl18XFxcXCg/Olxcclxcbj98XFxufFxcZil8XFxcXFtcXHNcXFNdKSpcXFwiLyxudWxsXSxbUFIuUFJfU1RSSU5HLC9eXFwnKD86W15cXG5cXHJcXGZcXFxcXFwnXXxcXFxcKD86XFxyXFxuP3xcXG58XFxmKXxcXFxcW1xcc1xcU10pKlxcJy8sbnVsbF0sW1wibGFuZy1jc3Mtc3RyXCIsL151cmxcXCgoW15cXClcXFwiXFwnXSopXFwpL2ldLFtQUi5QUl9LRVlXT1JELC9eKD86dXJsfHJnYnxcXCFpbXBvcnRhbnR8QGltcG9ydHxAcGFnZXxAbWVkaWF8QGNoYXJzZXR8aW5oZXJpdCkoPz1bXlxcLVxcd118JCkvaSxudWxsXSxbXCJsYW5nLWNzcy1rd1wiLC9eKC0/KD86W19hLXpdfCg/OlxcXFxbMC05YS1mXSsgPykpKD86W19hLXowLTlcXC1dfFxcXFwoPzpcXFxcWzAtOWEtZl0rID8pKSopXFxzKjovaV0sW1BSLlBSX0NPTU1FTlQsL15cXC9cXCpbXipdKlxcKisoPzpbXlxcLypdW14qXSpcXCorKSpcXC8vXSxbUFIuUFJfQ09NTUVOVCwvXig/OjwhLS18LS0+KS9dLFtQUi5QUl9MSVRFUkFMLC9eKD86XFxkK3xcXGQqXFwuXFxkKykoPzolfFthLXpdKyk/L2ldLFtQUi5QUl9MSVRFUkFMLC9eIyg/OlswLTlhLWZdezN9KXsxLDJ9L2ldLFtQUi5QUl9QTEFJTiwvXi0/KD86W19hLXpdfCg/OlxcXFxbXFxkYS1mXSsgPykpKD86W19hLXpcXGRcXC1dfFxcXFwoPzpcXFxcW1xcZGEtZl0rID8pKSovaV0sW1BSLlBSX1BVTkNUVUFUSU9OLC9eW15cXHNcXHdcXCdcXFwiXSsvXV0pLFtcImNzc1wiXSk7UFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbXSxbW1BSLlBSX0tFWVdPUkQsL14tPyg/OltfYS16XXwoPzpcXFxcW1xcZGEtZl0rID8pKSg/OltfYS16XFxkXFwtXXxcXFxcKD86XFxcXFtcXGRhLWZdKyA/KSkqL2ldXSksW1wiY3NzLWt3XCJdKTtQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtdLFtbUFIuUFJfU1RSSU5HLC9eW15cXClcXFwiXFwnXSsvXV0pLFtcImNzcy1zdHJcIl0pO1xuIl19 \ No newline at end of file diff --git a/dist/coverage/lcov-report/sorter.d.ts b/dist/coverage/lcov-report/sorter.d.ts deleted file mode 100644 index a49797a2..00000000 --- a/dist/coverage/lcov-report/sorter.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare function addSorting(): void; diff --git a/dist/coverage/lcov-report/sorter.js b/dist/coverage/lcov-report/sorter.js deleted file mode 100644 index e6ceb032..00000000 --- a/dist/coverage/lcov-report/sorter.js +++ /dev/null @@ -1,129 +0,0 @@ -"use strict"; -var addSorting = (function () { - "use strict"; - var cols, currentSort = { - index: 0, - desc: false - }; - // returns the summary table element - function getTable() { return document.querySelector('.coverage-summary'); } - // returns the thead element of the summary table - function getTableHeader() { return getTable().querySelector('thead tr'); } - // returns the tbody element of the summary table - function getTableBody() { return getTable().querySelector('tbody'); } - // returns the th element for nth column - function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; } - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), colNode, cols = [], col, i; - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), colNode, col, data = {}, i, val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), i; - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, finalSorter = sorter, tableBody = document.querySelector('.coverage-summary tbody'), rowNodes = tableBody.querySelectorAll('tr'), rows = [], i; - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - rows.sort(finalSorter); - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), cls = col.className; - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, el, ithSorter = function ithSorter(i) { - var col = cols[i]; - return function () { - var desc = col.defaultDescSort; - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } - else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(cols); - addSortIndicators(); - enableUI(); - }; -})(); -window.addEventListener('load', addSorting); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY292ZXJhZ2UvbGNvdi1yZXBvcnQvc29ydGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFJLFVBQVUsR0FBRyxDQUFDO0lBQ2QsWUFBWSxDQUFDO0lBQ2IsSUFBSSxJQUFJLEVBQ0osV0FBVyxHQUFHO1FBQ1YsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLEVBQUUsS0FBSztLQUNkLENBQUM7SUFFTixvQ0FBb0M7SUFDcEMsU0FBUyxRQUFRLEtBQUssT0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLGlEQUFpRDtJQUNqRCxTQUFTLGNBQWMsS0FBSyxPQUFPLFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsaURBQWlEO0lBQ2pELFNBQVMsWUFBWSxLQUFLLE9BQU8sUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSx3Q0FBd0M7SUFDeEMsU0FBUyxZQUFZLENBQUMsQ0FBQyxJQUFJLE9BQU8sY0FBYyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9FLG9CQUFvQjtJQUNwQixTQUFTLFdBQVc7UUFDaEIsSUFBSSxRQUFRLEdBQUcsY0FBYyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQ2xELE9BQU8sRUFDUCxJQUFJLEdBQUcsRUFBRSxFQUNULEdBQUcsRUFDSCxDQUFDLENBQUM7UUFFTixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQyxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcs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SjtJQUNMLENBQUM7SUFDRCx1Q0FBdUM7SUFDdkMsT0FBTztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNiLE9BQU87U0FDVjtRQUNELElBQUksR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUNyQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZixpQkFBaUIsRUFBRSxDQUFDO1FBQ3BCLFFBQVEsRUFBRSxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYWRkU29ydGluZyA9IChmdW5jdGlvbiAoKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgdmFyIGNvbHMsXG4gICAgICAgIGN1cnJlbnRTb3J0ID0ge1xuICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICBkZXNjOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgLy8gcmV0dXJucyB0aGUgc3VtbWFyeSB0YWJsZSBlbGVtZW50XG4gICAgZnVuY3Rpb24gZ2V0VGFibGUoKSB7IHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY292ZXJhZ2Utc3VtbWFyeScpOyB9XG4gICAgLy8gcmV0dXJucyB0aGUgdGhlYWQgZWxlbWVudCBvZiB0aGUgc3VtbWFyeSB0YWJsZVxuICAgIGZ1bmN0aW9uIGdldFRhYmxlSGVhZGVyKCkgeyByZXR1cm4gZ2V0VGFibGUoKS5xdWVyeVNlbGVjdG9yKCd0aGVhZCB0cicpOyB9XG4gICAgLy8gcmV0dXJucyB0aGUgdGJvZHkgZWxlbWVudCBvZiB0aGUgc3VtbWFyeSB0YWJsZVxuICAgIGZ1bmN0aW9uIGdldFRhYmxlQm9keSgpIHsgcmV0dXJuIGdldFRhYmxlKCkucXVlcnlTZWxlY3RvcigndGJvZHknKTsgfVxuICAgIC8vIHJldHVybnMgdGhlIHRoIGVsZW1lbnQgZm9yIG50aCBjb2x1bW5cbiAgICBmdW5jdGlvbiBnZXROdGhDb2x1bW4obikgeyByZXR1cm4gZ2V0VGFibGVIZWFkZXIoKS5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpW25dOyB9XG5cbiAgICAvLyBsb2FkcyBhbGwgY29sdW1uc1xuICAgIGZ1bmN0aW9uIGxvYWRDb2x1bW5zKCkge1xuICAgICAgICB2YXIgY29sTm9kZXMgPSBnZXRUYWJsZUhlYWRlcigpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJyksXG4gICAgICAgICAgICBjb2xOb2RlLFxuICAgICAgICAgICAgY29scyA9IFtdLFxuICAgICAgICAgICAgY29sLFxuICAgICAgICAgICAgaTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sTm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbE5vZGUgPSBjb2xOb2Rlc1tpXTtcbiAgICAgICAgICAgIGNvbCA9IHtcbiAgICAgICAgICAgICAgICBrZXk6IGNvbE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbCcpLFxuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiAhY29sTm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbm9zb3J0JyksXG4gICAgICAgICAgICAgICAgdHlwZTogY29sTm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpIHx8ICdzdHJpbmcnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29scy5wdXNoKGNvbCk7XG4gICAgICAgICAgICBpZiAoY29sLnNvcnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29sLmRlZmF1bHREZXNjU29ydCA9IGNvbC50eXBlID09PSAnbnVtYmVyJztcbiAgICAgICAgICAgICAgICBjb2xOb2RlLmlubmVySFRNTCA9IGNvbE5vZGUuaW5uZXJIVE1MICsgJzxzcGFuIGNsYXNzPVwic29ydGVyXCI+PC9zcGFuPic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuICAgIC8vIGF0dGFjaGVzIGEgZGF0YSBhdHRyaWJ1dGUgdG8gZXZlcnkgdHIgZWxlbWVudCB3aXRoIGFuIG9iamVjdFxuICAgIC8vIG9mIGRhdGEgdmFsdWVzIGtleWVkIGJ5IGNvbHVtbiBuYW1lXG4gICAgZnVuY3Rpb24gbG9hZFJvd0RhdGEodGFibGVSb3cpIHtcbiAgICAgICAgdmFyIHRhYmxlQ29scyA9IHRhYmxlUm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyksXG4gICAgICAgICAgICBjb2xOb2RlLFxuICAgICAgICAgICAgY29sLFxuICAgICAgICAgICAgZGF0YSA9IHt9LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHZhbDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlQ29scy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29sTm9kZSA9IHRhYmxlQ29sc1tpXTtcbiAgICAgICAgICAgIGNvbCA9IGNvbHNbaV07XG4gICAgICAgICAgICB2YWwgPSBjb2xOb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpO1xuICAgICAgICAgICAgaWYgKGNvbC50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHZhbCA9IE51bWJlcih2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YVtjb2wua2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgLy8gbG9hZHMgYWxsIHJvdyBkYXRhXG4gICAgZnVuY3Rpb24gbG9hZERhdGEoKSB7XG4gICAgICAgIHZhciByb3dzID0gZ2V0VGFibGVCb2R5KCkucXVlcnlTZWxlY3RvckFsbCgndHInKSxcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHJvd3NbaV0uZGF0YSA9IGxvYWRSb3dEYXRhKHJvd3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHNvcnRzIHRoZSB0YWJsZSB1c2luZyB0aGUgZGF0YSBmb3IgdGhlIGl0aCBjb2x1bW5cbiAgICBmdW5jdGlvbiBzb3J0QnlJbmRleChpbmRleCwgZGVzYykge1xuICAgICAgICB2YXIga2V5ID0gY29sc1tpbmRleF0ua2V5LFxuICAgICAgICAgICAgc29ydGVyID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBhID0gYS5kYXRhW2tleV07XG4gICAgICAgICAgICAgICAgYiA9IGIuZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaW5hbFNvcnRlciA9IHNvcnRlcixcbiAgICAgICAgICAgIHRhYmxlQm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb3ZlcmFnZS1zdW1tYXJ5IHRib2R5JyksXG4gICAgICAgICAgICByb3dOb2RlcyA9IHRhYmxlQm9keS5xdWVyeVNlbGVjdG9yQWxsKCd0cicpLFxuICAgICAgICAgICAgcm93cyA9IFtdLFxuICAgICAgICAgICAgaTtcblxuICAgICAgICBpZiAoZGVzYykge1xuICAgICAgICAgICAgZmluYWxTb3J0ZXIgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMSAqIHNvcnRlcihhLCBiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Tm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaChyb3dOb2Rlc1tpXSk7XG4gICAgICAgICAgICB0YWJsZUJvZHkucmVtb3ZlQ2hpbGQocm93Tm9kZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93cy5zb3J0KGZpbmFsU29ydGVyKTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKHJvd3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHJlbW92ZXMgc29ydCBpbmRpY2F0b3JzIGZvciBjdXJyZW50IGNvbHVtbiBiZWluZyBzb3J0ZWRcbiAgICBmdW5jdGlvbiByZW1vdmVTb3J0SW5kaWNhdG9ycygpIHtcbiAgICAgICAgdmFyIGNvbCA9IGdldE50aENvbHVtbihjdXJyZW50U29ydC5pbmRleCksXG4gICAgICAgICAgICBjbHMgPSBjb2wuY2xhc3NOYW1lO1xuXG4gICAgICAgIGNscyA9IGNscy5yZXBsYWNlKC8gc29ydGVkJC8sICcnKS5yZXBsYWNlKC8gc29ydGVkLWRlc2MkLywgJycpO1xuICAgICAgICBjb2wuY2xhc3NOYW1lID0gY2xzO1xuICAgIH1cbiAgICAvLyBhZGRzIHNvcnQgaW5kaWNhdG9ycyBmb3IgY3VycmVudCBjb2x1bW4gYmVpbmcgc29ydGVkXG4gICAgZnVuY3Rpb24gYWRkU29ydEluZGljYXRvcnMoKSB7XG4gICAgICAgIGdldE50aENvbHVtbihjdXJyZW50U29ydC5pbmRleCkuY2xhc3NOYW1lICs9IGN1cnJlbnRTb3J0LmRlc2MgPyAnIHNvcnRlZC1kZXNjJyA6ICcgc29ydGVkJztcbiAgICB9XG4gICAgLy8gYWRkcyBldmVudCBsaXN0ZW5lcnMgZm9yIGFsbCBzb3J0ZXIgd2lkZ2V0c1xuICAgIGZ1bmN0aW9uIGVuYWJsZVVJKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgaXRoU29ydGVyID0gZnVuY3Rpb24gaXRoU29ydGVyKGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sID0gY29sc1tpXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXNjID0gY29sLmRlZmF1bHREZXNjU29ydDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNvcnQuaW5kZXggPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAhY3VycmVudFNvcnQuZGVzYztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzb3J0QnlJbmRleChpLCBkZXNjKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU29ydEluZGljYXRvcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNvcnQuaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U29ydC5kZXNjID0gZGVzYztcbiAgICAgICAgICAgICAgICAgICAgYWRkU29ydEluZGljYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgZm9yIChpID0wIDsgaSA8IGNvbHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChjb2xzW2ldLnNvcnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBjbGljayBldmVudCBoYW5kbGVyIG9uIHRoZSB0aCBzbyB1c2Vyc1xuICAgICAgICAgICAgICAgIC8vIGRvbnQgaGF2ZSB0byBjbGljayBvbiB0aG9zZSB0aW55IGFycm93c1xuICAgICAgICAgICAgICAgIGVsID0gZ2V0TnRoQ29sdW1uKGkpLnF1ZXJ5U2VsZWN0b3IoJy5zb3J0ZXInKS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaXRoU29ydGVyKGkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbC5hdHRhY2hFdmVudCgnb25jbGljaycsIGl0aFNvcnRlcihpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFkZHMgc29ydGluZyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBVSVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZ2V0VGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbHMgPSBsb2FkQ29sdW1ucygpO1xuICAgICAgICBsb2FkRGF0YShjb2xzKTtcbiAgICAgICAgYWRkU29ydEluZGljYXRvcnMoKTtcbiAgICAgICAgZW5hYmxlVUkoKTtcbiAgICB9O1xufSkoKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBhZGRTb3J0aW5nKTtcbiJdfQ== \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 327d4da6..0267bd8d 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.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 fa43ca9c..1807521b 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuMjYuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuZXhwb3J0ICogZnJvbSBcIi4vYXBpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XG5cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuMzEuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuZXhwb3J0ICogZnJvbSBcIi4vYXBpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XG5cbiJdfQ== \ No newline at end of file diff --git a/index.ts b/index.ts index 81a7ab7b..67dea3a6 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.26.1 + * The version of the OpenAPI document: 2020-09-14_1.31.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/package-lock.json b/package-lock.json index 6bfbfd2f..77690c4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "plaid", - "version": "9.1.0", + "version": "9.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0e52c8f2..0ec077b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plaid", - "version": "9.1.0", + "version": "9.2.0", "description": "A node.js client for the Plaid API", "keywords": [ "plaid", @@ -10,6 +10,9 @@ "type": "git", "url": "git@github.com:plaid/plaid-node.git" }, + "engines": { + "node": ">=10.0.0" + }, "bugs": { "url": "https://github.com/plaid/plaid-node/issues" },