@cybrid/cybrid-api-id-angular 0.123.437 → 0.123.438

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +2 -2
  2. package/esm2020/api/bankApplications.service.mjs +2 -2
  3. package/esm2020/api/customerTokens.service.mjs +2 -2
  4. package/esm2020/api/organizationApplications.service.mjs +2 -2
  5. package/esm2020/api/users.service.mjs +2 -2
  6. package/esm2020/model/application.mjs +2 -2
  7. package/esm2020/model/applicationList.mjs +1 -1
  8. package/esm2020/model/applicationWithSecret.mjs +1 -1
  9. package/esm2020/model/applicationWithSecretAllOf.mjs +2 -2
  10. package/esm2020/model/customerToken.mjs +2 -2
  11. package/esm2020/model/errorResponse.mjs +2 -2
  12. package/esm2020/model/postBankApplication.mjs +2 -2
  13. package/esm2020/model/postCustomerToken.mjs +2 -2
  14. package/esm2020/model/postOrganizationApplication.mjs +2 -2
  15. package/esm2020/model/postUser.mjs +2 -2
  16. package/esm2020/model/user.mjs +2 -2
  17. package/esm2020/model/userList.mjs +1 -1
  18. package/fesm2015/cybrid-cybrid-api-id-angular.mjs +7 -7
  19. package/fesm2015/cybrid-cybrid-api-id-angular.mjs.map +1 -1
  20. package/fesm2020/cybrid-cybrid-api-id-angular.mjs +13 -13
  21. package/fesm2020/cybrid-cybrid-api-id-angular.mjs.map +1 -1
  22. package/model/application.d.ts +1 -1
  23. package/model/applicationList.d.ts +1 -1
  24. package/model/applicationWithSecretAllOf.d.ts +1 -1
  25. package/model/customerToken.d.ts +1 -1
  26. package/model/errorResponse.d.ts +1 -1
  27. package/model/postBankApplication.d.ts +1 -1
  28. package/model/postCustomerToken.d.ts +1 -1
  29. package/model/postOrganizationApplication.d.ts +1 -1
  30. package/model/postUser.d.ts +1 -1
  31. package/model/user.d.ts +1 -1
  32. package/model/userList.d.ts +1 -1
  33. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
  * Cybrid Identity API
3
3
  * # Cybrid API documentation Welcome to Cybrid, an all-in-one crypto platform that enables you to easily **build** and **launch** white-label crypto products or services. In these documents, you\'ll find details on how our REST API operates and generally how our platform functions. If you\'re looking for our UI SDK Widgets for Web or Mobile (iOS/Android), generated API clients, or demo applications, head over to our [Github repo](https://github.com/Cybrid-app). 💡 We recommend bookmarking the [Cybrid LinkTree](https://linktr.ee/cybridtechnologies) which contains many helpful links to platform resources. ## Getting Started This is Cybrid\'s public interactive API documentation, which allows you to fully test our APIs. If you\'d like to use a different tool to exercise our APIs, you can download the [Open API 3.0 yaml](https://bank.production.cybrid.app/api/schema/v1/swagger.yaml) for import. If you\'re new to our APIs and the Cybrid Platform, follow the below guides to get set up and familiar with the platform: 1. [Introduction](https://docs.cybrid.xyz/docs/introduction) 2. [Platform Introduction](https://docs.cybrid.xyz/docs/how-is-cybrid-architected) 3. [Testing with Hosted Web Demo App](https://docs.cybrid.xyz/docs/testing-with-hosted-web-demo-app) In [Getting Started in the Cybrid Sandbox](https://docs.cybrid.xyz/docs/how-do-i-get-started-with-the-sandbox), we walk you through how to use the [Cybrid Sandbox](https://id.sandbox.cybrid.app/) to create a test bank and generate API keys. In [Getting Ready for Trading](https://kb.cybrid.xyz/getting-ready-for-trading), we walk through creating customers, customer identities, accounts, as well as executing quotes and trades. ## Working with the Cybrid Platform There are three primary ways you can interact with the Cybrid platform: 1. Directly via our RESTful API (this documentation) 2. Using our API clients available in a variety of languages ([Angular](https://github.com/Cybrid-app/cybrid-api-bank-angular), [Java](https://github.com/Cybrid-app/cybrid-api-bank-java), [Kotlin](https://github.com/Cybrid-app/cybrid-api-bank-kotlin), [Python](https://github.com/Cybrid-app/cybrid-api-bank-python), [Ruby](https://github.com/Cybrid-app/cybrid-api-bank-ruby), [Swift](https://github.com/Cybrid-app/cybrid-api-bank-swift) or [Typescript](https://github.com/Cybrid-app/cybrid-api-bank-typescript)) 3. Integrating a platform specific SDK ([Web](https://github.com/Cybrid-app/cybrid-sdk-web), [Android](https://github.com/Cybrid-app/cybrid-sdk-android), [iOS](https://github.com/Cybrid-app/cybrid-sdk-ios)) Our complete set of APIs allows you to manage resources across three distinct areas: your `Organization`, your `Banks` and your `Identities`. For most of your testing and interaction you\'ll be using the `Bank` API, which is where the majority of APIs reside. *The complete set of APIs can be found on the following pages:* | API | Description | |------------------------------------------------------------------|-------------------------------------------------------------| | [Organization API](https://organization.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organizations | | [Bank API](https://bank.production.cybrid.app/api/schema/swagger-ui) | APIs to manage banks (and all downstream customer activity) | | [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organization and bank identities | For questions please contact [Support](mailto:support@cybrid.xyz) at any time for assistance, or contact the [Product Team](mailto:product@cybrid.xyz) for product suggestions. ## Authenticating with the API The Cybrid Platform uses OAuth 2.0 Bearer Tokens to authenticate requests to the platform. Credentials to create `Organization` and `Bank` tokens can be generated via the [Cybrid Sandbox](https://id.production.cybrid.app). Access tokens can be generated for a `Customer` as well via the [Cybrid IdP](https://id.production.cybrid.app) as well. An `Organization` access token applies broadly to the whole Organization and all of its `Banks`, whereas, a `Bank` access token is specific to an individual Bank. `Customer` tokens, similarly, are scoped to a specific customer in a bank. Both `Organization` and `Bank` tokens can be created using the OAuth Client Credential Grant flow. Each Organization and Bank has its own unique `Client ID` and `Secret` that allows for machine-to-machine authentication. A `Bank` can then generate `Customer` access tokens via API using our [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui). <font color=\"orange\">**⚠️ Never share your Client ID or Secret publicly or in your source code repository.**</font> Your `Client ID` and `Secret` can be exchanged for a time-limited `Bearer Token` by interacting with the Cybrid Identity Provider or through interacting with the **Authorize** button in this document. The following curl command can be used to quickly generate a `Bearer Token` for use in testing the API or demo applications. ``` # Example request when using Bank credentials curl -X POST https://id.production.cybrid.app/oauth/token -d \'{ \"grant_type\": \"client_credentials\", \"client_id\": \"<Your Client ID>\", \"client_secret\": \"<Your Secret>\", \"scope\": \"banks:read banks:write bank_applications:execute accounts:read accounts:execute counterparties:read counterparties:write counterparties:execute customers:read customers:write customers:execute prices:read quotes:execute quotes:read trades:execute trades:read transfers:execute transfers:read transfers:write external_bank_accounts:read external_bank_accounts:write external_bank_accounts:execute external_wallets:read external_wallets:execute workflows:read workflows:execute deposit_addresses:read deposit_addresses:execute deposit_bank_accounts:read deposit_bank_accounts:execute invoices:read invoices:write invoices:execute identity_verifications:read identity_verifications:write identity_verifications:execute files:read files:execute\" }\' -H \"Content-Type: application/json\" # When using Organization credentials set `scope` to \'organizations:read organizations:write organization_applications:execute banks:read banks:write banks:execute bank_applications:execute users:read users:execute counterparties:read customers:read accounts:read prices:read quotes:execute quotes:read trades:execute trades:read transfers:read transfers:write transfers:execute external_bank_accounts:read external_wallets:read workflows:read deposit_addresses:read deposit_bank_accounts:read invoices:read subscriptions:read subscriptions:write subscriptions:execute subscription_events:read subscription_events:execute identity_verifications:read files:read files:execute\' ``` <font color=\"orange\">**⚠️ Note: The above curl will create a bearer token with full scope access. Delete scopes if you\'d like to restrict access.**</font> ## Authentication Scopes The Cybrid platform supports the use of scopes to control the level of access a token is limited to. Scopes do not grant access to resources; instead, they provide limits, in support of the least privilege principal. The following scopes are available on the platform and can be requested when generating either an Organization, Bank or Customer token. Generally speaking, the _Read_ scope is required to read and list resources, the _Write_ scope is required to update a resource and the _Execute_ scope is required to create a resource. | Resource | Read scope (Token Type) | Write scope (Token Type) | Execute scope (Token Type) | |-----------------------|------------------------------------------------------------|-----------------------------------------------|--------------------------------------------------| | Account | accounts:read (Organization, Bank, Customer) | | accounts:execute (Bank, Customer) | | Bank | banks:read (Organization, Bank) | banks:write (Organization, Bank) | banks:execute (Organization) | | Customer | customers:read (Organization, Bank, Customer) | customers:write (Bank, Customer) | customers:execute (Bank) | | Counterparty | counterparties:read (Organization, Bank, Customer) | counterparties:write (Bank, Customer) | counterparties:execute (Bank) | | Deposit Address | deposit_addresses:read (Organization, Bank, Customer) | deposit_addresses:write (Bank, Customer) | deposit_addresses:execute (Bank, Customer) | | External Bank Account | external_bank_accounts:read (Organization, Bank, Customer) | external_bank_accounts:write (Bank, Customer) | external_bank_accounts:execute (Bank, Customer) | | External Wallet | external_wallet:read (Organization, Bank, Customer) | | external_wallet:execute (Bank, Customer) | | Organization | organizations:read (Organization) | organizations:write (Organization) | | | User | users:read (Organization) | | users:execute (Organization) | | Price | prices:read (Bank, Customer) | | | | Quote | quotes:read (Organization, Bank, Customer) | | quotes:execute (Organization, Bank, Customer) | | Trade | trades:read (Organization, Bank, Customer) | | trades:execute (Organization, Bank, Customer) | | Transfer | transfers:read (Organization, Bank, Customer) | | transfers:execute (Organization, Bank, Customer) | | Workflow | workflows:read (Organization, Bank, Customer) | | workflows:execute (Bank, Customer) | | Invoice | invoices:read (Organization, Bank, Customer) | invoices:write (Bank, Customer) | invoices:execute (Bank, Customer) | ## Available Endpoints The available APIs for the [Identity](https://id.production.cybrid.app/api/schema/swagger-ui), [Organization](https://organization.production.cybrid.app/api/schema/swagger-ui) and [Bank](https://bank.production.cybrid.app/api/schema/swagger-ui) API services are listed below: | API Service | Model | API Endpoint Path | Description | |--------------|----------------------|--------------------------------|---------------------------------------------------------------------------------------------------| | Identity | Bank | /api/bank_applications | Create and list banks | | Identity | CustomerToken | /api/customer_tokens | Create customer JWT access tokens | | Identity | Organization | /api/organization_applications | Create and list organizations | | Identity | Organization | /api/users | Create and list organization users | | Organization | Organization | /api/organizations | APIs to retrieve and update organization name | | Bank | Account | /api/accounts | Create and list accounts, which hold a specific asset for a customers | | Bank | Asset | /api/assets | Get a list of assets supported by the platform (ex: BTC, ETH) | | Bank | Bank | /api/banks | Create, update and list banks, the parent to customers, accounts, etc | | Bank | Customer | /api/customers | Create and list customers | | Bank | Counterparty | /api/counterparties | Create and list counterparties | | Bank | DepositAddress | /api/deposit_addresses | Create, get and list deposit addresses | | Bank | ExternalBankAccount | /api/external_bank_accounts | Create, get and list external bank accounts, which connect customer bank accounts to the platform | | Bank | ExternalWallet | /api/external_wallets | Create, get, list and delete external wallets, which connect customer wallets to the platform | | Bank | IdentityVerification | /api/identity_verifications | Create and list identity verifications, which are performed on customers for KYC | | Bank | Invoice | /api/invoices | Create, get, cancel and list invoices | | Bank | PaymentInstruction | /api/payment_instructions | Create, get and list payment instructions for invoices | | Bank | Price | /api/prices | Get the current prices for assets on the platform | | Bank | Quote | /api/quotes | Create and list quotes, which are required to execute trades | | Bank | Symbol | /api/symbols | Get a list of symbols supported for trade (ex: BTC-USD) | | Bank | Trade | /api/trades | Create and list trades, which buy or sell cryptocurrency | | Bank | Transfer | /api/transfers | Create, get and list transfers (e.g., funding, book) | | Bank | Workflow | /api/workflows | Create, get and list workflows | ## Understanding Object Models & Endpoints **Organizations** An `Organization` is meant to represent the organization partnering with Cybrid to use our platform. An `Organization` typically does not directly interact with `customers`. Instead, an Organization has one or more `banks`, which encompass the financial service offerings of the platform. **Banks** A `Bank` is owned by an `Organization` and can be thought of as an environment or container for `customers` and product offerings. Banks are created in either `Sandbox` or `Production` mode, where `Sandbox` is the environment that you would test, prototype and build in prior to moving to `Production`. An `Organization` can have multiple `banks`, in either `Sandbox` or `Production` environments. A `Sandbox Bank` will be backed by stubbed data and process flows. For instance, funding source transfer processes as well as trades will be simulated rather than performed, however asset prices are representative of real-world values. You have an unlimited amount of simulated fiat currency for testing purposes. **Customers** `Customers` represent your banking users on the platform. At present, we offer support for `Individuals` as Customers. `Customers` must be verified (i.e., KYC\'d) in our system before they can play any part on the platform, which means they must have an associated and a passing `Identity Verification`. See the Identity Verifications section for more details on how a customer can be verified. `Customers` must also have an `Account` to be able to transact, in the desired asset class. See the Accounts APIs for more details on setting up accounts for the customer.
4
4
  *
5
- * The version of the OpenAPI document: v0.123.437
5
+ * The version of the OpenAPI document: v0.123.438
6
6
  * Contact: support@cybrid.app
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -313,4 +313,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
313
313
  }] }, { type: i2.Configuration, decorators: [{
314
314
  type: Optional
315
315
  }] }]; } });
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS91c2Vycy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQVkvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLFlBQVk7SUFPckIsWUFBc0IsVUFBc0IsRUFBZ0MsUUFBZ0IsRUFBYyxhQUE0QjtRQUFoSCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBTGxDLGFBQVEsR0FBRywrQkFBK0IsQ0FBQztRQUM5QyxtQkFBYyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBSXZDLElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7U0FDdEM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ2pELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO2dCQUM5QixRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEs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RUFDbkY7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsWUFBWSxFQUFPLGFBQWE7WUFDaEMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtZQUNuRCxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDOzswR0ExV1EsWUFBWSw0Q0FPNEMsU0FBUzs4R0FQakUsWUFBWSxjQUZYLE1BQU07NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFrRCxRQUFROzswQkFBRyxNQUFNOzJCQUFDLFNBQVM7OzBCQUFxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDeWJyaWQgSWRlbnRpdHkgQVBJXG4gKiAjIEN5YnJpZCBBUEkgZG9jdW1lbnRhdGlvbiAgV2VsY29tZSB0byBDeWJyaWQsIGFuIGFsbC1pbi1vbmUgY3J5cHRvIHBsYXRmb3JtIHRoYXQgZW5hYmxlcyB5b3UgdG8gZWFzaWx5ICoqYnVpbGQqKiBhbmQgKipsYXVuY2gqKiB3aGl0ZS1sYWJlbCBjcnlwdG8gcHJvZHVjdHMgb3Igc2VydmljZXMuICBJbiB0aGVzZSBkb2N1bWVudHMsIHlvdVxcJ2xsIGZpbmQgZGV0YWlscyBvbiBob3cgb3VyIFJFU1QgQVBJIG9wZXJhdGVzIGFuZCBnZW5lcmFsbHkgaG93IG91ciBwbGF0Zm9ybSBmdW5jdGlvbnMuICBJZiB5b3VcXCdyZSBsb29raW5nIGZvciBvdXIgVUkgU0RLIFdpZGdldHMgZm9yIFdlYiBvciBNb2JpbGUgKGlPUy9BbmRyb2lkKSwgZ2VuZXJhdGVkIEFQSSBjbGllbnRzLCBvciBkZW1vIGFwcGxpY2F0aW9ucywgaGVhZCBvdmVyIHRvIG91ciBbR2l0aHViIHJlcG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwKS4gIPCfkqEgV2UgcmVjb21tZW5kIGJvb2ttYXJraW5nIHRoZSBbQ3licmlkIExpbmtUcmVlXShodHRwczovL2xpbmt0ci5lZS9jeWJyaWR0ZWNobm9sb2dpZXMpIHdoaWNoIGNvbnRhaW5zIG1hbnkgaGVscGZ1bCBsaW5rcyB0byBwbGF0Zm9ybSByZXNvdXJjZXMuICAjIyBHZXR0aW5nIFN0YXJ0ZWQgIFRoaXMgaXMgQ3licmlkXFwncyBwdWJsaWMgaW50ZXJhY3RpdmUgQVBJIGRvY3VtZW50YXRpb24sIHdoaWNoIGFsbG93cyB5b3UgdG8gZnVsbHkgdGVzdCBvdXIgQVBJcy4gSWYgeW91XFwnZCBsaWtlIHRvIHVzZSBhIGRpZmZlcmVudCB0b29sIHRvIGV4ZXJjaXNlIG91ciBBUElzLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBbT3BlbiBBUEkgMy4wIHlhbWxdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS92MS9zd2FnZ2VyLnlhbWwpIGZvciBpbXBvcnQuICBJZiB5b3VcXCdyZSBuZXcgdG8gb3VyIEFQSXMgYW5kIHRoZSBDeWJyaWQgUGxhdGZvcm0sIGZvbGxvdyB0aGUgYmVsb3cgZ3VpZGVzIHRvIGdldCBzZXQgdXAgYW5kIGZhbWlsaWFyIHdpdGggdGhlIHBsYXRmb3JtOiAgMS4gW0ludHJvZHVjdGlvbl0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9pbnRyb2R1Y3Rpb24pIDIuIFtQbGF0Zm9ybSBJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWlzLWN5YnJpZC1hcmNoaXRlY3RlZCkgMy4gW1Rlc3Rpbmcgd2l0aCBIb3N0ZWQgV2ViIERlbW8gQXBwXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3Rlc3Rpbmctd2l0aC1ob3N0ZWQtd2ViLWRlbW8tYXBwKSAgSW4gW0dldHRpbmcgU3RhcnRlZCBpbiB0aGUgQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWRvLWktZ2V0LXN0YXJ0ZWQtd2l0aC10aGUtc2FuZGJveCksIHdlIHdhbGsgeW91IHRocm91Z2ggaG93IHRvIHVzZSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnNhbmRib3guY3licmlkLmFwcC8pIHRvIGNyZWF0ZSBhIHRlc3QgYmFuayBhbmQgZ2VuZXJhdGUgQVBJIGtleXMuIEluIFtHZXR0aW5nIFJlYWR5IGZvciBUcmFkaW5nXShodHRwczovL2tiLmN5YnJpZC54eXovZ2V0dGluZy1yZWFkeS1mb3ItdHJhZGluZyksIHdlIHdhbGsgdGhyb3VnaCBjcmVhdGluZyBjdXN0b21lcnMsIGN1c3RvbWVyIGlkZW50aXRpZXMsIGFjY291bnRzLCBhcyB3ZWxsIGFzIGV4ZWN1dGluZyBxdW90ZXMgYW5kIHRyYWRlcy4gICMjIFdvcmtpbmcgd2l0aCB0aGUgQ3licmlkIFBsYXRmb3JtICBUaGVyZSBhcmUgdGhyZWUgcHJpbWFyeSB3YXlzIHlvdSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgQ3licmlkIHBsYXRmb3JtOiAgMS4gRGlyZWN0bHkgdmlhIG91ciBSRVNUZnVsIEFQSSAodGhpcyBkb2N1bWVudGF0aW9uKSAyLiBVc2luZyBvdXIgQVBJIGNsaWVudHMgYXZhaWxhYmxlIGluIGEgdmFyaWV0eSBvZiBsYW5ndWFnZXMgKFtBbmd1bGFyXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstYW5ndWxhciksIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstamF2YSksIFtLb3RsaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1rb3RsaW4pLCBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcHl0aG9uKSwgW1J1YnldKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1ydWJ5KSwgW1N3aWZ0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstc3dpZnQpIG9yIFtUeXBlc2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstdHlwZXNjcmlwdCkpIDMuIEludGVncmF0aW5nIGEgcGxhdGZvcm0gc3BlY2lmaWMgU0RLIChbV2ViXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLXdlYiksIFtBbmRyb2lkXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWFuZHJvaWQpLCBbaU9TXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWlvcykpICBPdXIgY29tcGxldGUgc2V0IG9mIEFQSXMgYWxsb3dzIHlvdSB0byBtYW5hZ2UgcmVzb3VyY2VzIGFjcm9zcyB0aHJlZSBkaXN0aW5jdCBhcmVhczogeW91ciBgT3JnYW5pemF0aW9uYCwgeW91ciBgQmFua3NgIGFuZCB5b3VyIGBJZGVudGl0aWVzYC4gRm9yIG1vc3Qgb2YgeW91ciB0ZXN0aW5nIGFuZCBpbnRlcmFjdGlvbiB5b3VcXCdsbCBiZSB1c2luZyB0aGUgYEJhbmtgIEFQSSwgd2hpY2ggaXMgd2hlcmUgdGhlIG1ham9yaXR5IG9mIEFQSXMgcmVzaWRlLiAgKlRoZSBjb21wbGV0ZSBzZXQgb2YgQVBJcyBjYW4gYmUgZm91bmQgb24gdGhlIGZvbGxvd2luZyBwYWdlczoqICB8IEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBbT3JnYW5pemF0aW9uIEFQSV0oaHR0cHM6Ly9vcmdhbml6YXRpb24ucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBbQmFuayBBUEldKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIGJhbmtzIChhbmQgYWxsIGRvd25zdHJlYW0gY3VzdG9tZXIgYWN0aXZpdHkpIHwgfCBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgICAgIHwgQVBJcyB0byBtYW5hZ2Ugb3JnYW5pemF0aW9uIGFuZCBiYW5rIGlkZW50aXRpZXMgICAgICAgICAgICAgfCAgRm9yIHF1ZXN0aW9ucyBwbGVhc2UgY29udGFjdCBbU3VwcG9ydF0obWFpbHRvOnN1cHBvcnRAY3licmlkLnh5eikgYXQgYW55IHRpbWUgZm9yIGFzc2lzdGFuY2UsIG9yIGNvbnRhY3QgdGhlIFtQcm9kdWN0IFRlYW1dKG1haWx0bzpwcm9kdWN0QGN5YnJpZC54eXopIGZvciBwcm9kdWN0IHN1Z2dlc3Rpb25zLiAgIyMgQXV0aGVudGljYXRpbmcgd2l0aCB0aGUgQVBJICBUaGUgQ3licmlkIFBsYXRmb3JtIHVzZXMgT0F1dGggMi4wIEJlYXJlciBUb2tlbnMgdG8gYXV0aGVudGljYXRlIHJlcXVlc3RzIHRvIHRoZSBwbGF0Zm9ybS4gQ3JlZGVudGlhbHMgdG8gY3JlYXRlIGBPcmdhbml6YXRpb25gIGFuZCBgQmFua2AgdG9rZW5zIGNhbiBiZSBnZW5lcmF0ZWQgdmlhIHRoZSBbQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwKS4gQWNjZXNzIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIGZvciBhIGBDdXN0b21lcmAgYXMgd2VsbCB2aWEgdGhlIFtDeWJyaWQgSWRQXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkgYXMgd2VsbC4gIEFuIGBPcmdhbml6YXRpb25gIGFjY2VzcyB0b2tlbiBhcHBsaWVzIGJyb2FkbHkgdG8gdGhlIHdob2xlIE9yZ2FuaXphdGlvbiBhbmQgYWxsIG9mIGl0cyBgQmFua3NgLCB3aGVyZWFzLCBhIGBCYW5rYCBhY2Nlc3MgdG9rZW4gaXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBCYW5rLiBgQ3VzdG9tZXJgIHRva2Vucywgc2ltaWxhcmx5LCBhcmUgc2NvcGVkIHRvIGEgc3BlY2lmaWMgY3VzdG9tZXIgaW4gYSBiYW5rLiAgQm90aCBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgT0F1dGggQ2xpZW50IENyZWRlbnRpYWwgR3JhbnQgZmxvdy4gRWFjaCBPcmdhbml6YXRpb24gYW5kIEJhbmsgaGFzIGl0cyBvd24gdW5pcXVlIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCB0aGF0IGFsbG93cyBmb3IgbWFjaGluZS10by1tYWNoaW5lIGF1dGhlbnRpY2F0aW9uLiAgQSBgQmFua2AgY2FuIHRoZW4gZ2VuZXJhdGUgYEN1c3RvbWVyYCBhY2Nlc3MgdG9rZW5zIHZpYSBBUEkgdXNpbmcgb3VyIFtJZGVudGl0aWVzIEFQSV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKS4gIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5ldmVyIHNoYXJlIHlvdXIgQ2xpZW50IElEIG9yIFNlY3JldCBwdWJsaWNseSBvciBpbiB5b3VyIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkuKio8L2ZvbnQ+ICBZb3VyIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhIHRpbWUtbGltaXRlZCBgQmVhcmVyIFRva2VuYCBieSBpbnRlcmFjdGluZyB3aXRoIHRoZSBDeWJyaWQgSWRlbnRpdHkgUHJvdmlkZXIgb3IgdGhyb3VnaCBpbnRlcmFjdGluZyB3aXRoIHRoZSAqKkF1dGhvcml6ZSoqIGJ1dHRvbiBpbiB0aGlzIGRvY3VtZW50LiAgVGhlIGZvbGxvd2luZyBjdXJsIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBnZW5lcmF0ZSBhIGBCZWFyZXIgVG9rZW5gIGZvciB1c2UgaW4gdGVzdGluZyB0aGUgQVBJIG9yIGRlbW8gYXBwbGljYXRpb25zLiAgYGBgICMgRXhhbXBsZSByZXF1ZXN0IHdoZW4gdXNpbmcgQmFuayBjcmVkZW50aWFscyBjdXJsIC1YIFBPU1QgaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvb2F1dGgvdG9rZW4gLWQgXFwneyAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwiY2xpZW50X2NyZWRlbnRpYWxzXFxcIiwgICAgIFxcXCJjbGllbnRfaWRcXFwiOiBcXFwiPFlvdXIgQ2xpZW50IElEPlxcXCIsICAgICBcXFwiY2xpZW50X3NlY3JldFxcXCI6IFxcXCI8WW91ciBTZWNyZXQ+XFxcIiwgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgYWNjb3VudHM6cmVhZCBhY2NvdW50czpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6d3JpdGUgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6d3JpdGUgY3VzdG9tZXJzOmV4ZWN1dGUgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOmV4ZWN1dGUgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIGZpbGVzOnJlYWQgZmlsZXM6ZXhlY3V0ZVxcXCIgICB9XFwnIC1IIFxcXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXFwiICAjIFdoZW4gdXNpbmcgT3JnYW5pemF0aW9uIGNyZWRlbnRpYWxzIHNldCBgc2NvcGVgIHRvIFxcJ29yZ2FuaXphdGlvbnM6cmVhZCBvcmdhbml6YXRpb25zOndyaXRlIG9yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6ZXhlY3V0ZSBiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtzOmV4ZWN1dGUgYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZSB1c2VyczpyZWFkIHVzZXJzOmV4ZWN1dGUgY291bnRlcnBhcnRpZXM6cmVhZCBjdXN0b21lcnM6cmVhZCBhY2NvdW50czpyZWFkIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpyZWFkIHRyYW5zZmVyczp3cml0ZSB0cmFuc2ZlcnM6ZXhlY3V0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIHdvcmtmbG93czpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQgaW52b2ljZXM6cmVhZCBzdWJzY3JpcHRpb25zOnJlYWQgc3Vic2NyaXB0aW9uczp3cml0ZSBzdWJzY3JpcHRpb25zOmV4ZWN1dGUgc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkIHN1YnNjcmlwdGlvbl9ldmVudHM6ZXhlY3V0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOnJlYWQgZmlsZXM6cmVhZCBmaWxlczpleGVjdXRlXFwnIGBgYCA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOb3RlOiBUaGUgYWJvdmUgY3VybCB3aWxsIGNyZWF0ZSBhIGJlYXJlciB0b2tlbiB3aXRoIGZ1bGwgc2NvcGUgYWNjZXNzLiBEZWxldGUgc2NvcGVzIGlmIHlvdVxcJ2QgbGlrZSB0byByZXN0cmljdCBhY2Nlc3MuKio8L2ZvbnQ+ICAjIyBBdXRoZW50aWNhdGlvbiBTY29wZXMgIFRoZSBDeWJyaWQgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIHVzZSBvZiBzY29wZXMgdG8gY29udHJvbCB0aGUgbGV2ZWwgb2YgYWNjZXNzIGEgdG9rZW4gaXMgbGltaXRlZCB0by4gU2NvcGVzIGRvIG5vdCBncmFudCBhY2Nlc3MgdG8gcmVzb3VyY2VzOyBpbnN0ZWFkLCB0aGV5IHByb3ZpZGUgbGltaXRzLCBpbiBzdXBwb3J0IG9mIHRoZSBsZWFzdCBwcml2aWxlZ2UgcHJpbmNpcGFsLiAgVGhlIGZvbGxvd2luZyBzY29wZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0gYW5kIGNhbiBiZSByZXF1ZXN0ZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBhbiBPcmdhbml6YXRpb24sIEJhbmsgb3IgQ3VzdG9tZXIgdG9rZW4uIEdlbmVyYWxseSBzcGVha2luZywgdGhlIF9SZWFkXyBzY29wZSBpcyByZXF1aXJlZCB0byByZWFkIGFuZCBsaXN0IHJlc291cmNlcywgdGhlIF9Xcml0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIGEgcmVzb3VyY2UgYW5kIHRoZSBfRXhlY3V0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcmVzb3VyY2UuICB8IFJlc291cmNlICAgICAgICAgICAgICB8IFJlYWQgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXcml0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgfCBFeGVjdXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEFjY291bnQgICAgICAgICAgICAgICB8IGFjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICAgICAgICAgICB8IGJhbmtzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYW5rczp3cml0ZSAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgfCBiYW5rczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IEN1c3RvbWVyICAgICAgICAgICAgICB8IGN1c3RvbWVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IENvdW50ZXJwYXJ0eSAgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgfCB8IERlcG9zaXQgQWRkcmVzcyAgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgfCB8IEV4dGVybmFsIEJhbmsgQWNjb3VudCB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIChCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgfCB8IEV4dGVybmFsIFdhbGxldCAgICAgICB8IGV4dGVybmFsX3dhbGxldDpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvcmdhbml6YXRpb25zOndyaXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFVzZXIgICAgICAgICAgICAgICAgICB8IHVzZXJzOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2VyczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IFByaWNlICAgICAgICAgICAgICAgICB8IHByaWNlczpyZWFkIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFF1b3RlICAgICAgICAgICAgICAgICB8IHF1b3RlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxdW90ZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYWRlICAgICAgICAgICAgICAgICB8IHRyYWRlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFkZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYW5zZmVyICAgICAgICAgICAgICB8IHRyYW5zZmVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCB8IFdvcmtmbG93ICAgICAgICAgICAgICB8IHdvcmtmbG93czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCB8IEludm9pY2UgICAgICAgICAgICAgICB8IGludm9pY2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCAgIyMgQXZhaWxhYmxlIEVuZHBvaW50cyAgVGhlIGF2YWlsYWJsZSBBUElzIGZvciB0aGUgW0lkZW50aXR5XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLCBbT3JnYW5pemF0aW9uXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBhbmQgW0JhbmtdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBBUEkgc2VydmljZXMgYXJlIGxpc3RlZCBiZWxvdzogIHwgQVBJIFNlcnZpY2UgIHwgTW9kZWwgICAgICAgICAgICAgICAgfCBBUEkgRW5kcG9pbnQgUGF0aCAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IElkZW50aXR5ICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rX2FwcGxpY2F0aW9ucyAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGJhbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgQ3VzdG9tZXJUb2tlbiAgICAgICAgfCAvYXBpL2N1c3RvbWVyX3Rva2VucyAgICAgICAgICAgfCBDcmVhdGUgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9ucyB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS91c2VycyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbiB1c2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgT3JnYW5pemF0aW9uIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbnMgICAgICAgICAgICAgfCBBUElzIHRvIHJldHJpZXZlIGFuZCB1cGRhdGUgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBY2NvdW50ICAgICAgICAgICAgICB8IC9hcGkvYWNjb3VudHMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBhY2NvdW50cywgd2hpY2ggaG9sZCBhIHNwZWNpZmljIGFzc2V0IGZvciBhIGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFzc2V0ICAgICAgICAgICAgICAgIHwgL2FwaS9hc3NldHMgICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBhc3NldHMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSAoZXg6IEJUQywgRVRIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIHVwZGF0ZSBhbmQgbGlzdCBiYW5rcywgdGhlIHBhcmVudCB0byBjdXN0b21lcnMsIGFjY291bnRzLCBldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDdXN0b21lciAgICAgICAgICAgICB8IC9hcGkvY3VzdG9tZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IENvdW50ZXJwYXJ0eSAgICAgICAgIHwgL2FwaS9jb3VudGVycGFydGllcyAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGNvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRGVwb3NpdEFkZHJlc3MgICAgICAgfCAvYXBpL2RlcG9zaXRfYWRkcmVzc2VzICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBkZXBvc2l0IGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbEJhbmtBY2NvdW50ICB8IC9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cyAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGV4dGVybmFsIGJhbmsgYWNjb3VudHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgYmFuayBhY2NvdW50cyB0byB0aGUgcGxhdGZvcm0gfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsV2FsbGV0ICAgICAgIHwgL2FwaS9leHRlcm5hbF93YWxsZXRzICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGxpc3QgYW5kIGRlbGV0ZSBleHRlcm5hbCB3YWxsZXRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIHdhbGxldHMgdG8gdGhlIHBsYXRmb3JtICAgICB8IHwgQmFuayAgICAgICAgIHwgSWRlbnRpdHlWZXJpZmljYXRpb24gfCAvYXBpL2lkZW50aXR5X3ZlcmlmaWNhdGlvbnMgICAgfCBDcmVhdGUgYW5kIGxpc3QgaWRlbnRpdHkgdmVyaWZpY2F0aW9ucywgd2hpY2ggYXJlIHBlcmZvcm1lZCBvbiBjdXN0b21lcnMgZm9yIEtZQyAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBJbnZvaWNlICAgICAgICAgICAgICB8IC9hcGkvaW52b2ljZXMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBjYW5jZWwgYW5kIGxpc3QgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFBheW1lbnRJbnN0cnVjdGlvbiAgIHwgL2FwaS9wYXltZW50X2luc3RydWN0aW9ucyAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgcGF5bWVudCBpbnN0cnVjdGlvbnMgZm9yIGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUHJpY2UgICAgICAgICAgICAgICAgfCAvYXBpL3ByaWNlcyAgICAgICAgICAgICAgICAgICAgfCBHZXQgdGhlIGN1cnJlbnQgcHJpY2VzIGZvciBhc3NldHMgb24gdGhlIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBRdW90ZSAgICAgICAgICAgICAgICB8IC9hcGkvcXVvdGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBxdW90ZXMsIHdoaWNoIGFyZSByZXF1aXJlZCB0byBleGVjdXRlIHRyYWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFN5bWJvbCAgICAgICAgICAgICAgIHwgL2FwaS9zeW1ib2xzICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBzeW1ib2xzIHN1cHBvcnRlZCBmb3IgdHJhZGUgKGV4OiBCVEMtVVNEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhZGUgICAgICAgICAgICAgICAgfCAvYXBpL3RyYWRlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgdHJhZGVzLCB3aGljaCBidXkgb3Igc2VsbCBjcnlwdG9jdXJyZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFuc2ZlciAgICAgICAgICAgICB8IC9hcGkvdHJhbnNmZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHRyYW5zZmVycyAoZS5nLiwgZnVuZGluZywgYm9vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFdvcmtmbG93ICAgICAgICAgICAgIHwgL2FwaS93b3JrZmxvd3MgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3Qgd29ya2Zsb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAjIyBVbmRlcnN0YW5kaW5nIE9iamVjdCBNb2RlbHMgJiBFbmRwb2ludHMgICoqT3JnYW5pemF0aW9ucyoqICBBbiBgT3JnYW5pemF0aW9uYCBpcyBtZWFudCB0byByZXByZXNlbnQgdGhlIG9yZ2FuaXphdGlvbiBwYXJ0bmVyaW5nIHdpdGggQ3licmlkIHRvIHVzZSBvdXIgcGxhdGZvcm0uICBBbiBgT3JnYW5pemF0aW9uYCB0eXBpY2FsbHkgZG9lcyBub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCBgY3VzdG9tZXJzYC4gSW5zdGVhZCwgYW4gT3JnYW5pemF0aW9uIGhhcyBvbmUgb3IgbW9yZSBgYmFua3NgLCB3aGljaCBlbmNvbXBhc3MgdGhlIGZpbmFuY2lhbCBzZXJ2aWNlIG9mZmVyaW5ncyBvZiB0aGUgcGxhdGZvcm0uICAqKkJhbmtzKiogIEEgYEJhbmtgIGlzIG93bmVkIGJ5IGFuIGBPcmdhbml6YXRpb25gIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhbiBlbnZpcm9ubWVudCBvciBjb250YWluZXIgZm9yIGBjdXN0b21lcnNgIGFuZCBwcm9kdWN0IG9mZmVyaW5ncy4gQmFua3MgYXJlIGNyZWF0ZWQgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgbW9kZSwgd2hlcmUgYFNhbmRib3hgIGlzIHRoZSBlbnZpcm9ubWVudCB0aGF0IHlvdSB3b3VsZCB0ZXN0LCBwcm90b3R5cGUgYW5kIGJ1aWxkIGluIHByaW9yIHRvIG1vdmluZyB0byBgUHJvZHVjdGlvbmAuICBBbiBgT3JnYW5pemF0aW9uYCBjYW4gaGF2ZSBtdWx0aXBsZSBgYmFua3NgLCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBlbnZpcm9ubWVudHMuIEEgYFNhbmRib3ggQmFua2Agd2lsbCBiZSBiYWNrZWQgYnkgc3R1YmJlZCBkYXRhIGFuZCBwcm9jZXNzIGZsb3dzLiBGb3IgaW5zdGFuY2UsIGZ1bmRpbmcgc291cmNlIHRyYW5zZmVyIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRyYWRlcyB3aWxsIGJlIHNpbXVsYXRlZCByYXRoZXIgdGhhbiBwZXJmb3JtZWQsIGhvd2V2ZXIgYXNzZXQgcHJpY2VzIGFyZSByZXByZXNlbnRhdGl2ZSBvZiByZWFsLXdvcmxkIHZhbHVlcy4gWW91IGhhdmUgYW4gdW5saW1pdGVkIGFtb3VudCBvZiBzaW11bGF0ZWQgZmlhdCBjdXJyZW5jeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gICoqQ3VzdG9tZXJzKiogIGBDdXN0b21lcnNgIHJlcHJlc2VudCB5b3VyIGJhbmtpbmcgdXNlcnMgb24gdGhlIHBsYXRmb3JtLiBBdCBwcmVzZW50LCB3ZSBvZmZlciBzdXBwb3J0IGZvciBgSW5kaXZpZHVhbHNgIGFzIEN1c3RvbWVycy4gIGBDdXN0b21lcnNgIG11c3QgYmUgdmVyaWZpZWQgKGkuZS4sIEtZQ1xcJ2QpIGluIG91ciBzeXN0ZW0gYmVmb3JlIHRoZXkgY2FuIHBsYXkgYW55IHBhcnQgb24gdGhlIHBsYXRmb3JtLCB3aGljaCBtZWFucyB0aGV5IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuZCBhIHBhc3NpbmcgYElkZW50aXR5IFZlcmlmaWNhdGlvbmAuIFNlZSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IGEgY3VzdG9tZXIgY2FuIGJlIHZlcmlmaWVkLiAgYEN1c3RvbWVyc2AgbXVzdCBhbHNvIGhhdmUgYW4gYEFjY291bnRgIHRvIGJlIGFibGUgdG8gdHJhbnNhY3QsIGluIHRoZSBkZXNpcmVkIGFzc2V0IGNsYXNzLiBTZWUgdGhlIEFjY291bnRzIEFQSXMgZm9yIG1vcmUgZGV0YWlscyBvbiBzZXR0aW5nIHVwIGFjY291bnRzIGZvciB0aGUgY3VzdG9tZXIuIFxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiB2MC4xMjMuNDM3XG4gKiBDb250YWN0OiBzdXBwb3J0QGN5YnJpZC5hcHBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9ICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsXG4gICAgICAgICBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cFBhcmFtZXRlckNvZGVjLCBIdHRwQ29udGV4dCBcbiAgICAgICAgfSAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMgfSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9zdFVzZXJJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3Bvc3RVc2VyJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFVzZXJJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3VzZXInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVXNlckxpc3RJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3VzZXJMaXN0JztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVc2Vyc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vaWQuc2FuZGJveC5jeWJyaWQuYXBwJztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgcHVibGljIGVuY29kZXI6IEh0dHBQYXJhbWV0ZXJDb2RlYztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB1c2VyXG4gICAgICogQ3JlYXRlcyBhIHVzZXIuICBcbiAgICAgKiBAcGFyYW0gcG9zdFVzZXJJZHBNb2RlbCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlVXNlcihwb3N0VXNlcklkcE1vZGVsOiBQb3N0VXNlcklkcE1vZGVsLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VXNlcklkcE1vZGVsPjtcbiAgICBwdWJsaWMgY3JlYXRlVXNlcihwb3N0VXNlcklkcE1vZGVsOiBQb3N0VXNlcklkcE1vZGVsLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxVc2VySWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgY3JlYXRlVXNlcihwb3N0VXNlcklkcE1vZGVsOiBQb3N0VXNlcklkcE1vZGVsLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VXNlcklkcE1vZGVsPj47XG4gICAgcHVibGljIGNyZWF0ZVVzZXIocG9zdFVzZXJJZHBNb2RlbDogUG9zdFVzZXJJZHBNb2RlbCwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAocG9zdFVzZXJJZHBNb2RlbCA9PT0gbnVsbCB8fCBwb3N0VXNlcklkcE1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBvc3RVc2VySWRwTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVVc2VyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PFVzZXJJZHBNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdXNlcnNgLFxuICAgICAgICAgICAgcG9zdFVzZXJJZHBNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIFVzZXJcbiAgICAgKiBEaXNhYmxlcyBhIHVzZXIuIFVzZXIgaXMgbm90IGRlbGV0ZWQuICBSZXF1aXJlZCBzY29wZTogKip1c2VyczpleGVjdXRlKipcbiAgICAgKiBAcGFyYW0gdXNlckd1aWQgSWRlbnRpZmllciBmb3IgdGhlIHVzZXIuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHB1YmxpYyBkaXNhYmxlVXNlcih1c2VyR3VpZDogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcbiAgICBwdWJsaWMgZGlzYWJsZVVzZXIodXNlckd1aWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+O1xuICAgIHB1YmxpYyBkaXNhYmxlVXNlcih1c2VyR3VpZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh1c2VyR3VpZCA9PT0gbnVsbCB8fCB1c2VyR3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB1c2VyR3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVVc2VyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmRlbGV0ZTxhbnk+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL3VzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh1c2VyR3VpZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IFVzZXJcbiAgICAgKiBSZXRyaWV2ZXMgYSB1c2VyLiAgUmVxdWlyZWQgc2NvcGU6ICoqdXNlcnM6cmVhZCoqXG4gICAgICogQHBhcmFtIHVzZXJHdWlkIElkZW50aWZpZXIgZm9yIHRoZSB1c2VyLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxVc2VySWRwTW9kZWw+O1xuICAgIHB1YmxpYyBnZXRVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFVzZXJJZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxVc2VySWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgZ2V0VXNlcih1c2VyR3VpZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh1c2VyR3VpZCA9PT0gbnVsbCB8fCB1c2VyR3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB1c2VyR3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFVzZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFVzZXJJZHBNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdXNlcnMvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHVzZXJHdWlkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IHVzZXJzXG4gICAgICogUmV0cmlldmUgYSBsaXN0IHVzZXJzLiAgUmVxdWlyZWQgc2NvcGU6ICoqdXNlcnM6cmVhZCoqXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgaW5kZXggdG8gcmV0cmlldmUuXG4gICAgICogQHBhcmFtIHBlclBhZ2UgVGhlIG51bWJlciBvZiBlbnRpdGllcyBwZXIgcGFnZSB0byByZXR1cm4uXG4gICAgICogQHBhcmFtIGd1aWQgQ29tbWEgc2VwYXJhdGVkIGd1aWRzIHRvIGxpc3QgdXNlcnMgZm9yLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0VXNlcihwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VXNlckxpc3RJZHBNb2RlbD47XG4gICAgcHVibGljIGxpc3RVc2VyKHBhZ2U/OiBzdHJpbmcsIHBlclBhZ2U/OiBzdHJpbmcsIGd1aWQ/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFVzZXJMaXN0SWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFVzZXIocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFVzZXJMaXN0SWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFVzZXIocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVyUGFnZSAhPT0gdW5kZWZpbmVkICYmIHBlclBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wZXJQYWdlLCAncGVyX3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3VpZCAhPT0gdW5kZWZpbmVkICYmIGd1aWQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5ndWlkLCAnZ3VpZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxVc2VyTGlzdElkcE1vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS91c2Vyc2AsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS91c2Vycy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQVkvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLFlBQVk7SUFPckIsWUFBc0IsVUFBc0IsRUFBZ0MsUUFBZ0IsRUFBYyxhQUE0QjtRQUFoSCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBTGxDLGFBQVEsR0FBRywrQkFBK0IsQ0FBQztRQUM5QyxtQkFBYyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBSXZDLElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7U0FDdEM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ2pELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO2dCQUM5QixRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUM1QjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEs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RUFDbkY7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsWUFBWSxFQUFPLGFBQWE7WUFDaEMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtZQUNuRCxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDOzswR0ExV1EsWUFBWSw0Q0FPNEMsU0FBUzs4R0FQakUsWUFBWSxjQUZYLE1BQU07NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFrRCxRQUFROzswQkFBRyxNQUFNOzJCQUFDLFNBQVM7OzBCQUFxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDeWJyaWQgSWRlbnRpdHkgQVBJXG4gKiAjIEN5YnJpZCBBUEkgZG9jdW1lbnRhdGlvbiAgV2VsY29tZSB0byBDeWJyaWQsIGFuIGFsbC1pbi1vbmUgY3J5cHRvIHBsYXRmb3JtIHRoYXQgZW5hYmxlcyB5b3UgdG8gZWFzaWx5ICoqYnVpbGQqKiBhbmQgKipsYXVuY2gqKiB3aGl0ZS1sYWJlbCBjcnlwdG8gcHJvZHVjdHMgb3Igc2VydmljZXMuICBJbiB0aGVzZSBkb2N1bWVudHMsIHlvdVxcJ2xsIGZpbmQgZGV0YWlscyBvbiBob3cgb3VyIFJFU1QgQVBJIG9wZXJhdGVzIGFuZCBnZW5lcmFsbHkgaG93IG91ciBwbGF0Zm9ybSBmdW5jdGlvbnMuICBJZiB5b3VcXCdyZSBsb29raW5nIGZvciBvdXIgVUkgU0RLIFdpZGdldHMgZm9yIFdlYiBvciBNb2JpbGUgKGlPUy9BbmRyb2lkKSwgZ2VuZXJhdGVkIEFQSSBjbGllbnRzLCBvciBkZW1vIGFwcGxpY2F0aW9ucywgaGVhZCBvdmVyIHRvIG91ciBbR2l0aHViIHJlcG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwKS4gIPCfkqEgV2UgcmVjb21tZW5kIGJvb2ttYXJraW5nIHRoZSBbQ3licmlkIExpbmtUcmVlXShodHRwczovL2xpbmt0ci5lZS9jeWJyaWR0ZWNobm9sb2dpZXMpIHdoaWNoIGNvbnRhaW5zIG1hbnkgaGVscGZ1bCBsaW5rcyB0byBwbGF0Zm9ybSByZXNvdXJjZXMuICAjIyBHZXR0aW5nIFN0YXJ0ZWQgIFRoaXMgaXMgQ3licmlkXFwncyBwdWJsaWMgaW50ZXJhY3RpdmUgQVBJIGRvY3VtZW50YXRpb24sIHdoaWNoIGFsbG93cyB5b3UgdG8gZnVsbHkgdGVzdCBvdXIgQVBJcy4gSWYgeW91XFwnZCBsaWtlIHRvIHVzZSBhIGRpZmZlcmVudCB0b29sIHRvIGV4ZXJjaXNlIG91ciBBUElzLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBbT3BlbiBBUEkgMy4wIHlhbWxdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS92MS9zd2FnZ2VyLnlhbWwpIGZvciBpbXBvcnQuICBJZiB5b3VcXCdyZSBuZXcgdG8gb3VyIEFQSXMgYW5kIHRoZSBDeWJyaWQgUGxhdGZvcm0sIGZvbGxvdyB0aGUgYmVsb3cgZ3VpZGVzIHRvIGdldCBzZXQgdXAgYW5kIGZhbWlsaWFyIHdpdGggdGhlIHBsYXRmb3JtOiAgMS4gW0ludHJvZHVjdGlvbl0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9pbnRyb2R1Y3Rpb24pIDIuIFtQbGF0Zm9ybSBJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWlzLWN5YnJpZC1hcmNoaXRlY3RlZCkgMy4gW1Rlc3Rpbmcgd2l0aCBIb3N0ZWQgV2ViIERlbW8gQXBwXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3Rlc3Rpbmctd2l0aC1ob3N0ZWQtd2ViLWRlbW8tYXBwKSAgSW4gW0dldHRpbmcgU3RhcnRlZCBpbiB0aGUgQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWRvLWktZ2V0LXN0YXJ0ZWQtd2l0aC10aGUtc2FuZGJveCksIHdlIHdhbGsgeW91IHRocm91Z2ggaG93IHRvIHVzZSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnNhbmRib3guY3licmlkLmFwcC8pIHRvIGNyZWF0ZSBhIHRlc3QgYmFuayBhbmQgZ2VuZXJhdGUgQVBJIGtleXMuIEluIFtHZXR0aW5nIFJlYWR5IGZvciBUcmFkaW5nXShodHRwczovL2tiLmN5YnJpZC54eXovZ2V0dGluZy1yZWFkeS1mb3ItdHJhZGluZyksIHdlIHdhbGsgdGhyb3VnaCBjcmVhdGluZyBjdXN0b21lcnMsIGN1c3RvbWVyIGlkZW50aXRpZXMsIGFjY291bnRzLCBhcyB3ZWxsIGFzIGV4ZWN1dGluZyBxdW90ZXMgYW5kIHRyYWRlcy4gICMjIFdvcmtpbmcgd2l0aCB0aGUgQ3licmlkIFBsYXRmb3JtICBUaGVyZSBhcmUgdGhyZWUgcHJpbWFyeSB3YXlzIHlvdSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgQ3licmlkIHBsYXRmb3JtOiAgMS4gRGlyZWN0bHkgdmlhIG91ciBSRVNUZnVsIEFQSSAodGhpcyBkb2N1bWVudGF0aW9uKSAyLiBVc2luZyBvdXIgQVBJIGNsaWVudHMgYXZhaWxhYmxlIGluIGEgdmFyaWV0eSBvZiBsYW5ndWFnZXMgKFtBbmd1bGFyXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstYW5ndWxhciksIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstamF2YSksIFtLb3RsaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1rb3RsaW4pLCBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcHl0aG9uKSwgW1J1YnldKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1ydWJ5KSwgW1N3aWZ0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstc3dpZnQpIG9yIFtUeXBlc2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstdHlwZXNjcmlwdCkpIDMuIEludGVncmF0aW5nIGEgcGxhdGZvcm0gc3BlY2lmaWMgU0RLIChbV2ViXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLXdlYiksIFtBbmRyb2lkXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWFuZHJvaWQpLCBbaU9TXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWlvcykpICBPdXIgY29tcGxldGUgc2V0IG9mIEFQSXMgYWxsb3dzIHlvdSB0byBtYW5hZ2UgcmVzb3VyY2VzIGFjcm9zcyB0aHJlZSBkaXN0aW5jdCBhcmVhczogeW91ciBgT3JnYW5pemF0aW9uYCwgeW91ciBgQmFua3NgIGFuZCB5b3VyIGBJZGVudGl0aWVzYC4gRm9yIG1vc3Qgb2YgeW91ciB0ZXN0aW5nIGFuZCBpbnRlcmFjdGlvbiB5b3VcXCdsbCBiZSB1c2luZyB0aGUgYEJhbmtgIEFQSSwgd2hpY2ggaXMgd2hlcmUgdGhlIG1ham9yaXR5IG9mIEFQSXMgcmVzaWRlLiAgKlRoZSBjb21wbGV0ZSBzZXQgb2YgQVBJcyBjYW4gYmUgZm91bmQgb24gdGhlIGZvbGxvd2luZyBwYWdlczoqICB8IEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBbT3JnYW5pemF0aW9uIEFQSV0oaHR0cHM6Ly9vcmdhbml6YXRpb24ucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBbQmFuayBBUEldKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIGJhbmtzIChhbmQgYWxsIGRvd25zdHJlYW0gY3VzdG9tZXIgYWN0aXZpdHkpIHwgfCBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgICAgIHwgQVBJcyB0byBtYW5hZ2Ugb3JnYW5pemF0aW9uIGFuZCBiYW5rIGlkZW50aXRpZXMgICAgICAgICAgICAgfCAgRm9yIHF1ZXN0aW9ucyBwbGVhc2UgY29udGFjdCBbU3VwcG9ydF0obWFpbHRvOnN1cHBvcnRAY3licmlkLnh5eikgYXQgYW55IHRpbWUgZm9yIGFzc2lzdGFuY2UsIG9yIGNvbnRhY3QgdGhlIFtQcm9kdWN0IFRlYW1dKG1haWx0bzpwcm9kdWN0QGN5YnJpZC54eXopIGZvciBwcm9kdWN0IHN1Z2dlc3Rpb25zLiAgIyMgQXV0aGVudGljYXRpbmcgd2l0aCB0aGUgQVBJICBUaGUgQ3licmlkIFBsYXRmb3JtIHVzZXMgT0F1dGggMi4wIEJlYXJlciBUb2tlbnMgdG8gYXV0aGVudGljYXRlIHJlcXVlc3RzIHRvIHRoZSBwbGF0Zm9ybS4gQ3JlZGVudGlhbHMgdG8gY3JlYXRlIGBPcmdhbml6YXRpb25gIGFuZCBgQmFua2AgdG9rZW5zIGNhbiBiZSBnZW5lcmF0ZWQgdmlhIHRoZSBbQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwKS4gQWNjZXNzIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIGZvciBhIGBDdXN0b21lcmAgYXMgd2VsbCB2aWEgdGhlIFtDeWJyaWQgSWRQXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkgYXMgd2VsbC4gIEFuIGBPcmdhbml6YXRpb25gIGFjY2VzcyB0b2tlbiBhcHBsaWVzIGJyb2FkbHkgdG8gdGhlIHdob2xlIE9yZ2FuaXphdGlvbiBhbmQgYWxsIG9mIGl0cyBgQmFua3NgLCB3aGVyZWFzLCBhIGBCYW5rYCBhY2Nlc3MgdG9rZW4gaXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBCYW5rLiBgQ3VzdG9tZXJgIHRva2Vucywgc2ltaWxhcmx5LCBhcmUgc2NvcGVkIHRvIGEgc3BlY2lmaWMgY3VzdG9tZXIgaW4gYSBiYW5rLiAgQm90aCBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgT0F1dGggQ2xpZW50IENyZWRlbnRpYWwgR3JhbnQgZmxvdy4gRWFjaCBPcmdhbml6YXRpb24gYW5kIEJhbmsgaGFzIGl0cyBvd24gdW5pcXVlIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCB0aGF0IGFsbG93cyBmb3IgbWFjaGluZS10by1tYWNoaW5lIGF1dGhlbnRpY2F0aW9uLiAgQSBgQmFua2AgY2FuIHRoZW4gZ2VuZXJhdGUgYEN1c3RvbWVyYCBhY2Nlc3MgdG9rZW5zIHZpYSBBUEkgdXNpbmcgb3VyIFtJZGVudGl0aWVzIEFQSV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKS4gIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5ldmVyIHNoYXJlIHlvdXIgQ2xpZW50IElEIG9yIFNlY3JldCBwdWJsaWNseSBvciBpbiB5b3VyIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkuKio8L2ZvbnQ+ICBZb3VyIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhIHRpbWUtbGltaXRlZCBgQmVhcmVyIFRva2VuYCBieSBpbnRlcmFjdGluZyB3aXRoIHRoZSBDeWJyaWQgSWRlbnRpdHkgUHJvdmlkZXIgb3IgdGhyb3VnaCBpbnRlcmFjdGluZyB3aXRoIHRoZSAqKkF1dGhvcml6ZSoqIGJ1dHRvbiBpbiB0aGlzIGRvY3VtZW50LiAgVGhlIGZvbGxvd2luZyBjdXJsIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBnZW5lcmF0ZSBhIGBCZWFyZXIgVG9rZW5gIGZvciB1c2UgaW4gdGVzdGluZyB0aGUgQVBJIG9yIGRlbW8gYXBwbGljYXRpb25zLiAgYGBgICMgRXhhbXBsZSByZXF1ZXN0IHdoZW4gdXNpbmcgQmFuayBjcmVkZW50aWFscyBjdXJsIC1YIFBPU1QgaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvb2F1dGgvdG9rZW4gLWQgXFwneyAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwiY2xpZW50X2NyZWRlbnRpYWxzXFxcIiwgICAgIFxcXCJjbGllbnRfaWRcXFwiOiBcXFwiPFlvdXIgQ2xpZW50IElEPlxcXCIsICAgICBcXFwiY2xpZW50X3NlY3JldFxcXCI6IFxcXCI8WW91ciBTZWNyZXQ+XFxcIiwgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgYWNjb3VudHM6cmVhZCBhY2NvdW50czpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6d3JpdGUgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6d3JpdGUgY3VzdG9tZXJzOmV4ZWN1dGUgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOmV4ZWN1dGUgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIGZpbGVzOnJlYWQgZmlsZXM6ZXhlY3V0ZVxcXCIgICB9XFwnIC1IIFxcXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXFwiICAjIFdoZW4gdXNpbmcgT3JnYW5pemF0aW9uIGNyZWRlbnRpYWxzIHNldCBgc2NvcGVgIHRvIFxcJ29yZ2FuaXphdGlvbnM6cmVhZCBvcmdhbml6YXRpb25zOndyaXRlIG9yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6ZXhlY3V0ZSBiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtzOmV4ZWN1dGUgYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZSB1c2VyczpyZWFkIHVzZXJzOmV4ZWN1dGUgY291bnRlcnBhcnRpZXM6cmVhZCBjdXN0b21lcnM6cmVhZCBhY2NvdW50czpyZWFkIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpyZWFkIHRyYW5zZmVyczp3cml0ZSB0cmFuc2ZlcnM6ZXhlY3V0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIHdvcmtmbG93czpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQgaW52b2ljZXM6cmVhZCBzdWJzY3JpcHRpb25zOnJlYWQgc3Vic2NyaXB0aW9uczp3cml0ZSBzdWJzY3JpcHRpb25zOmV4ZWN1dGUgc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkIHN1YnNjcmlwdGlvbl9ldmVudHM6ZXhlY3V0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOnJlYWQgZmlsZXM6cmVhZCBmaWxlczpleGVjdXRlXFwnIGBgYCA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOb3RlOiBUaGUgYWJvdmUgY3VybCB3aWxsIGNyZWF0ZSBhIGJlYXJlciB0b2tlbiB3aXRoIGZ1bGwgc2NvcGUgYWNjZXNzLiBEZWxldGUgc2NvcGVzIGlmIHlvdVxcJ2QgbGlrZSB0byByZXN0cmljdCBhY2Nlc3MuKio8L2ZvbnQ+ICAjIyBBdXRoZW50aWNhdGlvbiBTY29wZXMgIFRoZSBDeWJyaWQgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIHVzZSBvZiBzY29wZXMgdG8gY29udHJvbCB0aGUgbGV2ZWwgb2YgYWNjZXNzIGEgdG9rZW4gaXMgbGltaXRlZCB0by4gU2NvcGVzIGRvIG5vdCBncmFudCBhY2Nlc3MgdG8gcmVzb3VyY2VzOyBpbnN0ZWFkLCB0aGV5IHByb3ZpZGUgbGltaXRzLCBpbiBzdXBwb3J0IG9mIHRoZSBsZWFzdCBwcml2aWxlZ2UgcHJpbmNpcGFsLiAgVGhlIGZvbGxvd2luZyBzY29wZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0gYW5kIGNhbiBiZSByZXF1ZXN0ZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBhbiBPcmdhbml6YXRpb24sIEJhbmsgb3IgQ3VzdG9tZXIgdG9rZW4uIEdlbmVyYWxseSBzcGVha2luZywgdGhlIF9SZWFkXyBzY29wZSBpcyByZXF1aXJlZCB0byByZWFkIGFuZCBsaXN0IHJlc291cmNlcywgdGhlIF9Xcml0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIGEgcmVzb3VyY2UgYW5kIHRoZSBfRXhlY3V0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcmVzb3VyY2UuICB8IFJlc291cmNlICAgICAgICAgICAgICB8IFJlYWQgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXcml0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgfCBFeGVjdXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEFjY291bnQgICAgICAgICAgICAgICB8IGFjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICAgICAgICAgICB8IGJhbmtzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYW5rczp3cml0ZSAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgfCBiYW5rczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IEN1c3RvbWVyICAgICAgICAgICAgICB8IGN1c3RvbWVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IENvdW50ZXJwYXJ0eSAgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgfCB8IERlcG9zaXQgQWRkcmVzcyAgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgfCB8IEV4dGVybmFsIEJhbmsgQWNjb3VudCB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIChCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgfCB8IEV4dGVybmFsIFdhbGxldCAgICAgICB8IGV4dGVybmFsX3dhbGxldDpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvcmdhbml6YXRpb25zOndyaXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFVzZXIgICAgICAgICAgICAgICAgICB8IHVzZXJzOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2VyczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IFByaWNlICAgICAgICAgICAgICAgICB8IHByaWNlczpyZWFkIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFF1b3RlICAgICAgICAgICAgICAgICB8IHF1b3RlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxdW90ZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYWRlICAgICAgICAgICAgICAgICB8IHRyYWRlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFkZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYW5zZmVyICAgICAgICAgICAgICB8IHRyYW5zZmVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCB8IFdvcmtmbG93ICAgICAgICAgICAgICB8IHdvcmtmbG93czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCB8IEludm9pY2UgICAgICAgICAgICAgICB8IGludm9pY2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCAgIyMgQXZhaWxhYmxlIEVuZHBvaW50cyAgVGhlIGF2YWlsYWJsZSBBUElzIGZvciB0aGUgW0lkZW50aXR5XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLCBbT3JnYW5pemF0aW9uXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBhbmQgW0JhbmtdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBBUEkgc2VydmljZXMgYXJlIGxpc3RlZCBiZWxvdzogIHwgQVBJIFNlcnZpY2UgIHwgTW9kZWwgICAgICAgICAgICAgICAgfCBBUEkgRW5kcG9pbnQgUGF0aCAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IElkZW50aXR5ICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rX2FwcGxpY2F0aW9ucyAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGJhbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgQ3VzdG9tZXJUb2tlbiAgICAgICAgfCAvYXBpL2N1c3RvbWVyX3Rva2VucyAgICAgICAgICAgfCBDcmVhdGUgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9ucyB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS91c2VycyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbiB1c2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgT3JnYW5pemF0aW9uIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbnMgICAgICAgICAgICAgfCBBUElzIHRvIHJldHJpZXZlIGFuZCB1cGRhdGUgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBY2NvdW50ICAgICAgICAgICAgICB8IC9hcGkvYWNjb3VudHMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBhY2NvdW50cywgd2hpY2ggaG9sZCBhIHNwZWNpZmljIGFzc2V0IGZvciBhIGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFzc2V0ICAgICAgICAgICAgICAgIHwgL2FwaS9hc3NldHMgICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBhc3NldHMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSAoZXg6IEJUQywgRVRIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIHVwZGF0ZSBhbmQgbGlzdCBiYW5rcywgdGhlIHBhcmVudCB0byBjdXN0b21lcnMsIGFjY291bnRzLCBldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDdXN0b21lciAgICAgICAgICAgICB8IC9hcGkvY3VzdG9tZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IENvdW50ZXJwYXJ0eSAgICAgICAgIHwgL2FwaS9jb3VudGVycGFydGllcyAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGNvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRGVwb3NpdEFkZHJlc3MgICAgICAgfCAvYXBpL2RlcG9zaXRfYWRkcmVzc2VzICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBkZXBvc2l0IGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbEJhbmtBY2NvdW50ICB8IC9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cyAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGV4dGVybmFsIGJhbmsgYWNjb3VudHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgYmFuayBhY2NvdW50cyB0byB0aGUgcGxhdGZvcm0gfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsV2FsbGV0ICAgICAgIHwgL2FwaS9leHRlcm5hbF93YWxsZXRzICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGxpc3QgYW5kIGRlbGV0ZSBleHRlcm5hbCB3YWxsZXRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIHdhbGxldHMgdG8gdGhlIHBsYXRmb3JtICAgICB8IHwgQmFuayAgICAgICAgIHwgSWRlbnRpdHlWZXJpZmljYXRpb24gfCAvYXBpL2lkZW50aXR5X3ZlcmlmaWNhdGlvbnMgICAgfCBDcmVhdGUgYW5kIGxpc3QgaWRlbnRpdHkgdmVyaWZpY2F0aW9ucywgd2hpY2ggYXJlIHBlcmZvcm1lZCBvbiBjdXN0b21lcnMgZm9yIEtZQyAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBJbnZvaWNlICAgICAgICAgICAgICB8IC9hcGkvaW52b2ljZXMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBjYW5jZWwgYW5kIGxpc3QgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFBheW1lbnRJbnN0cnVjdGlvbiAgIHwgL2FwaS9wYXltZW50X2luc3RydWN0aW9ucyAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgcGF5bWVudCBpbnN0cnVjdGlvbnMgZm9yIGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUHJpY2UgICAgICAgICAgICAgICAgfCAvYXBpL3ByaWNlcyAgICAgICAgICAgICAgICAgICAgfCBHZXQgdGhlIGN1cnJlbnQgcHJpY2VzIGZvciBhc3NldHMgb24gdGhlIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBRdW90ZSAgICAgICAgICAgICAgICB8IC9hcGkvcXVvdGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBxdW90ZXMsIHdoaWNoIGFyZSByZXF1aXJlZCB0byBleGVjdXRlIHRyYWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFN5bWJvbCAgICAgICAgICAgICAgIHwgL2FwaS9zeW1ib2xzICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBzeW1ib2xzIHN1cHBvcnRlZCBmb3IgdHJhZGUgKGV4OiBCVEMtVVNEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhZGUgICAgICAgICAgICAgICAgfCAvYXBpL3RyYWRlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgdHJhZGVzLCB3aGljaCBidXkgb3Igc2VsbCBjcnlwdG9jdXJyZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFuc2ZlciAgICAgICAgICAgICB8IC9hcGkvdHJhbnNmZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHRyYW5zZmVycyAoZS5nLiwgZnVuZGluZywgYm9vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFdvcmtmbG93ICAgICAgICAgICAgIHwgL2FwaS93b3JrZmxvd3MgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3Qgd29ya2Zsb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAjIyBVbmRlcnN0YW5kaW5nIE9iamVjdCBNb2RlbHMgJiBFbmRwb2ludHMgICoqT3JnYW5pemF0aW9ucyoqICBBbiBgT3JnYW5pemF0aW9uYCBpcyBtZWFudCB0byByZXByZXNlbnQgdGhlIG9yZ2FuaXphdGlvbiBwYXJ0bmVyaW5nIHdpdGggQ3licmlkIHRvIHVzZSBvdXIgcGxhdGZvcm0uICBBbiBgT3JnYW5pemF0aW9uYCB0eXBpY2FsbHkgZG9lcyBub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCBgY3VzdG9tZXJzYC4gSW5zdGVhZCwgYW4gT3JnYW5pemF0aW9uIGhhcyBvbmUgb3IgbW9yZSBgYmFua3NgLCB3aGljaCBlbmNvbXBhc3MgdGhlIGZpbmFuY2lhbCBzZXJ2aWNlIG9mZmVyaW5ncyBvZiB0aGUgcGxhdGZvcm0uICAqKkJhbmtzKiogIEEgYEJhbmtgIGlzIG93bmVkIGJ5IGFuIGBPcmdhbml6YXRpb25gIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhbiBlbnZpcm9ubWVudCBvciBjb250YWluZXIgZm9yIGBjdXN0b21lcnNgIGFuZCBwcm9kdWN0IG9mZmVyaW5ncy4gQmFua3MgYXJlIGNyZWF0ZWQgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgbW9kZSwgd2hlcmUgYFNhbmRib3hgIGlzIHRoZSBlbnZpcm9ubWVudCB0aGF0IHlvdSB3b3VsZCB0ZXN0LCBwcm90b3R5cGUgYW5kIGJ1aWxkIGluIHByaW9yIHRvIG1vdmluZyB0byBgUHJvZHVjdGlvbmAuICBBbiBgT3JnYW5pemF0aW9uYCBjYW4gaGF2ZSBtdWx0aXBsZSBgYmFua3NgLCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBlbnZpcm9ubWVudHMuIEEgYFNhbmRib3ggQmFua2Agd2lsbCBiZSBiYWNrZWQgYnkgc3R1YmJlZCBkYXRhIGFuZCBwcm9jZXNzIGZsb3dzLiBGb3IgaW5zdGFuY2UsIGZ1bmRpbmcgc291cmNlIHRyYW5zZmVyIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRyYWRlcyB3aWxsIGJlIHNpbXVsYXRlZCByYXRoZXIgdGhhbiBwZXJmb3JtZWQsIGhvd2V2ZXIgYXNzZXQgcHJpY2VzIGFyZSByZXByZXNlbnRhdGl2ZSBvZiByZWFsLXdvcmxkIHZhbHVlcy4gWW91IGhhdmUgYW4gdW5saW1pdGVkIGFtb3VudCBvZiBzaW11bGF0ZWQgZmlhdCBjdXJyZW5jeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gICoqQ3VzdG9tZXJzKiogIGBDdXN0b21lcnNgIHJlcHJlc2VudCB5b3VyIGJhbmtpbmcgdXNlcnMgb24gdGhlIHBsYXRmb3JtLiBBdCBwcmVzZW50LCB3ZSBvZmZlciBzdXBwb3J0IGZvciBgSW5kaXZpZHVhbHNgIGFzIEN1c3RvbWVycy4gIGBDdXN0b21lcnNgIG11c3QgYmUgdmVyaWZpZWQgKGkuZS4sIEtZQ1xcJ2QpIGluIG91ciBzeXN0ZW0gYmVmb3JlIHRoZXkgY2FuIHBsYXkgYW55IHBhcnQgb24gdGhlIHBsYXRmb3JtLCB3aGljaCBtZWFucyB0aGV5IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuZCBhIHBhc3NpbmcgYElkZW50aXR5IFZlcmlmaWNhdGlvbmAuIFNlZSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IGEgY3VzdG9tZXIgY2FuIGJlIHZlcmlmaWVkLiAgYEN1c3RvbWVyc2AgbXVzdCBhbHNvIGhhdmUgYW4gYEFjY291bnRgIHRvIGJlIGFibGUgdG8gdHJhbnNhY3QsIGluIHRoZSBkZXNpcmVkIGFzc2V0IGNsYXNzLiBTZWUgdGhlIEFjY291bnRzIEFQSXMgZm9yIG1vcmUgZGV0YWlscyBvbiBzZXR0aW5nIHVwIGFjY291bnRzIGZvciB0aGUgY3VzdG9tZXIuIFxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiB2MC4xMjMuNDM4XG4gKiBDb250YWN0OiBzdXBwb3J0QGN5YnJpZC5hcHBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9ICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsXG4gICAgICAgICBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cFBhcmFtZXRlckNvZGVjLCBIdHRwQ29udGV4dCBcbiAgICAgICAgfSAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMgfSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUG9zdFVzZXJJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3Bvc3RVc2VyJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFVzZXJJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3VzZXInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVXNlckxpc3RJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3VzZXJMaXN0JztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVc2Vyc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vaWQuc2FuZGJveC5jeWJyaWQuYXBwJztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgcHVibGljIGVuY29kZXI6IEh0dHBQYXJhbWV0ZXJDb2RlYztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB1c2VyXG4gICAgICogQ3JlYXRlcyBhIHVzZXIuICBcbiAgICAgKiBAcGFyYW0gcG9zdFVzZXJJZHBNb2RlbCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlVXNlcihwb3N0VXNlcklkcE1vZGVsOiBQb3N0VXNlcklkcE1vZGVsLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VXNlcklkcE1vZGVsPjtcbiAgICBwdWJsaWMgY3JlYXRlVXNlcihwb3N0VXNlcklkcE1vZGVsOiBQb3N0VXNlcklkcE1vZGVsLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxVc2VySWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgY3JlYXRlVXNlcihwb3N0VXNlcklkcE1vZGVsOiBQb3N0VXNlcklkcE1vZGVsLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VXNlcklkcE1vZGVsPj47XG4gICAgcHVibGljIGNyZWF0ZVVzZXIocG9zdFVzZXJJZHBNb2RlbDogUG9zdFVzZXJJZHBNb2RlbCwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAocG9zdFVzZXJJZHBNb2RlbCA9PT0gbnVsbCB8fCBwb3N0VXNlcklkcE1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBvc3RVc2VySWRwTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVVc2VyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PFVzZXJJZHBNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdXNlcnNgLFxuICAgICAgICAgICAgcG9zdFVzZXJJZHBNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIFVzZXJcbiAgICAgKiBEaXNhYmxlcyBhIHVzZXIuIFVzZXIgaXMgbm90IGRlbGV0ZWQuICBSZXF1aXJlZCBzY29wZTogKip1c2VyczpleGVjdXRlKipcbiAgICAgKiBAcGFyYW0gdXNlckd1aWQgSWRlbnRpZmllciBmb3IgdGhlIHVzZXIuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHB1YmxpYyBkaXNhYmxlVXNlcih1c2VyR3VpZDogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcbiAgICBwdWJsaWMgZGlzYWJsZVVzZXIodXNlckd1aWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+O1xuICAgIHB1YmxpYyBkaXNhYmxlVXNlcih1c2VyR3VpZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh1c2VyR3VpZCA9PT0gbnVsbCB8fCB1c2VyR3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB1c2VyR3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVVc2VyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmRlbGV0ZTxhbnk+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL3VzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh1c2VyR3VpZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IFVzZXJcbiAgICAgKiBSZXRyaWV2ZXMgYSB1c2VyLiAgUmVxdWlyZWQgc2NvcGU6ICoqdXNlcnM6cmVhZCoqXG4gICAgICogQHBhcmFtIHVzZXJHdWlkIElkZW50aWZpZXIgZm9yIHRoZSB1c2VyLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxVc2VySWRwTW9kZWw+O1xuICAgIHB1YmxpYyBnZXRVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFVzZXJJZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRVc2VyKHVzZXJHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxVc2VySWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgZ2V0VXNlcih1c2VyR3VpZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmICh1c2VyR3VpZCA9PT0gbnVsbCB8fCB1c2VyR3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB1c2VyR3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFVzZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFVzZXJJZHBNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvdXNlcnMvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHVzZXJHdWlkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IHVzZXJzXG4gICAgICogUmV0cmlldmUgYSBsaXN0IHVzZXJzLiAgUmVxdWlyZWQgc2NvcGU6ICoqdXNlcnM6cmVhZCoqXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgaW5kZXggdG8gcmV0cmlldmUuXG4gICAgICogQHBhcmFtIHBlclBhZ2UgVGhlIG51bWJlciBvZiBlbnRpdGllcyBwZXIgcGFnZSB0byByZXR1cm4uXG4gICAgICogQHBhcmFtIGd1aWQgQ29tbWEgc2VwYXJhdGVkIGd1aWRzIHRvIGxpc3QgdXNlcnMgZm9yLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0VXNlcihwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8VXNlckxpc3RJZHBNb2RlbD47XG4gICAgcHVibGljIGxpc3RVc2VyKHBhZ2U/OiBzdHJpbmcsIHBlclBhZ2U/OiBzdHJpbmcsIGd1aWQ/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFVzZXJMaXN0SWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFVzZXIocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFVzZXJMaXN0SWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgbGlzdFVzZXIocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVyUGFnZSAhPT0gdW5kZWZpbmVkICYmIHBlclBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wZXJQYWdlLCAncGVyX3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3VpZCAhPT0gdW5kZWZpbmVkICYmIGd1aWQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5ndWlkLCAnZ3VpZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxVc2VyTGlzdElkcE1vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS91c2Vyc2AsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
@@ -2,7 +2,7 @@
2
2
  * Cybrid Identity API
3
3
  * # Cybrid API documentation Welcome to Cybrid, an all-in-one crypto platform that enables you to easily **build** and **launch** white-label crypto products or services. In these documents, you\'ll find details on how our REST API operates and generally how our platform functions. If you\'re looking for our UI SDK Widgets for Web or Mobile (iOS/Android), generated API clients, or demo applications, head over to our [Github repo](https://github.com/Cybrid-app). 💡 We recommend bookmarking the [Cybrid LinkTree](https://linktr.ee/cybridtechnologies) which contains many helpful links to platform resources. ## Getting Started This is Cybrid\'s public interactive API documentation, which allows you to fully test our APIs. If you\'d like to use a different tool to exercise our APIs, you can download the [Open API 3.0 yaml](https://bank.production.cybrid.app/api/schema/v1/swagger.yaml) for import. If you\'re new to our APIs and the Cybrid Platform, follow the below guides to get set up and familiar with the platform: 1. [Introduction](https://docs.cybrid.xyz/docs/introduction) 2. [Platform Introduction](https://docs.cybrid.xyz/docs/how-is-cybrid-architected) 3. [Testing with Hosted Web Demo App](https://docs.cybrid.xyz/docs/testing-with-hosted-web-demo-app) In [Getting Started in the Cybrid Sandbox](https://docs.cybrid.xyz/docs/how-do-i-get-started-with-the-sandbox), we walk you through how to use the [Cybrid Sandbox](https://id.sandbox.cybrid.app/) to create a test bank and generate API keys. In [Getting Ready for Trading](https://kb.cybrid.xyz/getting-ready-for-trading), we walk through creating customers, customer identities, accounts, as well as executing quotes and trades. ## Working with the Cybrid Platform There are three primary ways you can interact with the Cybrid platform: 1. Directly via our RESTful API (this documentation) 2. Using our API clients available in a variety of languages ([Angular](https://github.com/Cybrid-app/cybrid-api-bank-angular), [Java](https://github.com/Cybrid-app/cybrid-api-bank-java), [Kotlin](https://github.com/Cybrid-app/cybrid-api-bank-kotlin), [Python](https://github.com/Cybrid-app/cybrid-api-bank-python), [Ruby](https://github.com/Cybrid-app/cybrid-api-bank-ruby), [Swift](https://github.com/Cybrid-app/cybrid-api-bank-swift) or [Typescript](https://github.com/Cybrid-app/cybrid-api-bank-typescript)) 3. Integrating a platform specific SDK ([Web](https://github.com/Cybrid-app/cybrid-sdk-web), [Android](https://github.com/Cybrid-app/cybrid-sdk-android), [iOS](https://github.com/Cybrid-app/cybrid-sdk-ios)) Our complete set of APIs allows you to manage resources across three distinct areas: your `Organization`, your `Banks` and your `Identities`. For most of your testing and interaction you\'ll be using the `Bank` API, which is where the majority of APIs reside. *The complete set of APIs can be found on the following pages:* | API | Description | |------------------------------------------------------------------|-------------------------------------------------------------| | [Organization API](https://organization.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organizations | | [Bank API](https://bank.production.cybrid.app/api/schema/swagger-ui) | APIs to manage banks (and all downstream customer activity) | | [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organization and bank identities | For questions please contact [Support](mailto:support@cybrid.xyz) at any time for assistance, or contact the [Product Team](mailto:product@cybrid.xyz) for product suggestions. ## Authenticating with the API The Cybrid Platform uses OAuth 2.0 Bearer Tokens to authenticate requests to the platform. Credentials to create `Organization` and `Bank` tokens can be generated via the [Cybrid Sandbox](https://id.production.cybrid.app). Access tokens can be generated for a `Customer` as well via the [Cybrid IdP](https://id.production.cybrid.app) as well. An `Organization` access token applies broadly to the whole Organization and all of its `Banks`, whereas, a `Bank` access token is specific to an individual Bank. `Customer` tokens, similarly, are scoped to a specific customer in a bank. Both `Organization` and `Bank` tokens can be created using the OAuth Client Credential Grant flow. Each Organization and Bank has its own unique `Client ID` and `Secret` that allows for machine-to-machine authentication. A `Bank` can then generate `Customer` access tokens via API using our [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui). <font color=\"orange\">**⚠️ Never share your Client ID or Secret publicly or in your source code repository.**</font> Your `Client ID` and `Secret` can be exchanged for a time-limited `Bearer Token` by interacting with the Cybrid Identity Provider or through interacting with the **Authorize** button in this document. The following curl command can be used to quickly generate a `Bearer Token` for use in testing the API or demo applications. ``` # Example request when using Bank credentials curl -X POST https://id.production.cybrid.app/oauth/token -d \'{ \"grant_type\": \"client_credentials\", \"client_id\": \"<Your Client ID>\", \"client_secret\": \"<Your Secret>\", \"scope\": \"banks:read banks:write bank_applications:execute accounts:read accounts:execute counterparties:read counterparties:write counterparties:execute customers:read customers:write customers:execute prices:read quotes:execute quotes:read trades:execute trades:read transfers:execute transfers:read transfers:write external_bank_accounts:read external_bank_accounts:write external_bank_accounts:execute external_wallets:read external_wallets:execute workflows:read workflows:execute deposit_addresses:read deposit_addresses:execute deposit_bank_accounts:read deposit_bank_accounts:execute invoices:read invoices:write invoices:execute identity_verifications:read identity_verifications:write identity_verifications:execute files:read files:execute\" }\' -H \"Content-Type: application/json\" # When using Organization credentials set `scope` to \'organizations:read organizations:write organization_applications:execute banks:read banks:write banks:execute bank_applications:execute users:read users:execute counterparties:read customers:read accounts:read prices:read quotes:execute quotes:read trades:execute trades:read transfers:read transfers:write transfers:execute external_bank_accounts:read external_wallets:read workflows:read deposit_addresses:read deposit_bank_accounts:read invoices:read subscriptions:read subscriptions:write subscriptions:execute subscription_events:read subscription_events:execute identity_verifications:read files:read files:execute\' ``` <font color=\"orange\">**⚠️ Note: The above curl will create a bearer token with full scope access. Delete scopes if you\'d like to restrict access.**</font> ## Authentication Scopes The Cybrid platform supports the use of scopes to control the level of access a token is limited to. Scopes do not grant access to resources; instead, they provide limits, in support of the least privilege principal. The following scopes are available on the platform and can be requested when generating either an Organization, Bank or Customer token. Generally speaking, the _Read_ scope is required to read and list resources, the _Write_ scope is required to update a resource and the _Execute_ scope is required to create a resource. | Resource | Read scope (Token Type) | Write scope (Token Type) | Execute scope (Token Type) | |-----------------------|------------------------------------------------------------|-----------------------------------------------|--------------------------------------------------| | Account | accounts:read (Organization, Bank, Customer) | | accounts:execute (Bank, Customer) | | Bank | banks:read (Organization, Bank) | banks:write (Organization, Bank) | banks:execute (Organization) | | Customer | customers:read (Organization, Bank, Customer) | customers:write (Bank, Customer) | customers:execute (Bank) | | Counterparty | counterparties:read (Organization, Bank, Customer) | counterparties:write (Bank, Customer) | counterparties:execute (Bank) | | Deposit Address | deposit_addresses:read (Organization, Bank, Customer) | deposit_addresses:write (Bank, Customer) | deposit_addresses:execute (Bank, Customer) | | External Bank Account | external_bank_accounts:read (Organization, Bank, Customer) | external_bank_accounts:write (Bank, Customer) | external_bank_accounts:execute (Bank, Customer) | | External Wallet | external_wallet:read (Organization, Bank, Customer) | | external_wallet:execute (Bank, Customer) | | Organization | organizations:read (Organization) | organizations:write (Organization) | | | User | users:read (Organization) | | users:execute (Organization) | | Price | prices:read (Bank, Customer) | | | | Quote | quotes:read (Organization, Bank, Customer) | | quotes:execute (Organization, Bank, Customer) | | Trade | trades:read (Organization, Bank, Customer) | | trades:execute (Organization, Bank, Customer) | | Transfer | transfers:read (Organization, Bank, Customer) | | transfers:execute (Organization, Bank, Customer) | | Workflow | workflows:read (Organization, Bank, Customer) | | workflows:execute (Bank, Customer) | | Invoice | invoices:read (Organization, Bank, Customer) | invoices:write (Bank, Customer) | invoices:execute (Bank, Customer) | ## Available Endpoints The available APIs for the [Identity](https://id.production.cybrid.app/api/schema/swagger-ui), [Organization](https://organization.production.cybrid.app/api/schema/swagger-ui) and [Bank](https://bank.production.cybrid.app/api/schema/swagger-ui) API services are listed below: | API Service | Model | API Endpoint Path | Description | |--------------|----------------------|--------------------------------|---------------------------------------------------------------------------------------------------| | Identity | Bank | /api/bank_applications | Create and list banks | | Identity | CustomerToken | /api/customer_tokens | Create customer JWT access tokens | | Identity | Organization | /api/organization_applications | Create and list organizations | | Identity | Organization | /api/users | Create and list organization users | | Organization | Organization | /api/organizations | APIs to retrieve and update organization name | | Bank | Account | /api/accounts | Create and list accounts, which hold a specific asset for a customers | | Bank | Asset | /api/assets | Get a list of assets supported by the platform (ex: BTC, ETH) | | Bank | Bank | /api/banks | Create, update and list banks, the parent to customers, accounts, etc | | Bank | Customer | /api/customers | Create and list customers | | Bank | Counterparty | /api/counterparties | Create and list counterparties | | Bank | DepositAddress | /api/deposit_addresses | Create, get and list deposit addresses | | Bank | ExternalBankAccount | /api/external_bank_accounts | Create, get and list external bank accounts, which connect customer bank accounts to the platform | | Bank | ExternalWallet | /api/external_wallets | Create, get, list and delete external wallets, which connect customer wallets to the platform | | Bank | IdentityVerification | /api/identity_verifications | Create and list identity verifications, which are performed on customers for KYC | | Bank | Invoice | /api/invoices | Create, get, cancel and list invoices | | Bank | PaymentInstruction | /api/payment_instructions | Create, get and list payment instructions for invoices | | Bank | Price | /api/prices | Get the current prices for assets on the platform | | Bank | Quote | /api/quotes | Create and list quotes, which are required to execute trades | | Bank | Symbol | /api/symbols | Get a list of symbols supported for trade (ex: BTC-USD) | | Bank | Trade | /api/trades | Create and list trades, which buy or sell cryptocurrency | | Bank | Transfer | /api/transfers | Create, get and list transfers (e.g., funding, book) | | Bank | Workflow | /api/workflows | Create, get and list workflows | ## Understanding Object Models & Endpoints **Organizations** An `Organization` is meant to represent the organization partnering with Cybrid to use our platform. An `Organization` typically does not directly interact with `customers`. Instead, an Organization has one or more `banks`, which encompass the financial service offerings of the platform. **Banks** A `Bank` is owned by an `Organization` and can be thought of as an environment or container for `customers` and product offerings. Banks are created in either `Sandbox` or `Production` mode, where `Sandbox` is the environment that you would test, prototype and build in prior to moving to `Production`. An `Organization` can have multiple `banks`, in either `Sandbox` or `Production` environments. A `Sandbox Bank` will be backed by stubbed data and process flows. For instance, funding source transfer processes as well as trades will be simulated rather than performed, however asset prices are representative of real-world values. You have an unlimited amount of simulated fiat currency for testing purposes. **Customers** `Customers` represent your banking users on the platform. At present, we offer support for `Individuals` as Customers. `Customers` must be verified (i.e., KYC\'d) in our system before they can play any part on the platform, which means they must have an associated and a passing `Identity Verification`. See the Identity Verifications section for more details on how a customer can be verified. `Customers` must also have an `Account` to be able to transact, in the desired asset class. See the Accounts APIs for more details on setting up accounts for the customer.
4
4
  *
5
- * The version of the OpenAPI document: v0.123.437
5
+ * The version of the OpenAPI document: v0.123.438
6
6
  * Contact: support@cybrid.app
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -63,4 +63,4 @@ export var ApplicationIdpModel;
63
63
  Workflowsread: 'workflows:read'
64
64
  };
65
65
  })(ApplicationIdpModel || (ApplicationIdpModel = {}));
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tb2RlbC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBeUJILE1BQU0sS0FBVyxtQkFBbUIsQ0FxRG5DO0FBckRELFdBQWlCLG1CQUFtQjtJQUVuQiw4QkFBVSxHQUFHO1FBQ3RCLGVBQWUsRUFBRSxrQkFBZ0M7UUFDakQsWUFBWSxFQUFFLGVBQTZCO1FBQzNDLHVCQUF1QixFQUFFLDJCQUF5QztRQUNsRSxZQUFZLEVBQUUsZUFBNkI7UUFDM0MsU0FBUyxFQUFFLFlBQTBCO1FBQ3JDLFVBQVUsRUFBRSxhQUEyQjtRQUN2QyxxQkFBcUIsRUFBRSx3QkFBc0M7UUFDN0Qsa0JBQWtCLEVBQUUscUJBQW1DO1FBQ3ZELG1CQUFtQixFQUFFLHNCQUFvQztRQUN6RCxnQkFBZ0IsRUFBRSxtQkFBaUM7UUFDbkQsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QyxjQUFjLEVBQUUsaUJBQStCO1FBQy9DLHVCQUF1QixFQUFFLDJCQUF5QztRQUNsRSxvQkFBb0IsRUFBRSx3QkFBc0M7UUFDNUQsMEJBQTBCLEVBQUUsK0JBQTZDO1FBQ3pFLHVCQUF1QixFQUFFLDRCQUEwQztRQUNuRSwyQkFBMkIsRUFBRSxnQ0FBOEM7UUFDM0Usd0JBQXdCLEVBQUUsNkJBQTJDO1FBQ3JFLHlCQUF5QixFQUFFLDhCQUE0QztRQUN2RSxzQkFBc0IsRUFBRSwwQkFBd0M7UUFDaEUsbUJBQW1CLEVBQUUsdUJBQXFDO1FBQzFELFlBQVksRUFBRSxlQUE2QjtRQUMzQyxTQUFTLEVBQUUsWUFBMEI7UUFDckMsNEJBQTRCLEVBQUUsZ0NBQThDO1FBQzVFLHlCQUF5QixFQUFFLDZCQUEyQztRQUN0RSwwQkFBMEIsRUFBRSw4QkFBNEM7UUFDeEUsZUFBZSxFQUFFLGtCQUFnQztRQUNqRCxZQUFZLEVBQUUsZUFBNkI7UUFDM0MsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QywrQkFBK0IsRUFBRSxtQ0FBaUQ7UUFDbEYsaUJBQWlCLEVBQUUsb0JBQWtDO1FBQ3JELGtCQUFrQixFQUFFLHFCQUFtQztRQUN2RCxVQUFVLEVBQUUsYUFBMkI7UUFDdkMsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QyxVQUFVLEVBQUUsYUFBMkI7UUFDdkMseUJBQXlCLEVBQUUsNkJBQTJDO1FBQ3RFLHNCQUFzQixFQUFFLDBCQUF3QztRQUNoRSxvQkFBb0IsRUFBRSx1QkFBcUM7UUFDM0QsaUJBQWlCLEVBQUUsb0JBQWtDO1FBQ3JELGtCQUFrQixFQUFFLHFCQUFtQztRQUN2RCxhQUFhLEVBQUUsZ0JBQThCO1FBQzdDLFVBQVUsRUFBRSxhQUEyQjtRQUN2QyxnQkFBZ0IsRUFBRSxtQkFBaUM7UUFDbkQsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QyxjQUFjLEVBQUUsaUJBQStCO1FBQy9DLFlBQVksRUFBRSxlQUE2QjtRQUMzQyxTQUFTLEVBQUUsWUFBMEI7UUFDckMsZ0JBQWdCLEVBQUUsbUJBQWlDO1FBQ25ELGFBQWEsRUFBRSxnQkFBOEI7S0FDaEQsQ0FBQztBQUNOLENBQUMsRUFyRGdCLG1CQUFtQixLQUFuQixtQkFBbUIsUUFxRG5DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDeWJyaWQgSWRlbnRpdHkgQVBJXG4gKiAjIEN5YnJpZCBBUEkgZG9jdW1lbnRhdGlvbiAgV2VsY29tZSB0byBDeWJyaWQsIGFuIGFsbC1pbi1vbmUgY3J5cHRvIHBsYXRmb3JtIHRoYXQgZW5hYmxlcyB5b3UgdG8gZWFzaWx5ICoqYnVpbGQqKiBhbmQgKipsYXVuY2gqKiB3aGl0ZS1sYWJlbCBjcnlwdG8gcHJvZHVjdHMgb3Igc2VydmljZXMuICBJbiB0aGVzZSBkb2N1bWVudHMsIHlvdVxcJ2xsIGZpbmQgZGV0YWlscyBvbiBob3cgb3VyIFJFU1QgQVBJIG9wZXJhdGVzIGFuZCBnZW5lcmFsbHkgaG93IG91ciBwbGF0Zm9ybSBmdW5jdGlvbnMuICBJZiB5b3VcXCdyZSBsb29raW5nIGZvciBvdXIgVUkgU0RLIFdpZGdldHMgZm9yIFdlYiBvciBNb2JpbGUgKGlPUy9BbmRyb2lkKSwgZ2VuZXJhdGVkIEFQSSBjbGllbnRzLCBvciBkZW1vIGFwcGxpY2F0aW9ucywgaGVhZCBvdmVyIHRvIG91ciBbR2l0aHViIHJlcG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwKS4gIPCfkqEgV2UgcmVjb21tZW5kIGJvb2ttYXJraW5nIHRoZSBbQ3licmlkIExpbmtUcmVlXShodHRwczovL2xpbmt0ci5lZS9jeWJyaWR0ZWNobm9sb2dpZXMpIHdoaWNoIGNvbnRhaW5zIG1hbnkgaGVscGZ1bCBsaW5rcyB0byBwbGF0Zm9ybSByZXNvdXJjZXMuICAjIyBHZXR0aW5nIFN0YXJ0ZWQgIFRoaXMgaXMgQ3licmlkXFwncyBwdWJsaWMgaW50ZXJhY3RpdmUgQVBJIGRvY3VtZW50YXRpb24sIHdoaWNoIGFsbG93cyB5b3UgdG8gZnVsbHkgdGVzdCBvdXIgQVBJcy4gSWYgeW91XFwnZCBsaWtlIHRvIHVzZSBhIGRpZmZlcmVudCB0b29sIHRvIGV4ZXJjaXNlIG91ciBBUElzLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBbT3BlbiBBUEkgMy4wIHlhbWxdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS92MS9zd2FnZ2VyLnlhbWwpIGZvciBpbXBvcnQuICBJZiB5b3VcXCdyZSBuZXcgdG8gb3VyIEFQSXMgYW5kIHRoZSBDeWJyaWQgUGxhdGZvcm0sIGZvbGxvdyB0aGUgYmVsb3cgZ3VpZGVzIHRvIGdldCBzZXQgdXAgYW5kIGZhbWlsaWFyIHdpdGggdGhlIHBsYXRmb3JtOiAgMS4gW0ludHJvZHVjdGlvbl0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9pbnRyb2R1Y3Rpb24pIDIuIFtQbGF0Zm9ybSBJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWlzLWN5YnJpZC1hcmNoaXRlY3RlZCkgMy4gW1Rlc3Rpbmcgd2l0aCBIb3N0ZWQgV2ViIERlbW8gQXBwXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3Rlc3Rpbmctd2l0aC1ob3N0ZWQtd2ViLWRlbW8tYXBwKSAgSW4gW0dldHRpbmcgU3RhcnRlZCBpbiB0aGUgQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWRvLWktZ2V0LXN0YXJ0ZWQtd2l0aC10aGUtc2FuZGJveCksIHdlIHdhbGsgeW91IHRocm91Z2ggaG93IHRvIHVzZSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnNhbmRib3guY3licmlkLmFwcC8pIHRvIGNyZWF0ZSBhIHRlc3QgYmFuayBhbmQgZ2VuZXJhdGUgQVBJIGtleXMuIEluIFtHZXR0aW5nIFJlYWR5IGZvciBUcmFkaW5nXShodHRwczovL2tiLmN5YnJpZC54eXovZ2V0dGluZy1yZWFkeS1mb3ItdHJhZGluZyksIHdlIHdhbGsgdGhyb3VnaCBjcmVhdGluZyBjdXN0b21lcnMsIGN1c3RvbWVyIGlkZW50aXRpZXMsIGFjY291bnRzLCBhcyB3ZWxsIGFzIGV4ZWN1dGluZyBxdW90ZXMgYW5kIHRyYWRlcy4gICMjIFdvcmtpbmcgd2l0aCB0aGUgQ3licmlkIFBsYXRmb3JtICBUaGVyZSBhcmUgdGhyZWUgcHJpbWFyeSB3YXlzIHlvdSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgQ3licmlkIHBsYXRmb3JtOiAgMS4gRGlyZWN0bHkgdmlhIG91ciBSRVNUZnVsIEFQSSAodGhpcyBkb2N1bWVudGF0aW9uKSAyLiBVc2luZyBvdXIgQVBJIGNsaWVudHMgYXZhaWxhYmxlIGluIGEgdmFyaWV0eSBvZiBsYW5ndWFnZXMgKFtBbmd1bGFyXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstYW5ndWxhciksIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstamF2YSksIFtLb3RsaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1rb3RsaW4pLCBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcHl0aG9uKSwgW1J1YnldKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1ydWJ5KSwgW1N3aWZ0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstc3dpZnQpIG9yIFtUeXBlc2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstdHlwZXNjcmlwdCkpIDMuIEludGVncmF0aW5nIGEgcGxhdGZvcm0gc3BlY2lmaWMgU0RLIChbV2ViXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLXdlYiksIFtBbmRyb2lkXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWFuZHJvaWQpLCBbaU9TXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWlvcykpICBPdXIgY29tcGxldGUgc2V0IG9mIEFQSXMgYWxsb3dzIHlvdSB0byBtYW5hZ2UgcmVzb3VyY2VzIGFjcm9zcyB0aHJlZSBkaXN0aW5jdCBhcmVhczogeW91ciBgT3JnYW5pemF0aW9uYCwgeW91ciBgQmFua3NgIGFuZCB5b3VyIGBJZGVudGl0aWVzYC4gRm9yIG1vc3Qgb2YgeW91ciB0ZXN0aW5nIGFuZCBpbnRlcmFjdGlvbiB5b3VcXCdsbCBiZSB1c2luZyB0aGUgYEJhbmtgIEFQSSwgd2hpY2ggaXMgd2hlcmUgdGhlIG1ham9yaXR5IG9mIEFQSXMgcmVzaWRlLiAgKlRoZSBjb21wbGV0ZSBzZXQgb2YgQVBJcyBjYW4gYmUgZm91bmQgb24gdGhlIGZvbGxvd2luZyBwYWdlczoqICB8IEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBbT3JnYW5pemF0aW9uIEFQSV0oaHR0cHM6Ly9vcmdhbml6YXRpb24ucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBbQmFuayBBUEldKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIGJhbmtzIChhbmQgYWxsIGRvd25zdHJlYW0gY3VzdG9tZXIgYWN0aXZpdHkpIHwgfCBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgICAgIHwgQVBJcyB0byBtYW5hZ2Ugb3JnYW5pemF0aW9uIGFuZCBiYW5rIGlkZW50aXRpZXMgICAgICAgICAgICAgfCAgRm9yIHF1ZXN0aW9ucyBwbGVhc2UgY29udGFjdCBbU3VwcG9ydF0obWFpbHRvOnN1cHBvcnRAY3licmlkLnh5eikgYXQgYW55IHRpbWUgZm9yIGFzc2lzdGFuY2UsIG9yIGNvbnRhY3QgdGhlIFtQcm9kdWN0IFRlYW1dKG1haWx0bzpwcm9kdWN0QGN5YnJpZC54eXopIGZvciBwcm9kdWN0IHN1Z2dlc3Rpb25zLiAgIyMgQXV0aGVudGljYXRpbmcgd2l0aCB0aGUgQVBJICBUaGUgQ3licmlkIFBsYXRmb3JtIHVzZXMgT0F1dGggMi4wIEJlYXJlciBUb2tlbnMgdG8gYXV0aGVudGljYXRlIHJlcXVlc3RzIHRvIHRoZSBwbGF0Zm9ybS4gQ3JlZGVudGlhbHMgdG8gY3JlYXRlIGBPcmdhbml6YXRpb25gIGFuZCBgQmFua2AgdG9rZW5zIGNhbiBiZSBnZW5lcmF0ZWQgdmlhIHRoZSBbQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwKS4gQWNjZXNzIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIGZvciBhIGBDdXN0b21lcmAgYXMgd2VsbCB2aWEgdGhlIFtDeWJyaWQgSWRQXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkgYXMgd2VsbC4gIEFuIGBPcmdhbml6YXRpb25gIGFjY2VzcyB0b2tlbiBhcHBsaWVzIGJyb2FkbHkgdG8gdGhlIHdob2xlIE9yZ2FuaXphdGlvbiBhbmQgYWxsIG9mIGl0cyBgQmFua3NgLCB3aGVyZWFzLCBhIGBCYW5rYCBhY2Nlc3MgdG9rZW4gaXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBCYW5rLiBgQ3VzdG9tZXJgIHRva2Vucywgc2ltaWxhcmx5LCBhcmUgc2NvcGVkIHRvIGEgc3BlY2lmaWMgY3VzdG9tZXIgaW4gYSBiYW5rLiAgQm90aCBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgT0F1dGggQ2xpZW50IENyZWRlbnRpYWwgR3JhbnQgZmxvdy4gRWFjaCBPcmdhbml6YXRpb24gYW5kIEJhbmsgaGFzIGl0cyBvd24gdW5pcXVlIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCB0aGF0IGFsbG93cyBmb3IgbWFjaGluZS10by1tYWNoaW5lIGF1dGhlbnRpY2F0aW9uLiAgQSBgQmFua2AgY2FuIHRoZW4gZ2VuZXJhdGUgYEN1c3RvbWVyYCBhY2Nlc3MgdG9rZW5zIHZpYSBBUEkgdXNpbmcgb3VyIFtJZGVudGl0aWVzIEFQSV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKS4gIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5ldmVyIHNoYXJlIHlvdXIgQ2xpZW50IElEIG9yIFNlY3JldCBwdWJsaWNseSBvciBpbiB5b3VyIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkuKio8L2ZvbnQ+ICBZb3VyIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhIHRpbWUtbGltaXRlZCBgQmVhcmVyIFRva2VuYCBieSBpbnRlcmFjdGluZyB3aXRoIHRoZSBDeWJyaWQgSWRlbnRpdHkgUHJvdmlkZXIgb3IgdGhyb3VnaCBpbnRlcmFjdGluZyB3aXRoIHRoZSAqKkF1dGhvcml6ZSoqIGJ1dHRvbiBpbiB0aGlzIGRvY3VtZW50LiAgVGhlIGZvbGxvd2luZyBjdXJsIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBnZW5lcmF0ZSBhIGBCZWFyZXIgVG9rZW5gIGZvciB1c2UgaW4gdGVzdGluZyB0aGUgQVBJIG9yIGRlbW8gYXBwbGljYXRpb25zLiAgYGBgICMgRXhhbXBsZSByZXF1ZXN0IHdoZW4gdXNpbmcgQmFuayBjcmVkZW50aWFscyBjdXJsIC1YIFBPU1QgaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvb2F1dGgvdG9rZW4gLWQgXFwneyAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwiY2xpZW50X2NyZWRlbnRpYWxzXFxcIiwgICAgIFxcXCJjbGllbnRfaWRcXFwiOiBcXFwiPFlvdXIgQ2xpZW50IElEPlxcXCIsICAgICBcXFwiY2xpZW50X3NlY3JldFxcXCI6IFxcXCI8WW91ciBTZWNyZXQ+XFxcIiwgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgYWNjb3VudHM6cmVhZCBhY2NvdW50czpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6d3JpdGUgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6d3JpdGUgY3VzdG9tZXJzOmV4ZWN1dGUgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOmV4ZWN1dGUgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIGZpbGVzOnJlYWQgZmlsZXM6ZXhlY3V0ZVxcXCIgICB9XFwnIC1IIFxcXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXFwiICAjIFdoZW4gdXNpbmcgT3JnYW5pemF0aW9uIGNyZWRlbnRpYWxzIHNldCBgc2NvcGVgIHRvIFxcJ29yZ2FuaXphdGlvbnM6cmVhZCBvcmdhbml6YXRpb25zOndyaXRlIG9yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6ZXhlY3V0ZSBiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtzOmV4ZWN1dGUgYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZSB1c2VyczpyZWFkIHVzZXJzOmV4ZWN1dGUgY291bnRlcnBhcnRpZXM6cmVhZCBjdXN0b21lcnM6cmVhZCBhY2NvdW50czpyZWFkIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpyZWFkIHRyYW5zZmVyczp3cml0ZSB0cmFuc2ZlcnM6ZXhlY3V0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIHdvcmtmbG93czpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQgaW52b2ljZXM6cmVhZCBzdWJzY3JpcHRpb25zOnJlYWQgc3Vic2NyaXB0aW9uczp3cml0ZSBzdWJzY3JpcHRpb25zOmV4ZWN1dGUgc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkIHN1YnNjcmlwdGlvbl9ldmVudHM6ZXhlY3V0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOnJlYWQgZmlsZXM6cmVhZCBmaWxlczpleGVjdXRlXFwnIGBgYCA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOb3RlOiBUaGUgYWJvdmUgY3VybCB3aWxsIGNyZWF0ZSBhIGJlYXJlciB0b2tlbiB3aXRoIGZ1bGwgc2NvcGUgYWNjZXNzLiBEZWxldGUgc2NvcGVzIGlmIHlvdVxcJ2QgbGlrZSB0byByZXN0cmljdCBhY2Nlc3MuKio8L2ZvbnQ+ICAjIyBBdXRoZW50aWNhdGlvbiBTY29wZXMgIFRoZSBDeWJyaWQgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIHVzZSBvZiBzY29wZXMgdG8gY29udHJvbCB0aGUgbGV2ZWwgb2YgYWNjZXNzIGEgdG9rZW4gaXMgbGltaXRlZCB0by4gU2NvcGVzIGRvIG5vdCBncmFudCBhY2Nlc3MgdG8gcmVzb3VyY2VzOyBpbnN0ZWFkLCB0aGV5IHByb3ZpZGUgbGltaXRzLCBpbiBzdXBwb3J0IG9mIHRoZSBsZWFzdCBwcml2aWxlZ2UgcHJpbmNpcGFsLiAgVGhlIGZvbGxvd2luZyBzY29wZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0gYW5kIGNhbiBiZSByZXF1ZXN0ZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBhbiBPcmdhbml6YXRpb24sIEJhbmsgb3IgQ3VzdG9tZXIgdG9rZW4uIEdlbmVyYWxseSBzcGVha2luZywgdGhlIF9SZWFkXyBzY29wZSBpcyByZXF1aXJlZCB0byByZWFkIGFuZCBsaXN0IHJlc291cmNlcywgdGhlIF9Xcml0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIGEgcmVzb3VyY2UgYW5kIHRoZSBfRXhlY3V0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcmVzb3VyY2UuICB8IFJlc291cmNlICAgICAgICAgICAgICB8IFJlYWQgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXcml0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgfCBFeGVjdXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEFjY291bnQgICAgICAgICAgICAgICB8IGFjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICAgICAgICAgICB8IGJhbmtzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYW5rczp3cml0ZSAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgfCBiYW5rczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IEN1c3RvbWVyICAgICAgICAgICAgICB8IGN1c3RvbWVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IENvdW50ZXJwYXJ0eSAgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgfCB8IERlcG9zaXQgQWRkcmVzcyAgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgfCB8IEV4dGVybmFsIEJhbmsgQWNjb3VudCB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIChCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgfCB8IEV4dGVybmFsIFdhbGxldCAgICAgICB8IGV4dGVybmFsX3dhbGxldDpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvcmdhbml6YXRpb25zOndyaXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFVzZXIgICAgICAgICAgICAgICAgICB8IHVzZXJzOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2VyczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IFByaWNlICAgICAgICAgICAgICAgICB8IHByaWNlczpyZWFkIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFF1b3RlICAgICAgICAgICAgICAgICB8IHF1b3RlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxdW90ZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYWRlICAgICAgICAgICAgICAgICB8IHRyYWRlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFkZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYW5zZmVyICAgICAgICAgICAgICB8IHRyYW5zZmVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCB8IFdvcmtmbG93ICAgICAgICAgICAgICB8IHdvcmtmbG93czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCB8IEludm9pY2UgICAgICAgICAgICAgICB8IGludm9pY2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCAgIyMgQXZhaWxhYmxlIEVuZHBvaW50cyAgVGhlIGF2YWlsYWJsZSBBUElzIGZvciB0aGUgW0lkZW50aXR5XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLCBbT3JnYW5pemF0aW9uXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBhbmQgW0JhbmtdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBBUEkgc2VydmljZXMgYXJlIGxpc3RlZCBiZWxvdzogIHwgQVBJIFNlcnZpY2UgIHwgTW9kZWwgICAgICAgICAgICAgICAgfCBBUEkgRW5kcG9pbnQgUGF0aCAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IElkZW50aXR5ICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rX2FwcGxpY2F0aW9ucyAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGJhbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgQ3VzdG9tZXJUb2tlbiAgICAgICAgfCAvYXBpL2N1c3RvbWVyX3Rva2VucyAgICAgICAgICAgfCBDcmVhdGUgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9ucyB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS91c2VycyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbiB1c2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgT3JnYW5pemF0aW9uIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbnMgICAgICAgICAgICAgfCBBUElzIHRvIHJldHJpZXZlIGFuZCB1cGRhdGUgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBY2NvdW50ICAgICAgICAgICAgICB8IC9hcGkvYWNjb3VudHMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBhY2NvdW50cywgd2hpY2ggaG9sZCBhIHNwZWNpZmljIGFzc2V0IGZvciBhIGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFzc2V0ICAgICAgICAgICAgICAgIHwgL2FwaS9hc3NldHMgICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBhc3NldHMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSAoZXg6IEJUQywgRVRIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIHVwZGF0ZSBhbmQgbGlzdCBiYW5rcywgdGhlIHBhcmVudCB0byBjdXN0b21lcnMsIGFjY291bnRzLCBldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDdXN0b21lciAgICAgICAgICAgICB8IC9hcGkvY3VzdG9tZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IENvdW50ZXJwYXJ0eSAgICAgICAgIHwgL2FwaS9jb3VudGVycGFydGllcyAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGNvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRGVwb3NpdEFkZHJlc3MgICAgICAgfCAvYXBpL2RlcG9zaXRfYWRkcmVzc2VzICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBkZXBvc2l0IGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbEJhbmtBY2NvdW50ICB8IC9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cyAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGV4dGVybmFsIGJhbmsgYWNjb3VudHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgYmFuayBhY2NvdW50cyB0byB0aGUgcGxhdGZvcm0gfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsV2FsbGV0ICAgICAgIHwgL2FwaS9leHRlcm5hbF93YWxsZXRzICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGxpc3QgYW5kIGRlbGV0ZSBleHRlcm5hbCB3YWxsZXRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIHdhbGxldHMgdG8gdGhlIHBsYXRmb3JtICAgICB8IHwgQmFuayAgICAgICAgIHwgSWRlbnRpdHlWZXJpZmljYXRpb24gfCAvYXBpL2lkZW50aXR5X3ZlcmlmaWNhdGlvbnMgICAgfCBDcmVhdGUgYW5kIGxpc3QgaWRlbnRpdHkgdmVyaWZpY2F0aW9ucywgd2hpY2ggYXJlIHBlcmZvcm1lZCBvbiBjdXN0b21lcnMgZm9yIEtZQyAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBJbnZvaWNlICAgICAgICAgICAgICB8IC9hcGkvaW52b2ljZXMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBjYW5jZWwgYW5kIGxpc3QgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFBheW1lbnRJbnN0cnVjdGlvbiAgIHwgL2FwaS9wYXltZW50X2luc3RydWN0aW9ucyAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgcGF5bWVudCBpbnN0cnVjdGlvbnMgZm9yIGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUHJpY2UgICAgICAgICAgICAgICAgfCAvYXBpL3ByaWNlcyAgICAgICAgICAgICAgICAgICAgfCBHZXQgdGhlIGN1cnJlbnQgcHJpY2VzIGZvciBhc3NldHMgb24gdGhlIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBRdW90ZSAgICAgICAgICAgICAgICB8IC9hcGkvcXVvdGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBxdW90ZXMsIHdoaWNoIGFyZSByZXF1aXJlZCB0byBleGVjdXRlIHRyYWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFN5bWJvbCAgICAgICAgICAgICAgIHwgL2FwaS9zeW1ib2xzICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBzeW1ib2xzIHN1cHBvcnRlZCBmb3IgdHJhZGUgKGV4OiBCVEMtVVNEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhZGUgICAgICAgICAgICAgICAgfCAvYXBpL3RyYWRlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgdHJhZGVzLCB3aGljaCBidXkgb3Igc2VsbCBjcnlwdG9jdXJyZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFuc2ZlciAgICAgICAgICAgICB8IC9hcGkvdHJhbnNmZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHRyYW5zZmVycyAoZS5nLiwgZnVuZGluZywgYm9vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFdvcmtmbG93ICAgICAgICAgICAgIHwgL2FwaS93b3JrZmxvd3MgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3Qgd29ya2Zsb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAjIyBVbmRlcnN0YW5kaW5nIE9iamVjdCBNb2RlbHMgJiBFbmRwb2ludHMgICoqT3JnYW5pemF0aW9ucyoqICBBbiBgT3JnYW5pemF0aW9uYCBpcyBtZWFudCB0byByZXByZXNlbnQgdGhlIG9yZ2FuaXphdGlvbiBwYXJ0bmVyaW5nIHdpdGggQ3licmlkIHRvIHVzZSBvdXIgcGxhdGZvcm0uICBBbiBgT3JnYW5pemF0aW9uYCB0eXBpY2FsbHkgZG9lcyBub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCBgY3VzdG9tZXJzYC4gSW5zdGVhZCwgYW4gT3JnYW5pemF0aW9uIGhhcyBvbmUgb3IgbW9yZSBgYmFua3NgLCB3aGljaCBlbmNvbXBhc3MgdGhlIGZpbmFuY2lhbCBzZXJ2aWNlIG9mZmVyaW5ncyBvZiB0aGUgcGxhdGZvcm0uICAqKkJhbmtzKiogIEEgYEJhbmtgIGlzIG93bmVkIGJ5IGFuIGBPcmdhbml6YXRpb25gIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhbiBlbnZpcm9ubWVudCBvciBjb250YWluZXIgZm9yIGBjdXN0b21lcnNgIGFuZCBwcm9kdWN0IG9mZmVyaW5ncy4gQmFua3MgYXJlIGNyZWF0ZWQgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgbW9kZSwgd2hlcmUgYFNhbmRib3hgIGlzIHRoZSBlbnZpcm9ubWVudCB0aGF0IHlvdSB3b3VsZCB0ZXN0LCBwcm90b3R5cGUgYW5kIGJ1aWxkIGluIHByaW9yIHRvIG1vdmluZyB0byBgUHJvZHVjdGlvbmAuICBBbiBgT3JnYW5pemF0aW9uYCBjYW4gaGF2ZSBtdWx0aXBsZSBgYmFua3NgLCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBlbnZpcm9ubWVudHMuIEEgYFNhbmRib3ggQmFua2Agd2lsbCBiZSBiYWNrZWQgYnkgc3R1YmJlZCBkYXRhIGFuZCBwcm9jZXNzIGZsb3dzLiBGb3IgaW5zdGFuY2UsIGZ1bmRpbmcgc291cmNlIHRyYW5zZmVyIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRyYWRlcyB3aWxsIGJlIHNpbXVsYXRlZCByYXRoZXIgdGhhbiBwZXJmb3JtZWQsIGhvd2V2ZXIgYXNzZXQgcHJpY2VzIGFyZSByZXByZXNlbnRhdGl2ZSBvZiByZWFsLXdvcmxkIHZhbHVlcy4gWW91IGhhdmUgYW4gdW5saW1pdGVkIGFtb3VudCBvZiBzaW11bGF0ZWQgZmlhdCBjdXJyZW5jeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gICoqQ3VzdG9tZXJzKiogIGBDdXN0b21lcnNgIHJlcHJlc2VudCB5b3VyIGJhbmtpbmcgdXNlcnMgb24gdGhlIHBsYXRmb3JtLiBBdCBwcmVzZW50LCB3ZSBvZmZlciBzdXBwb3J0IGZvciBgSW5kaXZpZHVhbHNgIGFzIEN1c3RvbWVycy4gIGBDdXN0b21lcnNgIG11c3QgYmUgdmVyaWZpZWQgKGkuZS4sIEtZQ1xcJ2QpIGluIG91ciBzeXN0ZW0gYmVmb3JlIHRoZXkgY2FuIHBsYXkgYW55IHBhcnQgb24gdGhlIHBsYXRmb3JtLCB3aGljaCBtZWFucyB0aGV5IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuZCBhIHBhc3NpbmcgYElkZW50aXR5IFZlcmlmaWNhdGlvbmAuIFNlZSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IGEgY3VzdG9tZXIgY2FuIGJlIHZlcmlmaWVkLiAgYEN1c3RvbWVyc2AgbXVzdCBhbHNvIGhhdmUgYW4gYEFjY291bnRgIHRvIGJlIGFibGUgdG8gdHJhbnNhY3QsIGluIHRoZSBkZXNpcmVkIGFzc2V0IGNsYXNzLiBTZWUgdGhlIEFjY291bnRzIEFQSXMgZm9yIG1vcmUgZGV0YWlscyBvbiBzZXR0aW5nIHVwIGFjY291bnRzIGZvciB0aGUgY3VzdG9tZXIuIFxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiB2MC4xMjMuNDM3XG4gKiBDb250YWN0OiBzdXBwb3J0QGN5YnJpZC5hcHBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uSWRwTW9kZWwgeyBcbiAgICAvKipcbiAgICAgKiBOYW1lIHByb3ZpZGVkIGZvciB0aGUgT0F1dGgyIGFwcGxpY2F0aW9uLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgT0F1dGgyIGFwcGxpY2F0aW9uXFwncyBjbGllbnQgSUQuXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB0aGUgc2NvcGVzIGdyYW50ZWQgdG8gdGhlIE9BdXRoMiBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBzY29wZXM6IEFycmF5PEFwcGxpY2F0aW9uSWRwTW9kZWwuU2NvcGVzRW51bT47XG4gICAgLyoqXG4gICAgICogSVNPODYwMSBkYXRldGltZSB0aGUgcmVjb3JkIHdhcyBjcmVhdGVkIGF0LlxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU084NjAxIGRhdGV0aW1lIHRoZSByZWNvcmQgd2FzIGxhc3QgdXBkYXRlZCBhdC5cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0Pzogc3RyaW5nO1xufVxuZXhwb3J0IG5hbWVzcGFjZSBBcHBsaWNhdGlvbklkcE1vZGVsIHtcbiAgICBleHBvcnQgdHlwZSBTY29wZXNFbnVtID0gJ2FjY291bnRzOmV4ZWN1dGUnIHwgJ2FjY291bnRzOnJlYWQnIHwgJ2JhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUnIHwgJ2JhbmtzOmV4ZWN1dGUnIHwgJ2JhbmtzOnJlYWQnIHwgJ2JhbmtzOndyaXRlJyB8ICdjb3VudGVycGFydGllczpleGVjdXRlJyB8ICdjb3VudGVycGFydGllczpyZWFkJyB8ICdjb3VudGVycGFydGllczp3cml0ZScgfCAnY3VzdG9tZXJzOmV4ZWN1dGUnIHwgJ2N1c3RvbWVyczpyZWFkJyB8ICdjdXN0b21lcnM6d3JpdGUnIHwgJ2RlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUnIHwgJ2RlcG9zaXRfYWRkcmVzc2VzOnJlYWQnIHwgJ2RlcG9zaXRfYmFua19hY2NvdW50czpleGVjdXRlJyB8ICdkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCcgfCAnZXh0ZXJuYWxfYmFua19hY2NvdW50czpleGVjdXRlJyB8ICdleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQnIHwgJ2V4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUnIHwgJ2V4dGVybmFsX3dhbGxldHM6ZXhlY3V0ZScgfCAnZXh0ZXJuYWxfd2FsbGV0czpyZWFkJyB8ICdmaWxlczpleGVjdXRlJyB8ICdmaWxlczpyZWFkJyB8ICdpZGVudGl0eV92ZXJpZmljYXRpb25zOmV4ZWN1dGUnIHwgJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCcgfCAnaWRlbnRpdHlfdmVyaWZpY2F0aW9uczp3cml0ZScgfCAnaW52b2ljZXM6ZXhlY3V0ZScgfCAnaW52b2ljZXM6cmVhZCcgfCAnaW52b2ljZXM6d3JpdGUnIHwgJ29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6ZXhlY3V0ZScgfCAnb3JnYW5pemF0aW9uczpyZWFkJyB8ICdvcmdhbml6YXRpb25zOndyaXRlJyB8ICdwcmljZXM6cmVhZCcgfCAncXVvdGVzOmV4ZWN1dGUnIHwgJ3F1b3RlczpyZWFkJyB8ICdzdWJzY3JpcHRpb25fZXZlbnRzOmV4ZWN1dGUnIHwgJ3N1YnNjcmlwdGlvbl9ldmVudHM6cmVhZCcgfCAnc3Vic2NyaXB0aW9uczpleGVjdXRlJyB8ICdzdWJzY3JpcHRpb25zOnJlYWQnIHwgJ3N1YnNjcmlwdGlvbnM6d3JpdGUnIHwgJ3RyYWRlczpleGVjdXRlJyB8ICd0cmFkZXM6cmVhZCcgfCAndHJhbnNmZXJzOmV4ZWN1dGUnIHwgJ3RyYW5zZmVyczpyZWFkJyB8ICd0cmFuc2ZlcnM6d3JpdGUnIHwgJ3VzZXJzOmV4ZWN1dGUnIHwgJ3VzZXJzOnJlYWQnIHwgJ3dvcmtmbG93czpleGVjdXRlJyB8ICd3b3JrZmxvd3M6cmVhZCc7XG4gICAgZXhwb3J0IGNvbnN0IFNjb3Blc0VudW0gPSB7XG4gICAgICAgIEFjY291bnRzZXhlY3V0ZTogJ2FjY291bnRzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEFjY291bnRzcmVhZDogJ2FjY291bnRzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEJhbmtBcHBsaWNhdGlvbnNleGVjdXRlOiAnYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQmFua3NleGVjdXRlOiAnYmFua3M6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQmFua3NyZWFkOiAnYmFua3M6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQmFua3N3cml0ZTogJ2JhbmtzOndyaXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDb3VudGVycGFydGllc2V4ZWN1dGU6ICdjb3VudGVycGFydGllczpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDb3VudGVycGFydGllc3JlYWQ6ICdjb3VudGVycGFydGllczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDb3VudGVycGFydGllc3dyaXRlOiAnY291bnRlcnBhcnRpZXM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEN1c3RvbWVyc2V4ZWN1dGU6ICdjdXN0b21lcnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQ3VzdG9tZXJzcmVhZDogJ2N1c3RvbWVyczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDdXN0b21lcnN3cml0ZTogJ2N1c3RvbWVyczp3cml0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRGVwb3NpdEFkZHJlc3Nlc2V4ZWN1dGU6ICdkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBEZXBvc2l0QWRkcmVzc2VzcmVhZDogJ2RlcG9zaXRfYWRkcmVzc2VzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIERlcG9zaXRCYW5rQWNjb3VudHNleGVjdXRlOiAnZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIERlcG9zaXRCYW5rQWNjb3VudHNyZWFkOiAnZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEV4dGVybmFsQmFua0FjY291bnRzZXhlY3V0ZTogJ2V4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRXh0ZXJuYWxCYW5rQWNjb3VudHNyZWFkOiAnZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBFeHRlcm5hbEJhbmtBY2NvdW50c3dyaXRlOiAnZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRXh0ZXJuYWxXYWxsZXRzZXhlY3V0ZTogJ2V4dGVybmFsX3dhbGxldHM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRXh0ZXJuYWxXYWxsZXRzcmVhZDogJ2V4dGVybmFsX3dhbGxldHM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRmlsZXNleGVjdXRlOiAnZmlsZXM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRmlsZXNyZWFkOiAnZmlsZXM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgSWRlbnRpdHlWZXJpZmljYXRpb25zZXhlY3V0ZTogJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgSWRlbnRpdHlWZXJpZmljYXRpb25zcmVhZDogJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgSWRlbnRpdHlWZXJpZmljYXRpb25zd3JpdGU6ICdpZGVudGl0eV92ZXJpZmljYXRpb25zOndyaXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBJbnZvaWNlc2V4ZWN1dGU6ICdpbnZvaWNlczpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBJbnZvaWNlc3JlYWQ6ICdpbnZvaWNlczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBJbnZvaWNlc3dyaXRlOiAnaW52b2ljZXM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uc2V4ZWN1dGU6ICdvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIE9yZ2FuaXphdGlvbnNyZWFkOiAnb3JnYW5pemF0aW9uczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBPcmdhbml6YXRpb25zd3JpdGU6ICdvcmdhbml6YXRpb25zOndyaXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBQcmljZXNyZWFkOiAncHJpY2VzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFF1b3Rlc2V4ZWN1dGU6ICdxdW90ZXM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgUXVvdGVzcmVhZDogJ3F1b3RlczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBTdWJzY3JpcHRpb25FdmVudHNleGVjdXRlOiAnc3Vic2NyaXB0aW9uX2V2ZW50czpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBTdWJzY3JpcHRpb25FdmVudHNyZWFkOiAnc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBTdWJzY3JpcHRpb25zZXhlY3V0ZTogJ3N1YnNjcmlwdGlvbnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgU3Vic2NyaXB0aW9uc3JlYWQ6ICdzdWJzY3JpcHRpb25zOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFN1YnNjcmlwdGlvbnN3cml0ZTogJ3N1YnNjcmlwdGlvbnM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFRyYWRlc2V4ZWN1dGU6ICd0cmFkZXM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgVHJhZGVzcmVhZDogJ3RyYWRlczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBUcmFuc2ZlcnNleGVjdXRlOiAndHJhbnNmZXJzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFRyYW5zZmVyc3JlYWQ6ICd0cmFuc2ZlcnM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgVHJhbnNmZXJzd3JpdGU6ICd0cmFuc2ZlcnM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFVzZXJzZXhlY3V0ZTogJ3VzZXJzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFVzZXJzcmVhZDogJ3VzZXJzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFdvcmtmbG93c2V4ZWN1dGU6ICd3b3JrZmxvd3M6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgV29ya2Zsb3dzcmVhZDogJ3dvcmtmbG93czpyZWFkJyBhcyBTY29wZXNFbnVtXG4gICAgfTtcbn1cblxuXG4iXX0=
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tb2RlbC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBeUJILE1BQU0sS0FBVyxtQkFBbUIsQ0FxRG5DO0FBckRELFdBQWlCLG1CQUFtQjtJQUVuQiw4QkFBVSxHQUFHO1FBQ3RCLGVBQWUsRUFBRSxrQkFBZ0M7UUFDakQsWUFBWSxFQUFFLGVBQTZCO1FBQzNDLHVCQUF1QixFQUFFLDJCQUF5QztRQUNsRSxZQUFZLEVBQUUsZUFBNkI7UUFDM0MsU0FBUyxFQUFFLFlBQTBCO1FBQ3JDLFVBQVUsRUFBRSxhQUEyQjtRQUN2QyxxQkFBcUIsRUFBRSx3QkFBc0M7UUFDN0Qsa0JBQWtCLEVBQUUscUJBQW1DO1FBQ3ZELG1CQUFtQixFQUFFLHNCQUFvQztRQUN6RCxnQkFBZ0IsRUFBRSxtQkFBaUM7UUFDbkQsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QyxjQUFjLEVBQUUsaUJBQStCO1FBQy9DLHVCQUF1QixFQUFFLDJCQUF5QztRQUNsRSxvQkFBb0IsRUFBRSx3QkFBc0M7UUFDNUQsMEJBQTBCLEVBQUUsK0JBQTZDO1FBQ3pFLHVCQUF1QixFQUFFLDRCQUEwQztRQUNuRSwyQkFBMkIsRUFBRSxnQ0FBOEM7UUFDM0Usd0JBQXdCLEVBQUUsNkJBQTJDO1FBQ3JFLHlCQUF5QixFQUFFLDhCQUE0QztRQUN2RSxzQkFBc0IsRUFBRSwwQkFBd0M7UUFDaEUsbUJBQW1CLEVBQUUsdUJBQXFDO1FBQzFELFlBQVksRUFBRSxlQUE2QjtRQUMzQyxTQUFTLEVBQUUsWUFBMEI7UUFDckMsNEJBQTRCLEVBQUUsZ0NBQThDO1FBQzVFLHlCQUF5QixFQUFFLDZCQUEyQztRQUN0RSwwQkFBMEIsRUFBRSw4QkFBNEM7UUFDeEUsZUFBZSxFQUFFLGtCQUFnQztRQUNqRCxZQUFZLEVBQUUsZUFBNkI7UUFDM0MsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QywrQkFBK0IsRUFBRSxtQ0FBaUQ7UUFDbEYsaUJBQWlCLEVBQUUsb0JBQWtDO1FBQ3JELGtCQUFrQixFQUFFLHFCQUFtQztRQUN2RCxVQUFVLEVBQUUsYUFBMkI7UUFDdkMsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QyxVQUFVLEVBQUUsYUFBMkI7UUFDdkMseUJBQXlCLEVBQUUsNkJBQTJDO1FBQ3RFLHNCQUFzQixFQUFFLDBCQUF3QztRQUNoRSxvQkFBb0IsRUFBRSx1QkFBcUM7UUFDM0QsaUJBQWlCLEVBQUUsb0JBQWtDO1FBQ3JELGtCQUFrQixFQUFFLHFCQUFtQztRQUN2RCxhQUFhLEVBQUUsZ0JBQThCO1FBQzdDLFVBQVUsRUFBRSxhQUEyQjtRQUN2QyxnQkFBZ0IsRUFBRSxtQkFBaUM7UUFDbkQsYUFBYSxFQUFFLGdCQUE4QjtRQUM3QyxjQUFjLEVBQUUsaUJBQStCO1FBQy9DLFlBQVksRUFBRSxlQUE2QjtRQUMzQyxTQUFTLEVBQUUsWUFBMEI7UUFDckMsZ0JBQWdCLEVBQUUsbUJBQWlDO1FBQ25ELGFBQWEsRUFBRSxnQkFBOEI7S0FDaEQsQ0FBQztBQUNOLENBQUMsRUFyRGdCLG1CQUFtQixLQUFuQixtQkFBbUIsUUFxRG5DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDeWJyaWQgSWRlbnRpdHkgQVBJXG4gKiAjIEN5YnJpZCBBUEkgZG9jdW1lbnRhdGlvbiAgV2VsY29tZSB0byBDeWJyaWQsIGFuIGFsbC1pbi1vbmUgY3J5cHRvIHBsYXRmb3JtIHRoYXQgZW5hYmxlcyB5b3UgdG8gZWFzaWx5ICoqYnVpbGQqKiBhbmQgKipsYXVuY2gqKiB3aGl0ZS1sYWJlbCBjcnlwdG8gcHJvZHVjdHMgb3Igc2VydmljZXMuICBJbiB0aGVzZSBkb2N1bWVudHMsIHlvdVxcJ2xsIGZpbmQgZGV0YWlscyBvbiBob3cgb3VyIFJFU1QgQVBJIG9wZXJhdGVzIGFuZCBnZW5lcmFsbHkgaG93IG91ciBwbGF0Zm9ybSBmdW5jdGlvbnMuICBJZiB5b3VcXCdyZSBsb29raW5nIGZvciBvdXIgVUkgU0RLIFdpZGdldHMgZm9yIFdlYiBvciBNb2JpbGUgKGlPUy9BbmRyb2lkKSwgZ2VuZXJhdGVkIEFQSSBjbGllbnRzLCBvciBkZW1vIGFwcGxpY2F0aW9ucywgaGVhZCBvdmVyIHRvIG91ciBbR2l0aHViIHJlcG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwKS4gIPCfkqEgV2UgcmVjb21tZW5kIGJvb2ttYXJraW5nIHRoZSBbQ3licmlkIExpbmtUcmVlXShodHRwczovL2xpbmt0ci5lZS9jeWJyaWR0ZWNobm9sb2dpZXMpIHdoaWNoIGNvbnRhaW5zIG1hbnkgaGVscGZ1bCBsaW5rcyB0byBwbGF0Zm9ybSByZXNvdXJjZXMuICAjIyBHZXR0aW5nIFN0YXJ0ZWQgIFRoaXMgaXMgQ3licmlkXFwncyBwdWJsaWMgaW50ZXJhY3RpdmUgQVBJIGRvY3VtZW50YXRpb24sIHdoaWNoIGFsbG93cyB5b3UgdG8gZnVsbHkgdGVzdCBvdXIgQVBJcy4gSWYgeW91XFwnZCBsaWtlIHRvIHVzZSBhIGRpZmZlcmVudCB0b29sIHRvIGV4ZXJjaXNlIG91ciBBUElzLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBbT3BlbiBBUEkgMy4wIHlhbWxdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS92MS9zd2FnZ2VyLnlhbWwpIGZvciBpbXBvcnQuICBJZiB5b3VcXCdyZSBuZXcgdG8gb3VyIEFQSXMgYW5kIHRoZSBDeWJyaWQgUGxhdGZvcm0sIGZvbGxvdyB0aGUgYmVsb3cgZ3VpZGVzIHRvIGdldCBzZXQgdXAgYW5kIGZhbWlsaWFyIHdpdGggdGhlIHBsYXRmb3JtOiAgMS4gW0ludHJvZHVjdGlvbl0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy9pbnRyb2R1Y3Rpb24pIDIuIFtQbGF0Zm9ybSBJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWlzLWN5YnJpZC1hcmNoaXRlY3RlZCkgMy4gW1Rlc3Rpbmcgd2l0aCBIb3N0ZWQgV2ViIERlbW8gQXBwXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3Rlc3Rpbmctd2l0aC1ob3N0ZWQtd2ViLWRlbW8tYXBwKSAgSW4gW0dldHRpbmcgU3RhcnRlZCBpbiB0aGUgQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG93LWRvLWktZ2V0LXN0YXJ0ZWQtd2l0aC10aGUtc2FuZGJveCksIHdlIHdhbGsgeW91IHRocm91Z2ggaG93IHRvIHVzZSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnNhbmRib3guY3licmlkLmFwcC8pIHRvIGNyZWF0ZSBhIHRlc3QgYmFuayBhbmQgZ2VuZXJhdGUgQVBJIGtleXMuIEluIFtHZXR0aW5nIFJlYWR5IGZvciBUcmFkaW5nXShodHRwczovL2tiLmN5YnJpZC54eXovZ2V0dGluZy1yZWFkeS1mb3ItdHJhZGluZyksIHdlIHdhbGsgdGhyb3VnaCBjcmVhdGluZyBjdXN0b21lcnMsIGN1c3RvbWVyIGlkZW50aXRpZXMsIGFjY291bnRzLCBhcyB3ZWxsIGFzIGV4ZWN1dGluZyBxdW90ZXMgYW5kIHRyYWRlcy4gICMjIFdvcmtpbmcgd2l0aCB0aGUgQ3licmlkIFBsYXRmb3JtICBUaGVyZSBhcmUgdGhyZWUgcHJpbWFyeSB3YXlzIHlvdSBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgQ3licmlkIHBsYXRmb3JtOiAgMS4gRGlyZWN0bHkgdmlhIG91ciBSRVNUZnVsIEFQSSAodGhpcyBkb2N1bWVudGF0aW9uKSAyLiBVc2luZyBvdXIgQVBJIGNsaWVudHMgYXZhaWxhYmxlIGluIGEgdmFyaWV0eSBvZiBsYW5ndWFnZXMgKFtBbmd1bGFyXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstYW5ndWxhciksIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstamF2YSksIFtLb3RsaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1rb3RsaW4pLCBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcHl0aG9uKSwgW1J1YnldKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1ydWJ5KSwgW1N3aWZ0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstc3dpZnQpIG9yIFtUeXBlc2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstdHlwZXNjcmlwdCkpIDMuIEludGVncmF0aW5nIGEgcGxhdGZvcm0gc3BlY2lmaWMgU0RLIChbV2ViXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLXdlYiksIFtBbmRyb2lkXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWFuZHJvaWQpLCBbaU9TXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtc2RrLWlvcykpICBPdXIgY29tcGxldGUgc2V0IG9mIEFQSXMgYWxsb3dzIHlvdSB0byBtYW5hZ2UgcmVzb3VyY2VzIGFjcm9zcyB0aHJlZSBkaXN0aW5jdCBhcmVhczogeW91ciBgT3JnYW5pemF0aW9uYCwgeW91ciBgQmFua3NgIGFuZCB5b3VyIGBJZGVudGl0aWVzYC4gRm9yIG1vc3Qgb2YgeW91ciB0ZXN0aW5nIGFuZCBpbnRlcmFjdGlvbiB5b3VcXCdsbCBiZSB1c2luZyB0aGUgYEJhbmtgIEFQSSwgd2hpY2ggaXMgd2hlcmUgdGhlIG1ham9yaXR5IG9mIEFQSXMgcmVzaWRlLiAgKlRoZSBjb21wbGV0ZSBzZXQgb2YgQVBJcyBjYW4gYmUgZm91bmQgb24gdGhlIGZvbGxvd2luZyBwYWdlczoqICB8IEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgfCBbT3JnYW5pemF0aW9uIEFQSV0oaHR0cHM6Ly9vcmdhbml6YXRpb24ucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBbQmFuayBBUEldKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIGJhbmtzIChhbmQgYWxsIGRvd25zdHJlYW0gY3VzdG9tZXIgYWN0aXZpdHkpIHwgfCBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgICAgIHwgQVBJcyB0byBtYW5hZ2Ugb3JnYW5pemF0aW9uIGFuZCBiYW5rIGlkZW50aXRpZXMgICAgICAgICAgICAgfCAgRm9yIHF1ZXN0aW9ucyBwbGVhc2UgY29udGFjdCBbU3VwcG9ydF0obWFpbHRvOnN1cHBvcnRAY3licmlkLnh5eikgYXQgYW55IHRpbWUgZm9yIGFzc2lzdGFuY2UsIG9yIGNvbnRhY3QgdGhlIFtQcm9kdWN0IFRlYW1dKG1haWx0bzpwcm9kdWN0QGN5YnJpZC54eXopIGZvciBwcm9kdWN0IHN1Z2dlc3Rpb25zLiAgIyMgQXV0aGVudGljYXRpbmcgd2l0aCB0aGUgQVBJICBUaGUgQ3licmlkIFBsYXRmb3JtIHVzZXMgT0F1dGggMi4wIEJlYXJlciBUb2tlbnMgdG8gYXV0aGVudGljYXRlIHJlcXVlc3RzIHRvIHRoZSBwbGF0Zm9ybS4gQ3JlZGVudGlhbHMgdG8gY3JlYXRlIGBPcmdhbml6YXRpb25gIGFuZCBgQmFua2AgdG9rZW5zIGNhbiBiZSBnZW5lcmF0ZWQgdmlhIHRoZSBbQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwKS4gQWNjZXNzIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIGZvciBhIGBDdXN0b21lcmAgYXMgd2VsbCB2aWEgdGhlIFtDeWJyaWQgSWRQXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkgYXMgd2VsbC4gIEFuIGBPcmdhbml6YXRpb25gIGFjY2VzcyB0b2tlbiBhcHBsaWVzIGJyb2FkbHkgdG8gdGhlIHdob2xlIE9yZ2FuaXphdGlvbiBhbmQgYWxsIG9mIGl0cyBgQmFua3NgLCB3aGVyZWFzLCBhIGBCYW5rYCBhY2Nlc3MgdG9rZW4gaXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBCYW5rLiBgQ3VzdG9tZXJgIHRva2Vucywgc2ltaWxhcmx5LCBhcmUgc2NvcGVkIHRvIGEgc3BlY2lmaWMgY3VzdG9tZXIgaW4gYSBiYW5rLiAgQm90aCBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgT0F1dGggQ2xpZW50IENyZWRlbnRpYWwgR3JhbnQgZmxvdy4gRWFjaCBPcmdhbml6YXRpb24gYW5kIEJhbmsgaGFzIGl0cyBvd24gdW5pcXVlIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCB0aGF0IGFsbG93cyBmb3IgbWFjaGluZS10by1tYWNoaW5lIGF1dGhlbnRpY2F0aW9uLiAgQSBgQmFua2AgY2FuIHRoZW4gZ2VuZXJhdGUgYEN1c3RvbWVyYCBhY2Nlc3MgdG9rZW5zIHZpYSBBUEkgdXNpbmcgb3VyIFtJZGVudGl0aWVzIEFQSV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKS4gIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5ldmVyIHNoYXJlIHlvdXIgQ2xpZW50IElEIG9yIFNlY3JldCBwdWJsaWNseSBvciBpbiB5b3VyIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkuKio8L2ZvbnQ+ICBZb3VyIGBDbGllbnQgSURgIGFuZCBgU2VjcmV0YCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhIHRpbWUtbGltaXRlZCBgQmVhcmVyIFRva2VuYCBieSBpbnRlcmFjdGluZyB3aXRoIHRoZSBDeWJyaWQgSWRlbnRpdHkgUHJvdmlkZXIgb3IgdGhyb3VnaCBpbnRlcmFjdGluZyB3aXRoIHRoZSAqKkF1dGhvcml6ZSoqIGJ1dHRvbiBpbiB0aGlzIGRvY3VtZW50LiAgVGhlIGZvbGxvd2luZyBjdXJsIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBnZW5lcmF0ZSBhIGBCZWFyZXIgVG9rZW5gIGZvciB1c2UgaW4gdGVzdGluZyB0aGUgQVBJIG9yIGRlbW8gYXBwbGljYXRpb25zLiAgYGBgICMgRXhhbXBsZSByZXF1ZXN0IHdoZW4gdXNpbmcgQmFuayBjcmVkZW50aWFscyBjdXJsIC1YIFBPU1QgaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvb2F1dGgvdG9rZW4gLWQgXFwneyAgICAgXFxcImdyYW50X3R5cGVcXFwiOiBcXFwiY2xpZW50X2NyZWRlbnRpYWxzXFxcIiwgICAgIFxcXCJjbGllbnRfaWRcXFwiOiBcXFwiPFlvdXIgQ2xpZW50IElEPlxcXCIsICAgICBcXFwiY2xpZW50X3NlY3JldFxcXCI6IFxcXCI8WW91ciBTZWNyZXQ+XFxcIiwgICAgIFxcXCJzY29wZVxcXCI6IFxcXCJiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgYWNjb3VudHM6cmVhZCBhY2NvdW50czpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6d3JpdGUgY291bnRlcnBhcnRpZXM6ZXhlY3V0ZSBjdXN0b21lcnM6cmVhZCBjdXN0b21lcnM6d3JpdGUgY3VzdG9tZXJzOmV4ZWN1dGUgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOmV4ZWN1dGUgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIGZpbGVzOnJlYWQgZmlsZXM6ZXhlY3V0ZVxcXCIgICB9XFwnIC1IIFxcXCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXFwiICAjIFdoZW4gdXNpbmcgT3JnYW5pemF0aW9uIGNyZWRlbnRpYWxzIHNldCBgc2NvcGVgIHRvIFxcJ29yZ2FuaXphdGlvbnM6cmVhZCBvcmdhbml6YXRpb25zOndyaXRlIG9yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6ZXhlY3V0ZSBiYW5rczpyZWFkIGJhbmtzOndyaXRlIGJhbmtzOmV4ZWN1dGUgYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZSB1c2VyczpyZWFkIHVzZXJzOmV4ZWN1dGUgY291bnRlcnBhcnRpZXM6cmVhZCBjdXN0b21lcnM6cmVhZCBhY2NvdW50czpyZWFkIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpyZWFkIHRyYW5zZmVyczp3cml0ZSB0cmFuc2ZlcnM6ZXhlY3V0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIHdvcmtmbG93czpyZWFkIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQgaW52b2ljZXM6cmVhZCBzdWJzY3JpcHRpb25zOnJlYWQgc3Vic2NyaXB0aW9uczp3cml0ZSBzdWJzY3JpcHRpb25zOmV4ZWN1dGUgc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkIHN1YnNjcmlwdGlvbl9ldmVudHM6ZXhlY3V0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOnJlYWQgZmlsZXM6cmVhZCBmaWxlczpleGVjdXRlXFwnIGBgYCA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOb3RlOiBUaGUgYWJvdmUgY3VybCB3aWxsIGNyZWF0ZSBhIGJlYXJlciB0b2tlbiB3aXRoIGZ1bGwgc2NvcGUgYWNjZXNzLiBEZWxldGUgc2NvcGVzIGlmIHlvdVxcJ2QgbGlrZSB0byByZXN0cmljdCBhY2Nlc3MuKio8L2ZvbnQ+ICAjIyBBdXRoZW50aWNhdGlvbiBTY29wZXMgIFRoZSBDeWJyaWQgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIHVzZSBvZiBzY29wZXMgdG8gY29udHJvbCB0aGUgbGV2ZWwgb2YgYWNjZXNzIGEgdG9rZW4gaXMgbGltaXRlZCB0by4gU2NvcGVzIGRvIG5vdCBncmFudCBhY2Nlc3MgdG8gcmVzb3VyY2VzOyBpbnN0ZWFkLCB0aGV5IHByb3ZpZGUgbGltaXRzLCBpbiBzdXBwb3J0IG9mIHRoZSBsZWFzdCBwcml2aWxlZ2UgcHJpbmNpcGFsLiAgVGhlIGZvbGxvd2luZyBzY29wZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0gYW5kIGNhbiBiZSByZXF1ZXN0ZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBhbiBPcmdhbml6YXRpb24sIEJhbmsgb3IgQ3VzdG9tZXIgdG9rZW4uIEdlbmVyYWxseSBzcGVha2luZywgdGhlIF9SZWFkXyBzY29wZSBpcyByZXF1aXJlZCB0byByZWFkIGFuZCBsaXN0IHJlc291cmNlcywgdGhlIF9Xcml0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIGEgcmVzb3VyY2UgYW5kIHRoZSBfRXhlY3V0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcmVzb3VyY2UuICB8IFJlc291cmNlICAgICAgICAgICAgICB8IFJlYWQgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXcml0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgfCBFeGVjdXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEFjY291bnQgICAgICAgICAgICAgICB8IGFjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICAgICAgICAgICB8IGJhbmtzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYW5rczp3cml0ZSAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgfCBiYW5rczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IEN1c3RvbWVyICAgICAgICAgICAgICB8IGN1c3RvbWVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IENvdW50ZXJwYXJ0eSAgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgfCB8IERlcG9zaXQgQWRkcmVzcyAgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgfCB8IEV4dGVybmFsIEJhbmsgQWNjb3VudCB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIChCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgfCB8IEV4dGVybmFsIFdhbGxldCAgICAgICB8IGV4dGVybmFsX3dhbGxldDpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvcmdhbml6YXRpb25zOndyaXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFVzZXIgICAgICAgICAgICAgICAgICB8IHVzZXJzOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2VyczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IFByaWNlICAgICAgICAgICAgICAgICB8IHByaWNlczpyZWFkIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFF1b3RlICAgICAgICAgICAgICAgICB8IHF1b3RlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxdW90ZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYWRlICAgICAgICAgICAgICAgICB8IHRyYWRlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFkZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYW5zZmVyICAgICAgICAgICAgICB8IHRyYW5zZmVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCB8IFdvcmtmbG93ICAgICAgICAgICAgICB8IHdvcmtmbG93czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCB8IEludm9pY2UgICAgICAgICAgICAgICB8IGludm9pY2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCAgIyMgQXZhaWxhYmxlIEVuZHBvaW50cyAgVGhlIGF2YWlsYWJsZSBBUElzIGZvciB0aGUgW0lkZW50aXR5XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLCBbT3JnYW5pemF0aW9uXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBhbmQgW0JhbmtdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBBUEkgc2VydmljZXMgYXJlIGxpc3RlZCBiZWxvdzogIHwgQVBJIFNlcnZpY2UgIHwgTW9kZWwgICAgICAgICAgICAgICAgfCBBUEkgRW5kcG9pbnQgUGF0aCAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IElkZW50aXR5ICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rX2FwcGxpY2F0aW9ucyAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGJhbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgQ3VzdG9tZXJUb2tlbiAgICAgICAgfCAvYXBpL2N1c3RvbWVyX3Rva2VucyAgICAgICAgICAgfCBDcmVhdGUgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9ucyB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS91c2VycyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbiB1c2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgT3JnYW5pemF0aW9uIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbnMgICAgICAgICAgICAgfCBBUElzIHRvIHJldHJpZXZlIGFuZCB1cGRhdGUgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBY2NvdW50ICAgICAgICAgICAgICB8IC9hcGkvYWNjb3VudHMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBhY2NvdW50cywgd2hpY2ggaG9sZCBhIHNwZWNpZmljIGFzc2V0IGZvciBhIGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFzc2V0ICAgICAgICAgICAgICAgIHwgL2FwaS9hc3NldHMgICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBhc3NldHMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSAoZXg6IEJUQywgRVRIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIHVwZGF0ZSBhbmQgbGlzdCBiYW5rcywgdGhlIHBhcmVudCB0byBjdXN0b21lcnMsIGFjY291bnRzLCBldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDdXN0b21lciAgICAgICAgICAgICB8IC9hcGkvY3VzdG9tZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IENvdW50ZXJwYXJ0eSAgICAgICAgIHwgL2FwaS9jb3VudGVycGFydGllcyAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGNvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRGVwb3NpdEFkZHJlc3MgICAgICAgfCAvYXBpL2RlcG9zaXRfYWRkcmVzc2VzICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBkZXBvc2l0IGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbEJhbmtBY2NvdW50ICB8IC9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cyAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGV4dGVybmFsIGJhbmsgYWNjb3VudHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgYmFuayBhY2NvdW50cyB0byB0aGUgcGxhdGZvcm0gfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsV2FsbGV0ICAgICAgIHwgL2FwaS9leHRlcm5hbF93YWxsZXRzICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGxpc3QgYW5kIGRlbGV0ZSBleHRlcm5hbCB3YWxsZXRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIHdhbGxldHMgdG8gdGhlIHBsYXRmb3JtICAgICB8IHwgQmFuayAgICAgICAgIHwgSWRlbnRpdHlWZXJpZmljYXRpb24gfCAvYXBpL2lkZW50aXR5X3ZlcmlmaWNhdGlvbnMgICAgfCBDcmVhdGUgYW5kIGxpc3QgaWRlbnRpdHkgdmVyaWZpY2F0aW9ucywgd2hpY2ggYXJlIHBlcmZvcm1lZCBvbiBjdXN0b21lcnMgZm9yIEtZQyAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBJbnZvaWNlICAgICAgICAgICAgICB8IC9hcGkvaW52b2ljZXMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBjYW5jZWwgYW5kIGxpc3QgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFBheW1lbnRJbnN0cnVjdGlvbiAgIHwgL2FwaS9wYXltZW50X2luc3RydWN0aW9ucyAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgcGF5bWVudCBpbnN0cnVjdGlvbnMgZm9yIGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUHJpY2UgICAgICAgICAgICAgICAgfCAvYXBpL3ByaWNlcyAgICAgICAgICAgICAgICAgICAgfCBHZXQgdGhlIGN1cnJlbnQgcHJpY2VzIGZvciBhc3NldHMgb24gdGhlIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBRdW90ZSAgICAgICAgICAgICAgICB8IC9hcGkvcXVvdGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBxdW90ZXMsIHdoaWNoIGFyZSByZXF1aXJlZCB0byBleGVjdXRlIHRyYWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFN5bWJvbCAgICAgICAgICAgICAgIHwgL2FwaS9zeW1ib2xzICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBzeW1ib2xzIHN1cHBvcnRlZCBmb3IgdHJhZGUgKGV4OiBCVEMtVVNEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhZGUgICAgICAgICAgICAgICAgfCAvYXBpL3RyYWRlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgdHJhZGVzLCB3aGljaCBidXkgb3Igc2VsbCBjcnlwdG9jdXJyZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFuc2ZlciAgICAgICAgICAgICB8IC9hcGkvdHJhbnNmZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHRyYW5zZmVycyAoZS5nLiwgZnVuZGluZywgYm9vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFdvcmtmbG93ICAgICAgICAgICAgIHwgL2FwaS93b3JrZmxvd3MgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3Qgd29ya2Zsb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAjIyBVbmRlcnN0YW5kaW5nIE9iamVjdCBNb2RlbHMgJiBFbmRwb2ludHMgICoqT3JnYW5pemF0aW9ucyoqICBBbiBgT3JnYW5pemF0aW9uYCBpcyBtZWFudCB0byByZXByZXNlbnQgdGhlIG9yZ2FuaXphdGlvbiBwYXJ0bmVyaW5nIHdpdGggQ3licmlkIHRvIHVzZSBvdXIgcGxhdGZvcm0uICBBbiBgT3JnYW5pemF0aW9uYCB0eXBpY2FsbHkgZG9lcyBub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCBgY3VzdG9tZXJzYC4gSW5zdGVhZCwgYW4gT3JnYW5pemF0aW9uIGhhcyBvbmUgb3IgbW9yZSBgYmFua3NgLCB3aGljaCBlbmNvbXBhc3MgdGhlIGZpbmFuY2lhbCBzZXJ2aWNlIG9mZmVyaW5ncyBvZiB0aGUgcGxhdGZvcm0uICAqKkJhbmtzKiogIEEgYEJhbmtgIGlzIG93bmVkIGJ5IGFuIGBPcmdhbml6YXRpb25gIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhbiBlbnZpcm9ubWVudCBvciBjb250YWluZXIgZm9yIGBjdXN0b21lcnNgIGFuZCBwcm9kdWN0IG9mZmVyaW5ncy4gQmFua3MgYXJlIGNyZWF0ZWQgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgbW9kZSwgd2hlcmUgYFNhbmRib3hgIGlzIHRoZSBlbnZpcm9ubWVudCB0aGF0IHlvdSB3b3VsZCB0ZXN0LCBwcm90b3R5cGUgYW5kIGJ1aWxkIGluIHByaW9yIHRvIG1vdmluZyB0byBgUHJvZHVjdGlvbmAuICBBbiBgT3JnYW5pemF0aW9uYCBjYW4gaGF2ZSBtdWx0aXBsZSBgYmFua3NgLCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBlbnZpcm9ubWVudHMuIEEgYFNhbmRib3ggQmFua2Agd2lsbCBiZSBiYWNrZWQgYnkgc3R1YmJlZCBkYXRhIGFuZCBwcm9jZXNzIGZsb3dzLiBGb3IgaW5zdGFuY2UsIGZ1bmRpbmcgc291cmNlIHRyYW5zZmVyIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRyYWRlcyB3aWxsIGJlIHNpbXVsYXRlZCByYXRoZXIgdGhhbiBwZXJmb3JtZWQsIGhvd2V2ZXIgYXNzZXQgcHJpY2VzIGFyZSByZXByZXNlbnRhdGl2ZSBvZiByZWFsLXdvcmxkIHZhbHVlcy4gWW91IGhhdmUgYW4gdW5saW1pdGVkIGFtb3VudCBvZiBzaW11bGF0ZWQgZmlhdCBjdXJyZW5jeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gICoqQ3VzdG9tZXJzKiogIGBDdXN0b21lcnNgIHJlcHJlc2VudCB5b3VyIGJhbmtpbmcgdXNlcnMgb24gdGhlIHBsYXRmb3JtLiBBdCBwcmVzZW50LCB3ZSBvZmZlciBzdXBwb3J0IGZvciBgSW5kaXZpZHVhbHNgIGFzIEN1c3RvbWVycy4gIGBDdXN0b21lcnNgIG11c3QgYmUgdmVyaWZpZWQgKGkuZS4sIEtZQ1xcJ2QpIGluIG91ciBzeXN0ZW0gYmVmb3JlIHRoZXkgY2FuIHBsYXkgYW55IHBhcnQgb24gdGhlIHBsYXRmb3JtLCB3aGljaCBtZWFucyB0aGV5IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuZCBhIHBhc3NpbmcgYElkZW50aXR5IFZlcmlmaWNhdGlvbmAuIFNlZSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IGEgY3VzdG9tZXIgY2FuIGJlIHZlcmlmaWVkLiAgYEN1c3RvbWVyc2AgbXVzdCBhbHNvIGhhdmUgYW4gYEFjY291bnRgIHRvIGJlIGFibGUgdG8gdHJhbnNhY3QsIGluIHRoZSBkZXNpcmVkIGFzc2V0IGNsYXNzLiBTZWUgdGhlIEFjY291bnRzIEFQSXMgZm9yIG1vcmUgZGV0YWlscyBvbiBzZXR0aW5nIHVwIGFjY291bnRzIGZvciB0aGUgY3VzdG9tZXIuIFxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiB2MC4xMjMuNDM4XG4gKiBDb250YWN0OiBzdXBwb3J0QGN5YnJpZC5hcHBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uSWRwTW9kZWwgeyBcbiAgICAvKipcbiAgICAgKiBOYW1lIHByb3ZpZGVkIGZvciB0aGUgT0F1dGgyIGFwcGxpY2F0aW9uLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgT0F1dGgyIGFwcGxpY2F0aW9uXFwncyBjbGllbnQgSUQuXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB0aGUgc2NvcGVzIGdyYW50ZWQgdG8gdGhlIE9BdXRoMiBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBzY29wZXM6IEFycmF5PEFwcGxpY2F0aW9uSWRwTW9kZWwuU2NvcGVzRW51bT47XG4gICAgLyoqXG4gICAgICogSVNPODYwMSBkYXRldGltZSB0aGUgcmVjb3JkIHdhcyBjcmVhdGVkIGF0LlxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU084NjAxIGRhdGV0aW1lIHRoZSByZWNvcmQgd2FzIGxhc3QgdXBkYXRlZCBhdC5cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0Pzogc3RyaW5nO1xufVxuZXhwb3J0IG5hbWVzcGFjZSBBcHBsaWNhdGlvbklkcE1vZGVsIHtcbiAgICBleHBvcnQgdHlwZSBTY29wZXNFbnVtID0gJ2FjY291bnRzOmV4ZWN1dGUnIHwgJ2FjY291bnRzOnJlYWQnIHwgJ2JhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUnIHwgJ2JhbmtzOmV4ZWN1dGUnIHwgJ2JhbmtzOnJlYWQnIHwgJ2JhbmtzOndyaXRlJyB8ICdjb3VudGVycGFydGllczpleGVjdXRlJyB8ICdjb3VudGVycGFydGllczpyZWFkJyB8ICdjb3VudGVycGFydGllczp3cml0ZScgfCAnY3VzdG9tZXJzOmV4ZWN1dGUnIHwgJ2N1c3RvbWVyczpyZWFkJyB8ICdjdXN0b21lcnM6d3JpdGUnIHwgJ2RlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUnIHwgJ2RlcG9zaXRfYWRkcmVzc2VzOnJlYWQnIHwgJ2RlcG9zaXRfYmFua19hY2NvdW50czpleGVjdXRlJyB8ICdkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCcgfCAnZXh0ZXJuYWxfYmFua19hY2NvdW50czpleGVjdXRlJyB8ICdleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQnIHwgJ2V4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUnIHwgJ2V4dGVybmFsX3dhbGxldHM6ZXhlY3V0ZScgfCAnZXh0ZXJuYWxfd2FsbGV0czpyZWFkJyB8ICdmaWxlczpleGVjdXRlJyB8ICdmaWxlczpyZWFkJyB8ICdpZGVudGl0eV92ZXJpZmljYXRpb25zOmV4ZWN1dGUnIHwgJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCcgfCAnaWRlbnRpdHlfdmVyaWZpY2F0aW9uczp3cml0ZScgfCAnaW52b2ljZXM6ZXhlY3V0ZScgfCAnaW52b2ljZXM6cmVhZCcgfCAnaW52b2ljZXM6d3JpdGUnIHwgJ29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6ZXhlY3V0ZScgfCAnb3JnYW5pemF0aW9uczpyZWFkJyB8ICdvcmdhbml6YXRpb25zOndyaXRlJyB8ICdwcmljZXM6cmVhZCcgfCAncXVvdGVzOmV4ZWN1dGUnIHwgJ3F1b3RlczpyZWFkJyB8ICdzdWJzY3JpcHRpb25fZXZlbnRzOmV4ZWN1dGUnIHwgJ3N1YnNjcmlwdGlvbl9ldmVudHM6cmVhZCcgfCAnc3Vic2NyaXB0aW9uczpleGVjdXRlJyB8ICdzdWJzY3JpcHRpb25zOnJlYWQnIHwgJ3N1YnNjcmlwdGlvbnM6d3JpdGUnIHwgJ3RyYWRlczpleGVjdXRlJyB8ICd0cmFkZXM6cmVhZCcgfCAndHJhbnNmZXJzOmV4ZWN1dGUnIHwgJ3RyYW5zZmVyczpyZWFkJyB8ICd0cmFuc2ZlcnM6d3JpdGUnIHwgJ3VzZXJzOmV4ZWN1dGUnIHwgJ3VzZXJzOnJlYWQnIHwgJ3dvcmtmbG93czpleGVjdXRlJyB8ICd3b3JrZmxvd3M6cmVhZCc7XG4gICAgZXhwb3J0IGNvbnN0IFNjb3Blc0VudW0gPSB7XG4gICAgICAgIEFjY291bnRzZXhlY3V0ZTogJ2FjY291bnRzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEFjY291bnRzcmVhZDogJ2FjY291bnRzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEJhbmtBcHBsaWNhdGlvbnNleGVjdXRlOiAnYmFua19hcHBsaWNhdGlvbnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQmFua3NleGVjdXRlOiAnYmFua3M6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQmFua3NyZWFkOiAnYmFua3M6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQmFua3N3cml0ZTogJ2JhbmtzOndyaXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDb3VudGVycGFydGllc2V4ZWN1dGU6ICdjb3VudGVycGFydGllczpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDb3VudGVycGFydGllc3JlYWQ6ICdjb3VudGVycGFydGllczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDb3VudGVycGFydGllc3dyaXRlOiAnY291bnRlcnBhcnRpZXM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEN1c3RvbWVyc2V4ZWN1dGU6ICdjdXN0b21lcnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgQ3VzdG9tZXJzcmVhZDogJ2N1c3RvbWVyczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBDdXN0b21lcnN3cml0ZTogJ2N1c3RvbWVyczp3cml0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRGVwb3NpdEFkZHJlc3Nlc2V4ZWN1dGU6ICdkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBEZXBvc2l0QWRkcmVzc2VzcmVhZDogJ2RlcG9zaXRfYWRkcmVzc2VzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIERlcG9zaXRCYW5rQWNjb3VudHNleGVjdXRlOiAnZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIERlcG9zaXRCYW5rQWNjb3VudHNyZWFkOiAnZGVwb3NpdF9iYW5rX2FjY291bnRzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIEV4dGVybmFsQmFua0FjY291bnRzZXhlY3V0ZTogJ2V4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRXh0ZXJuYWxCYW5rQWNjb3VudHNyZWFkOiAnZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBFeHRlcm5hbEJhbmtBY2NvdW50c3dyaXRlOiAnZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRXh0ZXJuYWxXYWxsZXRzZXhlY3V0ZTogJ2V4dGVybmFsX3dhbGxldHM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRXh0ZXJuYWxXYWxsZXRzcmVhZDogJ2V4dGVybmFsX3dhbGxldHM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRmlsZXNleGVjdXRlOiAnZmlsZXM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgRmlsZXNyZWFkOiAnZmlsZXM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgSWRlbnRpdHlWZXJpZmljYXRpb25zZXhlY3V0ZTogJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgSWRlbnRpdHlWZXJpZmljYXRpb25zcmVhZDogJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgSWRlbnRpdHlWZXJpZmljYXRpb25zd3JpdGU6ICdpZGVudGl0eV92ZXJpZmljYXRpb25zOndyaXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBJbnZvaWNlc2V4ZWN1dGU6ICdpbnZvaWNlczpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBJbnZvaWNlc3JlYWQ6ICdpbnZvaWNlczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBJbnZvaWNlc3dyaXRlOiAnaW52b2ljZXM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uc2V4ZWN1dGU6ICdvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIE9yZ2FuaXphdGlvbnNyZWFkOiAnb3JnYW5pemF0aW9uczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBPcmdhbml6YXRpb25zd3JpdGU6ICdvcmdhbml6YXRpb25zOndyaXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBQcmljZXNyZWFkOiAncHJpY2VzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFF1b3Rlc2V4ZWN1dGU6ICdxdW90ZXM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgUXVvdGVzcmVhZDogJ3F1b3RlczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBTdWJzY3JpcHRpb25FdmVudHNleGVjdXRlOiAnc3Vic2NyaXB0aW9uX2V2ZW50czpleGVjdXRlJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBTdWJzY3JpcHRpb25FdmVudHNyZWFkOiAnc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBTdWJzY3JpcHRpb25zZXhlY3V0ZTogJ3N1YnNjcmlwdGlvbnM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgU3Vic2NyaXB0aW9uc3JlYWQ6ICdzdWJzY3JpcHRpb25zOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFN1YnNjcmlwdGlvbnN3cml0ZTogJ3N1YnNjcmlwdGlvbnM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFRyYWRlc2V4ZWN1dGU6ICd0cmFkZXM6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgVHJhZGVzcmVhZDogJ3RyYWRlczpyZWFkJyBhcyBTY29wZXNFbnVtLFxuICAgICAgICBUcmFuc2ZlcnNleGVjdXRlOiAndHJhbnNmZXJzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFRyYW5zZmVyc3JlYWQ6ICd0cmFuc2ZlcnM6cmVhZCcgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgVHJhbnNmZXJzd3JpdGU6ICd0cmFuc2ZlcnM6d3JpdGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFVzZXJzZXhlY3V0ZTogJ3VzZXJzOmV4ZWN1dGUnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFVzZXJzcmVhZDogJ3VzZXJzOnJlYWQnIGFzIFNjb3Blc0VudW0sXG4gICAgICAgIFdvcmtmbG93c2V4ZWN1dGU6ICd3b3JrZmxvd3M6ZXhlY3V0ZScgYXMgU2NvcGVzRW51bSxcbiAgICAgICAgV29ya2Zsb3dzcmVhZDogJ3dvcmtmbG93czpyZWFkJyBhcyBTY29wZXNFbnVtXG4gICAgfTtcbn1cblxuXG4iXX0=