From 2a657a63c666f6305fbc10498e8940b184724166 Mon Sep 17 00:00:00 2001 From: Ahash Sritharan Date: Sat, 23 Sep 2023 19:36:53 +0200 Subject: [PATCH] fix: fixed release --- build/.eslintrc.cjs | 39 - build/LICENSE | 21 - build/dist/src/TemplateFunctions.d.ts | 8 - build/dist/src/TemplateFunctions.js | 257 ---- build/dist/src/XrmEx.js | 1327 ----------------- build/package.json | 60 +- build/{dist => }/src/XrmEx.d.ts | 0 build/src/XrmEx.js | 1327 +++++++++++++++++ docs/classes/XrmEx.BooleanField.md | 62 +- docs/classes/XrmEx.DateField.md | 60 +- docs/classes/XrmEx.Field.md | 60 +- docs/classes/XrmEx.Form.md | 36 +- docs/classes/XrmEx.GridControl.md | 48 +- docs/classes/XrmEx.LookupField.md | 80 +- .../XrmEx.MultiSelectOptionSetField.md | 72 +- docs/classes/XrmEx.NumberField.md | 68 +- docs/classes/XrmEx.OptionsetField.md | 82 +- docs/classes/XrmEx.Section.md | 24 +- docs/classes/XrmEx.Tab.md | 34 +- docs/classes/XrmEx.TextField.md | 62 +- docs/modules.md | 4 +- docs/modules/XrmEx.md | 20 +- package.json | 8 +- release/xrm-ex.zip | Bin 64180 -> 48992 bytes src/TemplateFunctions.ts | 303 ---- tsconfig.json | 2 +- 26 files changed, 1689 insertions(+), 2375 deletions(-) delete mode 100644 build/.eslintrc.cjs delete mode 100644 build/LICENSE delete mode 100644 build/dist/src/TemplateFunctions.d.ts delete mode 100644 build/dist/src/TemplateFunctions.js delete mode 100644 build/dist/src/XrmEx.js rename build/{dist => }/src/XrmEx.d.ts (100%) create mode 100644 build/src/XrmEx.js delete mode 100644 src/TemplateFunctions.ts diff --git a/build/.eslintrc.cjs b/build/.eslintrc.cjs deleted file mode 100644 index 4609e2e..0000000 --- a/build/.eslintrc.cjs +++ /dev/null @@ -1,39 +0,0 @@ -module.exports = { - root: true, - env: { - es2021: true, - node: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: { - project: "tsconfig.json", - tsconfigRootDir: __dirname, - }, - plugins: ["import", "@typescript-eslint", "simple-import-sort"], - extends: [ - "eslint:recommended", - "plugin:eslint-comments/recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "prettier", - ], - settings: { - "import/resolver": { - typescript: { - project: "tsconfig.json", - tsconfigRootDir: __dirname, - }, - }, - }, - rules: { - "simple-import-sort/imports": "error", - "simple-import-sort/exports": "error", - "import/no-mutable-exports": "error", - "import/no-unused-modules": "error", - "no-undef": "off", - "no-prototype-builtins": "off", - "no-dupe-class-members": "off", - "@typescript-eslint/no-floating-promises": "error", - "no-unused-vars": "warn" - } -}; diff --git a/build/LICENSE b/build/LICENSE deleted file mode 100644 index 9a671be..0000000 --- a/build/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Ahash Sritharan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/build/dist/src/TemplateFunctions.d.ts b/build/dist/src/TemplateFunctions.d.ts deleted file mode 100644 index 34ff55f..0000000 --- a/build/dist/src/TemplateFunctions.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/// -/// -declare namespace Theia { - namespace TemplateFunctions { - function Init(executionContext: Xrm.FormContext | Xrm.Events.EventContext): Promise; - function OnLoad(executionContext: Xrm.FormContext | Xrm.Events.EventContext): Promise; - } -} diff --git a/build/dist/src/TemplateFunctions.js b/build/dist/src/TemplateFunctions.js deleted file mode 100644 index f195082..0000000 --- a/build/dist/src/TemplateFunctions.js +++ /dev/null @@ -1,257 +0,0 @@ -/// -// eslint-disable-next-line no-unused-vars -var Theia; -(function (Theia) { - let TemplateFunctions; - (function (TemplateFunctions) { - var formContext; - class Fields { - Firstname = new XrmEx.TextField("firstname"); - Lastname = new XrmEx.TextField("lastname"); - JobTitle = new XrmEx.TextField("jobtitle"); - PreferredContactMethod = new XrmEx.OptionsetField("preferredcontactmethodcode", { - Any: 1, - Email: 2, - Phone: 3, - Fax: 4, - Mail: 5, - }); - Customer = new XrmEx.LookupField("parentcustomerid"); - BusinessPhone = new XrmEx.TextField("telephone1"); - Gender = new XrmEx.OptionsetField("gendercode"); - Email = new XrmEx.TextField("emailaddress1"); - MobilePhone = new XrmEx.TextField("mobilephone"); - Owner = new XrmEx.LookupField("ownerid"); - DoNotEmail = new XrmEx.BooleanField("donotemail"); - MaritalStatus = new XrmEx.OptionsetField("familystatuscode"); - SpousePartnerName = new XrmEx.TextField("spousesname"); - Birthday = new XrmEx.DateField("birthdate"); - } - class Tabs { - General = new XrmEx.Tab("tab1", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - Details = new XrmEx.Tab("tab2", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - } - class Grids { - ContactSubgrid = new XrmEx.GridControl("Test"); - } - var fields; - var tabs; - var grids; - async function Init(executionContext) { - if (!XrmEx) { - let errorMessage = "XrmEx is not loaded. Please make sure you have XrmEx.js loaded in your form."; - console.error(errorMessage); - await Xrm.Navigation.openAlertDialog({ - title: "Error", - text: errorMessage, - }); - return; - } - XrmEx.Form.formContext = executionContext; - fields = new Fields(); - tabs = new Tabs(); - grids = new Grids(); - } - TemplateFunctions.Init = Init; - async function OnLoad(executionContext) { - await Init(executionContext); //Ensures XrmEx is only accessed after the OnLoad Event - try { - parent.window.XrmEx = XrmEx; - formContext = XrmEx.Form.formContext; - await sample(); - //Register one or more Functions to execute OnSave - formContext.data.entity.addOnSave(sample); - //BETTER WAY - XrmEx.Form.addOnSaveEventHandler([sample]); - //Register one or more Functions to execute OnChange of multiple fields and execute it immediately - let firstname = formContext.getAttribute("firstname"); - let lastname = formContext.getAttribute("lastname"); - firstname.addOnChange(sample); - firstname.fireOnChange(); - lastname.fireOnChange(); - //BETTER WAY - XrmEx.Form.addOnChangeEventHandler([fields.Firstname, fields.Lastname], [sample], true); - } - catch (error) { - console.error(error); - await XrmEx.openAlertDialog("Error", `Error in Theia.TemplateFunctions.${XrmEx.getMethodName()}\n` + - error.message); - } - /** - * This Framework empowers developers to DO MORE by writing LESS CODE 👈(゚ヮ゚👈) - */ - async function sample() { - try { - //Continue only on Update Form - if (formContext.ui.getFormType() != 2) - return; - //BETTER WAY - if (XrmEx.Form.IsNotUpdate) - return; - //If Firstname is empty, make it required and shows notification on the field - let firstname = formContext.getAttribute("firstname"); - if (!firstname.getValue()) { - firstname.setRequiredLevel("required"); - firstname.controls.forEach((c) => c.setNotification("This property is required", "uniqueId")); - } - //BETTER WAY - if (!fields.Lastname.Value) - fields.Firstname.setRequired(true).setNotification("This property is required", "uniqueId"); - //If Owner has Value and Lastname does not, retrieve it's lastname and set it to Lastname - let ownerid = formContext.getAttribute("ownerid"); - let lastname = formContext.getAttribute("lastname"); - if (ownerid.getValue() && !lastname.getValue()) { - let user = await Xrm.WebApi.retrieveRecord(ownerid.getValue()[0].entityType, ownerid.getValue()[0].id, "?$select=lastname"); - lastname.setValue(user.lastname); - } - //BETTER WAY - if (fields.Owner.Value && !fields.Lastname.Value) { - let user = await fields.Owner.retrieve("?$select=lastname"); - fields.Lastname.Value = user.lastname; - fields.Lastname.setValue(user.lastname); - } - //Set Optionset PreferredContactMethod to Email - fields.PreferredContactMethod.Value = - fields.PreferredContactMethod.Option.Email; - //Add Lookup Filter to Customer and remove it later - let filterFunction = function filterFunction(executionContext) { - let formContext = executionContext.getFormContext(); - let customer = formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => { - c.addCustomFilter(` - - `); - }); - }; - let customer = formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => c.addPreSearch(filterFunction)); - customer.controls.forEach((c) => c.removePreSearch(filterFunction)); - //BETTER WAY - fields.Customer.addPreFilterToLookup(` - - `); - fields.Customer.clearPreFilterFromLookup(); - fields.Lastname.setVisible(false) - .setDisabled(true) - .setRequired(false) - .setNotification("This property is required", "uniqueId"); - //SPECIAL WAY (Go to Definition to see how to achieve this) - //Add Advanced Lookup Filter - await fields.Customer.addPreFilterToLookupAdvanced("contact", "contactid", ` - - - - - - `); - //Execute bound Action - class TestActionContactRequest { - Amount; - Account; - getMetadata() { - return { - boundParameter: "entity", - operationType: 0, - operationName: "theia_TestActionContact", - parameterTypes: { - Amount: { - typeName: "Edm.Int32", - structuralProperty: 1, - }, - Account: { - typeName: "mscrm.account", - structuralProperty: 5, - }, - entity: { - typeName: "mscrm.contact", - structuralProperty: 5, - }, - }, - }; - } - } - let testActionContactRequest = new TestActionContactRequest(); - testActionContactRequest.Amount = 5; - testActionContactRequest.Account = customer.getValue()[0]; - testActionContactRequest["entity"] = - formContext.data.entity.getEntityReference(); - let response = await Xrm.WebApi.online - .execute(testActionContactRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(response); - //BETTER WAY - let response2 = await XrmEx.executeAction("theia_TestActionContact", [ - { Name: "Amount", Type: "Integer", Value: 5 }, - { - Name: "Account", - Type: "EntityReference", - Value: fields.Customer.Value[0], - }, - ], XrmEx.Form.entityReference); - console.log(response2); - //Retrieve EnvironmentVariableValue - class EnvironmentVariableRequest { - DefinitionSchemaName; - constructor(definitionSchemaName) { - this.DefinitionSchemaName = definitionSchemaName; - } - getMetadata() { - return { - boundParameter: null, - operationType: 1, - operationName: "RetrieveEnvironmentVariableValue", - parameterTypes: { - DefinitionSchemaName: { - typeName: "Edm.String", - structuralProperty: 1, - }, - }, - }; - } - } - let environmentVariableRequest = new EnvironmentVariableRequest("theia_Test"); - let value = await Xrm.WebApi.online - .execute(environmentVariableRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(value); - //BETTER WAY - let value2 = await XrmEx.getEnvironmentVariableValue("theia_Test"); - console.log(value2); - /** - * How to access Propoerties described in Microsofts Documentation - */ - /** You can access all Form Context Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/clientapi-form-context*/ - XrmEx.Form.formContext.data.isValid(); - /** You can access all Column Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/reference/attributes*/ - fields.Birthday.Attribute.getIsDirty(); - } - catch (error) { - console.error(error); - throw new Error(`.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - TemplateFunctions.OnLoad = OnLoad; - })(TemplateFunctions = Theia.TemplateFunctions || (Theia.TemplateFunctions = {})); -})(Theia || (Theia = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVGdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvVGVtcGxhdGVGdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBRWpDLDBDQUEwQztBQUMxQyxJQUFVLEtBQUssQ0EyU2Q7QUEzU0QsV0FBVSxLQUFLO0lBQ2IsSUFBaUIsaUJBQWlCLENBeVNqQztJQXpTRCxXQUFpQixpQkFBaUI7UUFDaEMsSUFBSSxXQUE0QixDQUFDO1FBQ2pDLE1BQU0sTUFBTTtZQUNWLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0MsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLHNCQUFzQixHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FDL0MsNEJBQTRCLEVBQzVCO2dCQUNFLEdBQUcsRUFBRSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxDQUFDO2dCQUNSLEdBQUcsRUFBRSxDQUFDO2dCQUNOLElBQUksRUFBRSxDQUFDO2FBQ1IsQ0FDRixDQUFDO1lBQ0YsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JELGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEQsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRCxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdDLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakQsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2xELGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxpQkFBaUIsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkQsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3QztRQUNELE1BQU0sSUFBSTtZQUNSLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUM5QixRQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFDdkMsUUFBUSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUN2QyxRQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUN4QyxDQUFDLENBQUM7U0FDSjtRQUNELE1BQU0sS0FBSztZQUNULGNBQWMsR0FBRyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLElBQVUsQ0FBQztRQUNmLElBQUksS0FBWSxDQUFDO1FBQ1YsS0FBSyxVQUFVLElBQUksQ0FDeEIsZ0JBQTJEO1lBRTNELElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1YsSUFBSSxZQUFZLEdBQ2QsOEVBQThFLENBQUM7Z0JBQ2pGLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7b0JBQ25DLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxZQUFZO2lCQUNuQixDQUFDLENBQUM7Z0JBQ0gsT0FBTzthQUNSO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7WUFDMUMsTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdEIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQWpCcUIsc0JBQUksT0FpQnpCLENBQUE7UUFFTSxLQUFLLFVBQVUsTUFBTSxDQUMxQixnQkFBMkQ7WUFFM0QsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLHVEQUF1RDtZQUNyRixJQUFJO2dCQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUVyQyxNQUFNLE1BQU0sRUFBRSxDQUFDO2dCQUNmLGtEQUFrRDtnQkFDbEQsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxZQUFZO2dCQUNaLEtBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxrR0FBa0c7Z0JBQ2xHLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3BELFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN4QixZQUFZO2dCQUNaLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQ2hDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQ25DLENBQUMsTUFBTSxDQUFDLEVBQ1IsSUFBSSxDQUNMLENBQUM7YUFDSDtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxDQUFDLGVBQWUsQ0FDekIsT0FBTyxFQUNQLG9DQUFvQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUk7b0JBQzNELEtBQUssQ0FBQyxPQUFPLENBQ2hCLENBQUM7YUFDSDtZQUNEOztlQUVHO1lBQ0gsS0FBSyxVQUFVLE1BQU07Z0JBQ25CLElBQUk7b0JBQ0YsOEJBQThCO29CQUM5QixJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQzt3QkFBRSxPQUFPO29CQUM5QyxZQUFZO29CQUNaLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXO3dCQUFFLE9BQU87b0JBRW5DLDZFQUE2RTtvQkFDN0UsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDekIsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN2QyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQy9CLENBQUMsQ0FBQyxlQUFlLENBQUMsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLENBQzNELENBQUM7cUJBQ0g7b0JBQ0QsWUFBWTtvQkFDWixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLO3dCQUN4QixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQ2hELDJCQUEyQixFQUMzQixVQUFVLENBQ1gsQ0FBQztvQkFFSix5RkFBeUY7b0JBQ3pGLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ2xELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3BELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUM5QyxJQUFJLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUN4QyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUNoQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUN4QixtQkFBbUIsQ0FDcEIsQ0FBQzt3QkFDRixRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDbEM7b0JBQ0QsWUFBWTtvQkFDWixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7d0JBQ2hELElBQUksSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQzt3QkFDNUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUN6QztvQkFDRCwrQ0FBK0M7b0JBQy9DLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLO3dCQUNqQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFFN0MsbURBQW1EO29CQUNuRCxJQUFJLGNBQWMsR0FBRyxTQUFTLGNBQWMsQ0FDMUMsZ0JBQXlDO3dCQUV6QyxJQUFJLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDcEQsSUFBSSxRQUFRLEdBQ1YsV0FBVyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUMvQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFOzRCQUM5QixDQUFDLENBQUMsZUFBZSxDQUNmOztzQ0FFc0IsQ0FDdkIsQ0FBQzt3QkFDSixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUM7b0JBQ0YsSUFBSSxRQUFRLEdBQ1YsV0FBVyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUMvQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUNqRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxZQUFZO29CQUNaLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQ2xDOzswQkFFYyxDQUNmLENBQUM7b0JBQ0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO29CQUUzQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7eUJBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUM7eUJBQ2pCLFdBQVcsQ0FBQyxLQUFLLENBQUM7eUJBQ2xCLGVBQWUsQ0FBQywyQkFBMkIsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFFNUQsMkRBQTJEO29CQUMzRCw0QkFBNEI7b0JBQzVCLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FDaEQsU0FBUyxFQUNULFdBQVcsRUFDWDs7Ozs7OzJCQU1lLENBQ2hCLENBQUM7b0JBRUYsc0JBQXNCO29CQUN0QixNQUFNLHdCQUF3Qjt3QkFDNUIsTUFBTSxDQUFTO3dCQUNmLE9BQU8sQ0FBTTt3QkFDYixXQUFXOzRCQUNULE9BQU87Z0NBQ0wsY0FBYyxFQUFFLFFBQVE7Z0NBQ3hCLGFBQWEsRUFBRSxDQUFDO2dDQUNoQixhQUFhLEVBQUUseUJBQXlCO2dDQUN4QyxjQUFjLEVBQUU7b0NBQ2QsTUFBTSxFQUFFO3dDQUNOLFFBQVEsRUFBRSxXQUFXO3dDQUNyQixrQkFBa0IsRUFBRSxDQUFDO3FDQUN0QjtvQ0FDRCxPQUFPLEVBQUU7d0NBQ1AsUUFBUSxFQUFFLGVBQWU7d0NBQ3pCLGtCQUFrQixFQUFFLENBQUM7cUNBQ3RCO29DQUNELE1BQU0sRUFBRTt3Q0FDTixRQUFRLEVBQUUsZUFBZTt3Q0FDekIsa0JBQWtCLEVBQUUsQ0FBQztxQ0FDdEI7aUNBQ0Y7NkJBQ0YsQ0FBQzt3QkFDSixDQUFDO3FCQUNGO29CQUNELElBQUksd0JBQXdCLEdBQUcsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO29CQUM5RCx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNwQyx3QkFBd0IsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxRCx3QkFBd0IsQ0FBQyxRQUFRLENBQUM7d0JBQ2hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQy9DLElBQUksUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNO3lCQUNuQyxPQUFPLENBQUMsd0JBQXdCLENBQUM7eUJBQ2pDLElBQUksQ0FBQyxVQUFVLFFBQVE7d0JBQ3RCLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRTs0QkFDZixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO2dDQUNoQyxPQUFPLFFBQVEsQ0FBQzs0QkFDbEIsQ0FBQyxDQUFDLENBQUM7eUJBQ0o7b0JBQ0gsQ0FBQyxDQUFDO3lCQUNELElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBRXRCLFlBQVk7b0JBQ1osSUFBSSxTQUFTLEdBQUcsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUN2Qyx5QkFBeUIsRUFDekI7d0JBQ0UsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTt3QkFDN0M7NEJBQ0UsSUFBSSxFQUFFLFNBQVM7NEJBQ2YsSUFBSSxFQUFFLGlCQUFpQjs0QkFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt5QkFDaEM7cUJBQ0YsRUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FDM0IsQ0FBQztvQkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUV2QixtQ0FBbUM7b0JBQ25DLE1BQU0sMEJBQTBCO3dCQUM5QixvQkFBb0IsQ0FBUzt3QkFDN0IsWUFBWSxvQkFBNEI7NEJBQ3RDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQzt3QkFDbkQsQ0FBQzt3QkFDRCxXQUFXOzRCQUNULE9BQU87Z0NBQ0wsY0FBYyxFQUFFLElBQUk7Z0NBQ3BCLGFBQWEsRUFBRSxDQUFDO2dDQUNoQixhQUFhLEVBQUUsa0NBQWtDO2dDQUNqRCxjQUFjLEVBQUU7b0NBQ2Qsb0JBQW9CLEVBQUU7d0NBQ3BCLFFBQVEsRUFBRSxZQUFZO3dDQUN0QixrQkFBa0IsRUFBRSxDQUFDO3FDQUN0QjtpQ0FDRjs2QkFDRixDQUFDO3dCQUNKLENBQUM7cUJBQ0Y7b0JBQ0QsSUFBSSwwQkFBMEIsR0FBRyxJQUFJLDBCQUEwQixDQUM3RCxZQUFZLENBQ2IsQ0FBQztvQkFDRixJQUFJLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTTt5QkFDaEMsT0FBTyxDQUFDLDBCQUEwQixDQUFDO3lCQUNuQyxJQUFJLENBQUMsVUFBVSxRQUFRO3dCQUN0QixJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUU7NEJBQ2YsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQ0FDaEMsT0FBTyxRQUFRLENBQUM7NEJBQ2xCLENBQUMsQ0FBQyxDQUFDO3lCQUNKO29CQUNILENBQUMsQ0FBQzt5QkFDRCxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuQixZQUFZO29CQUNaLElBQUksTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUVwQjs7dUJBRUc7b0JBQ0gsbUtBQW1LO29CQUNuSyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBRXRDLDJKQUEySjtvQkFDM0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQ3hDO2dCQUFDLE9BQU8sS0FBSyxFQUFFO29CQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQ2pFO1lBQ0gsQ0FBQztRQUNILENBQUM7UUExT3FCLHdCQUFNLFNBME8zQixDQUFBO0lBQ0gsQ0FBQyxFQXpTZ0IsaUJBQWlCLEdBQWpCLHVCQUFpQixLQUFqQix1QkFBaUIsUUF5U2pDO0FBQ0gsQ0FBQyxFQTNTUyxLQUFLLEtBQUwsS0FBSyxRQTJTZCIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCJYcm1FeC50c1wiIC8+XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xubmFtZXNwYWNlIFRoZWlhIHtcbiAgZXhwb3J0IG5hbWVzcGFjZSBUZW1wbGF0ZUZ1bmN0aW9ucyB7XG4gICAgdmFyIGZvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgY2xhc3MgRmllbGRzIHtcbiAgICAgIEZpcnN0bmFtZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJmaXJzdG5hbWVcIik7XG4gICAgICBMYXN0bmFtZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJsYXN0bmFtZVwiKTtcbiAgICAgIEpvYlRpdGxlID0gbmV3IFhybUV4LlRleHRGaWVsZChcImpvYnRpdGxlXCIpO1xuICAgICAgUHJlZmVycmVkQ29udGFjdE1ldGhvZCA9IG5ldyBYcm1FeC5PcHRpb25zZXRGaWVsZChcbiAgICAgICAgXCJwcmVmZXJyZWRjb250YWN0bWV0aG9kY29kZVwiLFxuICAgICAgICB7XG4gICAgICAgICAgQW55OiAxLFxuICAgICAgICAgIEVtYWlsOiAyLFxuICAgICAgICAgIFBob25lOiAzLFxuICAgICAgICAgIEZheDogNCxcbiAgICAgICAgICBNYWlsOiA1LFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgQ3VzdG9tZXIgPSBuZXcgWHJtRXguTG9va3VwRmllbGQoXCJwYXJlbnRjdXN0b21lcmlkXCIpO1xuICAgICAgQnVzaW5lc3NQaG9uZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJ0ZWxlcGhvbmUxXCIpO1xuICAgICAgR2VuZGVyID0gbmV3IFhybUV4Lk9wdGlvbnNldEZpZWxkKFwiZ2VuZGVyY29kZVwiKTtcbiAgICAgIEVtYWlsID0gbmV3IFhybUV4LlRleHRGaWVsZChcImVtYWlsYWRkcmVzczFcIik7XG4gICAgICBNb2JpbGVQaG9uZSA9IG5ldyBYcm1FeC5UZXh0RmllbGQoXCJtb2JpbGVwaG9uZVwiKTtcbiAgICAgIE93bmVyID0gbmV3IFhybUV4Lkxvb2t1cEZpZWxkKFwib3duZXJpZFwiKTtcbiAgICAgIERvTm90RW1haWwgPSBuZXcgWHJtRXguQm9vbGVhbkZpZWxkKFwiZG9ub3RlbWFpbFwiKTtcbiAgICAgIE1hcml0YWxTdGF0dXMgPSBuZXcgWHJtRXguT3B0aW9uc2V0RmllbGQoXCJmYW1pbHlzdGF0dXNjb2RlXCIpO1xuICAgICAgU3BvdXNlUGFydG5lck5hbWUgPSBuZXcgWHJtRXguVGV4dEZpZWxkKFwic3BvdXNlc25hbWVcIik7XG4gICAgICBCaXJ0aGRheSA9IG5ldyBYcm1FeC5EYXRlRmllbGQoXCJiaXJ0aGRhdGVcIik7XG4gICAgfVxuICAgIGNsYXNzIFRhYnMge1xuICAgICAgR2VuZXJhbCA9IG5ldyBYcm1FeC5UYWIoXCJ0YWIxXCIsIHtcbiAgICAgICAgU2VjdGlvbjE6IG5ldyBYcm1FeC5TZWN0aW9uKFwic2VjdGlvbjFcIiksXG4gICAgICAgIFNlY3Rpb24yOiBuZXcgWHJtRXguU2VjdGlvbihcInNlY3Rpb24yXCIpLFxuICAgICAgfSk7XG4gICAgICBEZXRhaWxzID0gbmV3IFhybUV4LlRhYihcInRhYjJcIiwge1xuICAgICAgICBTZWN0aW9uMTogbmV3IFhybUV4LlNlY3Rpb24oXCJzZWN0aW9uMVwiKSxcbiAgICAgICAgU2VjdGlvbjI6IG5ldyBYcm1FeC5TZWN0aW9uKFwic2VjdGlvbjJcIiksXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2xhc3MgR3JpZHMge1xuICAgICAgQ29udGFjdFN1YmdyaWQgPSBuZXcgWHJtRXguR3JpZENvbnRyb2woXCJUZXN0XCIpO1xuICAgIH1cbiAgICB2YXIgZmllbGRzOiBGaWVsZHM7XG4gICAgdmFyIHRhYnM6IFRhYnM7XG4gICAgdmFyIGdyaWRzOiBHcmlkcztcbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gSW5pdChcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IFhybS5Gb3JtQ29udGV4dCB8IFhybS5FdmVudHMuRXZlbnRDb250ZXh0XG4gICAgKSB7XG4gICAgICBpZiAoIVhybUV4KSB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIFwiWHJtRXggaXMgbm90IGxvYWRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBYcm1FeC5qcyBsb2FkZWQgaW4geW91ciBmb3JtLlwiO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyh7XG4gICAgICAgICAgdGl0bGU6IFwiRXJyb3JcIixcbiAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBYcm1FeC5Gb3JtLmZvcm1Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZHMoKTtcbiAgICAgIHRhYnMgPSBuZXcgVGFicygpO1xuICAgICAgZ3JpZHMgPSBuZXcgR3JpZHMoKTtcbiAgICB9XG5cbiAgICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gT25Mb2FkKFxuICAgICAgZXhlY3V0aW9uQ29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHRcbiAgICApIHtcbiAgICAgIGF3YWl0IEluaXQoZXhlY3V0aW9uQ29udGV4dCk7IC8vRW5zdXJlcyBYcm1FeCBpcyBvbmx5IGFjY2Vzc2VkIGFmdGVyIHRoZSBPbkxvYWQgRXZlbnRcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcmVudC53aW5kb3cuWHJtRXggPSBYcm1FeDtcbiAgICAgICAgZm9ybUNvbnRleHQgPSBYcm1FeC5Gb3JtLmZvcm1Db250ZXh0O1xuXG4gICAgICAgIGF3YWl0IHNhbXBsZSgpO1xuICAgICAgICAvL1JlZ2lzdGVyIG9uZSBvciBtb3JlIEZ1bmN0aW9ucyB0byBleGVjdXRlIE9uU2F2ZVxuICAgICAgICBmb3JtQ29udGV4dC5kYXRhLmVudGl0eS5hZGRPblNhdmUoc2FtcGxlKTtcbiAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgIFhybUV4LkZvcm0uYWRkT25TYXZlRXZlbnRIYW5kbGVyKFtzYW1wbGVdKTtcbiAgICAgICAgLy9SZWdpc3RlciBvbmUgb3IgbW9yZSBGdW5jdGlvbnMgdG8gZXhlY3V0ZSBPbkNoYW5nZSBvZiBtdWx0aXBsZSBmaWVsZHMgYW5kIGV4ZWN1dGUgaXQgaW1tZWRpYXRlbHlcbiAgICAgICAgbGV0IGZpcnN0bmFtZSA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcImZpcnN0bmFtZVwiKTtcbiAgICAgICAgbGV0IGxhc3RuYW1lID0gZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFzdG5hbWVcIik7XG4gICAgICAgIGZpcnN0bmFtZS5hZGRPbkNoYW5nZShzYW1wbGUpO1xuICAgICAgICBmaXJzdG5hbWUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgIGxhc3RuYW1lLmZpcmVPbkNoYW5nZSgpO1xuICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgWHJtRXguRm9ybS5hZGRPbkNoYW5nZUV2ZW50SGFuZGxlcihcbiAgICAgICAgICBbZmllbGRzLkZpcnN0bmFtZSwgZmllbGRzLkxhc3RuYW1lXSxcbiAgICAgICAgICBbc2FtcGxlXSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgYXdhaXQgWHJtRXgub3BlbkFsZXJ0RGlhbG9nKFxuICAgICAgICAgIFwiRXJyb3JcIixcbiAgICAgICAgICBgRXJyb3IgaW4gVGhlaWEuVGVtcGxhdGVGdW5jdGlvbnMuJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9XFxuYCArXG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgRnJhbWV3b3JrIGVtcG93ZXJzIGRldmVsb3BlcnMgdG8gRE8gTU9SRSBieSB3cml0aW5nIExFU1MgQ09ERSDwn5GIKO++n+ODru++n/CfkYgpXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhbXBsZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvL0NvbnRpbnVlIG9ubHkgb24gVXBkYXRlIEZvcm1cbiAgICAgICAgICBpZiAoZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyKSByZXR1cm47XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgaWYgKFhybUV4LkZvcm0uSXNOb3RVcGRhdGUpIHJldHVybjtcblxuICAgICAgICAgIC8vSWYgRmlyc3RuYW1lIGlzIGVtcHR5LCBtYWtlIGl0IHJlcXVpcmVkIGFuZCBzaG93cyBub3RpZmljYXRpb24gb24gdGhlIGZpZWxkXG4gICAgICAgICAgbGV0IGZpcnN0bmFtZSA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcImZpcnN0bmFtZVwiKTtcbiAgICAgICAgICBpZiAoIWZpcnN0bmFtZS5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICBmaXJzdG5hbWUuc2V0UmVxdWlyZWRMZXZlbChcInJlcXVpcmVkXCIpO1xuICAgICAgICAgICAgZmlyc3RuYW1lLmNvbnRyb2xzLmZvckVhY2goKGMpID0+XG4gICAgICAgICAgICAgIGMuc2V0Tm90aWZpY2F0aW9uKFwiVGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZFwiLCBcInVuaXF1ZUlkXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgICBpZiAoIWZpZWxkcy5MYXN0bmFtZS5WYWx1ZSlcbiAgICAgICAgICAgIGZpZWxkcy5GaXJzdG5hbWUuc2V0UmVxdWlyZWQodHJ1ZSkuc2V0Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICBcIlRoaXMgcHJvcGVydHkgaXMgcmVxdWlyZWRcIixcbiAgICAgICAgICAgICAgXCJ1bmlxdWVJZFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy9JZiBPd25lciBoYXMgVmFsdWUgYW5kIExhc3RuYW1lIGRvZXMgbm90LCByZXRyaWV2ZSBpdCdzIGxhc3RuYW1lIGFuZCBzZXQgaXQgdG8gTGFzdG5hbWVcbiAgICAgICAgICBsZXQgb3duZXJpZCA9IGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcIm93bmVyaWRcIik7XG4gICAgICAgICAgbGV0IGxhc3RuYW1lID0gZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFzdG5hbWVcIik7XG4gICAgICAgICAgaWYgKG93bmVyaWQuZ2V0VmFsdWUoKSAmJiAhbGFzdG5hbWUuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgbGV0IHVzZXIgPSBhd2FpdCBYcm0uV2ViQXBpLnJldHJpZXZlUmVjb3JkKFxuICAgICAgICAgICAgICBvd25lcmlkLmdldFZhbHVlKClbMF0uZW50aXR5VHlwZSxcbiAgICAgICAgICAgICAgb3duZXJpZC5nZXRWYWx1ZSgpWzBdLmlkLFxuICAgICAgICAgICAgICBcIj8kc2VsZWN0PWxhc3RuYW1lXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsYXN0bmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3RuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgaWYgKGZpZWxkcy5Pd25lci5WYWx1ZSAmJiAhZmllbGRzLkxhc3RuYW1lLlZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgdXNlciA9IGF3YWl0IGZpZWxkcy5Pd25lci5yZXRyaWV2ZShcIj8kc2VsZWN0PWxhc3RuYW1lXCIpO1xuICAgICAgICAgICAgZmllbGRzLkxhc3RuYW1lLlZhbHVlID0gdXNlci5sYXN0bmFtZTtcbiAgICAgICAgICAgIGZpZWxkcy5MYXN0bmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3RuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9TZXQgT3B0aW9uc2V0IFByZWZlcnJlZENvbnRhY3RNZXRob2QgdG8gRW1haWxcbiAgICAgICAgICBmaWVsZHMuUHJlZmVycmVkQ29udGFjdE1ldGhvZC5WYWx1ZSA9XG4gICAgICAgICAgICBmaWVsZHMuUHJlZmVycmVkQ29udGFjdE1ldGhvZC5PcHRpb24uRW1haWw7XG5cbiAgICAgICAgICAvL0FkZCBMb29rdXAgRmlsdGVyIHRvIEN1c3RvbWVyIGFuZCByZW1vdmUgaXQgbGF0ZXJcbiAgICAgICAgICBsZXQgZmlsdGVyRnVuY3Rpb24gPSBmdW5jdGlvbiBmaWx0ZXJGdW5jdGlvbihcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZm9ybUNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICAgICAgICBsZXQgY3VzdG9tZXI6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZSA9XG4gICAgICAgICAgICAgIGZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZShcInBhcmVudGN1c3RvbWVyaWRcIik7XG4gICAgICAgICAgICBjdXN0b21lci5jb250cm9scy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgIGMuYWRkQ3VzdG9tRmlsdGVyKFxuICAgICAgICAgICAgICAgIGA8ZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImxhc3RuYW1lXCIgb3BlcmF0b3I9XCJsaWtlXCIgdmFsdWU9XCIlVGVzdCVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGN1c3RvbWVyOiBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGUgPVxuICAgICAgICAgICAgZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicGFyZW50Y3VzdG9tZXJpZFwiKTtcbiAgICAgICAgICBjdXN0b21lci5jb250cm9scy5mb3JFYWNoKChjKSA9PiBjLmFkZFByZVNlYXJjaChmaWx0ZXJGdW5jdGlvbikpO1xuICAgICAgICAgIGN1c3RvbWVyLmNvbnRyb2xzLmZvckVhY2goKGMpID0+IGMucmVtb3ZlUHJlU2VhcmNoKGZpbHRlckZ1bmN0aW9uKSk7XG4gICAgICAgICAgLy9CRVRURVIgV0FZXG4gICAgICAgICAgZmllbGRzLkN1c3RvbWVyLmFkZFByZUZpbHRlclRvTG9va3VwKFxuICAgICAgICAgICAgYDxmaWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gYXR0cmlidXRlPVwibGFzdG5hbWVcIiBvcGVyYXRvcj1cImxpa2VcIiB2YWx1ZT1cIiVUZXN0JVwiIC8+XG4gICAgICAgICAgICAgICAgPC9maWx0ZXI+YFxuICAgICAgICAgICk7XG4gICAgICAgICAgZmllbGRzLkN1c3RvbWVyLmNsZWFyUHJlRmlsdGVyRnJvbUxvb2t1cCgpO1xuXG4gICAgICAgICAgZmllbGRzLkxhc3RuYW1lLnNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAuc2V0RGlzYWJsZWQodHJ1ZSlcbiAgICAgICAgICAgIC5zZXRSZXF1aXJlZChmYWxzZSlcbiAgICAgICAgICAgIC5zZXROb3RpZmljYXRpb24oXCJUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkXCIsIFwidW5pcXVlSWRcIik7XG5cbiAgICAgICAgICAvL1NQRUNJQUwgV0FZIChHbyB0byBEZWZpbml0aW9uIHRvIHNlZSBob3cgdG8gYWNoaWV2ZSB0aGlzKVxuICAgICAgICAgIC8vQWRkIEFkdmFuY2VkIExvb2t1cCBGaWx0ZXJcbiAgICAgICAgICBhd2FpdCBmaWVsZHMuQ3VzdG9tZXIuYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgICAgICAgIFwiY29udGFjdFwiLFxuICAgICAgICAgICAgXCJjb250YWN0aWRcIixcbiAgICAgICAgICAgIGA8ZmV0Y2g+XG4gICAgICAgICAgICAgICAgICAgIDxlbnRpdHkgbmFtZT1cImNvbnRhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJsYXN0bmFtZVwiIG9wZXJhdG9yPVwibGlrZVwiIHZhbHVlPVwiJVRlc3QlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9lbnRpdHk+XG4gICAgICAgICAgICAgICAgICA8L2ZldGNoPmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy9FeGVjdXRlIGJvdW5kIEFjdGlvblxuICAgICAgICAgIGNsYXNzIFRlc3RBY3Rpb25Db250YWN0UmVxdWVzdCB7XG4gICAgICAgICAgICBBbW91bnQ6IG51bWJlcjtcbiAgICAgICAgICAgIEFjY291bnQ6IGFueTtcbiAgICAgICAgICAgIGdldE1ldGFkYXRhKCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBcImVudGl0eVwiLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ0aGVpYV9UZXN0QWN0aW9uQ29udGFjdFwiLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzOiB7XG4gICAgICAgICAgICAgICAgICBBbW91bnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBBY2NvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBcIm1zY3JtLmFjY291bnRcIixcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiA1LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eToge1xuICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZTogXCJtc2NybS5jb250YWN0XCIsXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogNSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHRlc3RBY3Rpb25Db250YWN0UmVxdWVzdCA9IG5ldyBUZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QoKTtcbiAgICAgICAgICB0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QuQW1vdW50ID0gNTtcbiAgICAgICAgICB0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QuQWNjb3VudCA9IGN1c3RvbWVyLmdldFZhbHVlKClbMF07XG4gICAgICAgICAgdGVzdEFjdGlvbkNvbnRhY3RSZXF1ZXN0W1wiZW50aXR5XCJdID1cbiAgICAgICAgICAgIGZvcm1Db250ZXh0LmRhdGEuZW50aXR5LmdldEVudGl0eVJlZmVyZW5jZSgpO1xuICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lXG4gICAgICAgICAgICAuZXhlY3V0ZSh0ZXN0QWN0aW9uQ29udGFjdFJlcXVlc3QpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VCb2R5KSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcblxuICAgICAgICAgIC8vQkVUVEVSIFdBWVxuICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCBYcm1FeC5leGVjdXRlQWN0aW9uKFxuICAgICAgICAgICAgXCJ0aGVpYV9UZXN0QWN0aW9uQ29udGFjdFwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7IE5hbWU6IFwiQW1vdW50XCIsIFR5cGU6IFwiSW50ZWdlclwiLCBWYWx1ZTogNSB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgTmFtZTogXCJBY2NvdW50XCIsXG4gICAgICAgICAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgICAgICAgICAgICBWYWx1ZTogZmllbGRzLkN1c3RvbWVyLlZhbHVlWzBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFhybUV4LkZvcm0uZW50aXR5UmVmZXJlbmNlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZTIpO1xuXG4gICAgICAgICAgLy9SZXRyaWV2ZSBFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWVcbiAgICAgICAgICBjbGFzcyBFbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdCB7XG4gICAgICAgICAgICBEZWZpbml0aW9uU2NoZW1hTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgY29uc3RydWN0b3IoZGVmaW5pdGlvblNjaGVtYU5hbWU6IHN0cmluZykge1xuICAgICAgICAgICAgICB0aGlzLkRlZmluaXRpb25TY2hlbWFOYW1lID0gZGVmaW5pdGlvblNjaGVtYU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBib3VuZFBhcmFtZXRlcjogbnVsbCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAxLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwiUmV0cmlldmVFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWVcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlczoge1xuICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvblNjaGVtYU5hbWU6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6IFwiRWRtLlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBlbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdCA9IG5ldyBFbnZpcm9ubWVudFZhcmlhYmxlUmVxdWVzdChcbiAgICAgICAgICAgIFwidGhlaWFfVGVzdFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZVxuICAgICAgICAgICAgLmV4ZWN1dGUoZW52aXJvbm1lbnRWYXJpYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VCb2R5KSA9PiByZXNwb25zZUJvZHkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgICAgICAvL0JFVFRFUiBXQVlcbiAgICAgICAgICBsZXQgdmFsdWUyID0gYXdhaXQgWHJtRXguZ2V0RW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKFwidGhlaWFfVGVzdFwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZTIpO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogSG93IHRvIGFjY2VzcyBQcm9wb2VydGllcyBkZXNjcmliZWQgaW4gTWljcm9zb2Z0cyBEb2N1bWVudGF0aW9uXG4gICAgICAgICAgICovXG4gICAgICAgICAgLyoqIFlvdSBjYW4gYWNjZXNzIGFsbCBGb3JtIENvbnRleHQgRnVuY3Rpb25zIGhlcmU6IEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXItYXBwcy9kZXZlbG9wZXIvbW9kZWwtZHJpdmVuLWFwcHMvY2xpZW50YXBpL2NsaWVudGFwaS1mb3JtLWNvbnRleHQqL1xuICAgICAgICAgIFhybUV4LkZvcm0uZm9ybUNvbnRleHQuZGF0YS5pc1ZhbGlkKCk7XG5cbiAgICAgICAgICAvKiogWW91IGNhbiBhY2Nlc3MgYWxsIENvbHVtbiBGdW5jdGlvbnMgaGVyZTogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wb3dlci1hcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2F0dHJpYnV0ZXMqL1xuICAgICAgICAgIGZpZWxkcy5CaXJ0aGRheS5BdHRyaWJ1dGUuZ2V0SXNEaXJ0eSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgLiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/dist/src/XrmEx.js b/build/dist/src/XrmEx.js deleted file mode 100644 index ebceb7e..0000000 --- a/build/dist/src/XrmEx.js +++ /dev/null @@ -1,1327 +0,0 @@ -/// -var XrmEx; -(function (XrmEx) { - /** - * Throws an error with the given error message. - * @param {string} errorMessage - The error message to throw. - * @throws {Error} - Always throws an error with the given error message. - */ - function throwError(errorMessage) { - throw new Error(errorMessage); - } - XrmEx.throwError = throwError; - /** - * Returns the name of the calling function. - * @returns {string} - The name of the calling function. - */ - function getMethodName() { - try { - const error = new Error(); - const stackTrace = error.stack?.split("\n").map((line) => line.trim()); - const callingFunctionLine = stackTrace && stackTrace.length >= 3 ? stackTrace[2] : undefined; - const functionNameMatch = callingFunctionLine?.match(/at\s+([^\s]+)\s+\(/); - const functionName = functionNameMatch ? functionNameMatch[1] : ""; - return functionName; - } - catch (error) { - throw new Error(`XrmEx.getMethodName:\n${error.message}`); - } - } - XrmEx.getMethodName = getMethodName; - /** - * Displays a notification for an app with the given message and level, and lets you specify whether to show a close button. - * @param {string} message - The message to display in the notification. - * @param {'SUCCESS' | 'ERROR' | 'WARNING' | 'INFO'} level - The level of the notification. Can be 'SUCCESS', 'ERROR', 'WARNING', or 'INFO'. - * @param {boolean} [showCloseButton=false] - Whether to show a close button on the notification. Defaults to false. - * @returns {Promise} - A promise that resolves with the ID of the created notification. - */ - async function addGlobalNotification(message, level, showCloseButton = false) { - const levelMap = { - SUCCESS: 1, - ERROR: 2, - WARNING: 3, - INFO: 4, - }; - const messageLevel = levelMap[level] || levelMap.INFO; - const notification = { - type: 2, - level: messageLevel, - message, - showCloseButton, - }; - try { - return await Xrm.App.addGlobalNotification(notification); - } - catch (error) { - throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); - } - } - XrmEx.addGlobalNotification = addGlobalNotification; - /** - * Clears a notification in the app with the given unique ID. - * @param {string} uniqueId - The unique ID of the notification to clear. - * @returns {Promise} - A promise that resolves when the notification has been cleared. - */ - async function removeGlobalNotification(uniqueId) { - try { - return await Xrm.App.clearGlobalNotification(uniqueId); - } - catch (error) { - throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); - } - } - XrmEx.removeGlobalNotification = removeGlobalNotification; - /** - * Retrieves the value of an environment variable by using its schema name as key. - * @param {string} environmentVariableSchemaName - The schema name of the environment variable to retrieve. - * @returns {Promise} - A promise that resolves with the value of the environment variable. - */ - async function getEnvironmentVariableValue(environmentVariableSchemaName) { - return executeFunction("RetrieveEnvironmentVariableValue", [ - { - Name: "DefinitionSchemaName", - Type: "String", - Value: environmentVariableSchemaName, - }, - ]); - } - XrmEx.getEnvironmentVariableValue = getEnvironmentVariableValue; - /** - * A map of CRM data types to their corresponding type names, structural properties, and JavaScript types. - * @type {Object.} - */ - let typeMap = { - String: { typeName: "Edm.String", structuralProperty: 1, jsType: "string" }, - Integer: { typeName: "Edm.Int32", structuralProperty: 1, jsType: "number" }, - Boolean: { - typeName: "Edm.Boolean", - structuralProperty: 1, - jsType: "boolean", - }, - DateTime: { - typeName: "Edm.DateTimeOffset", - structuralProperty: 1, - jsType: "object", - }, - EntityReference: { - typeName: "mscrm.crmbaseentity", - structuralProperty: 5, - jsType: "object", - }, - Decimal: { - typeName: "Edm.Decimal", - structuralProperty: 1, - jsType: "number", - }, - Entity: { - typeName: "mscrm.crmbaseentity", - structuralProperty: 5, - jsType: "object", - }, - EntityCollection: { - typeName: "Collection(mscrm.crmbaseentity)", - structuralProperty: 4, - jsType: "object", - }, - Float: { typeName: "Edm.Double", structuralProperty: 1, jsType: "number" }, - Money: { typeName: "Edm.Decimal", structuralProperty: 1, jsType: "number" }, - Picklist: { - typeName: "Edm.Int32", - structuralProperty: 1, - jsType: "number", - }, - }; - /** - * Checks if the given request parameter is of a supported type and has a valid value. - * @param {RequestParameter} requestParameter - The request parameter to check. - * @returns {void} - * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. - */ - function checkRequestParameterType(requestParameter) { - if (!typeMap[requestParameter.Type]) - throw new Error(`The property type ${requestParameter.Type} of the property ${requestParameter.Name} is not supported.`); - const expectedType = typeMap[requestParameter.Type].jsType; - const actualType = typeof requestParameter.Value; - const invalidTypeMessage = `The value ${requestParameter.Value}\nof the property ${requestParameter.Name}\nis not of the expected type ${requestParameter.Type}.`; - if (requestParameter.Type === "EntityReference" || - requestParameter.Type === "Entity") { - if (!requestParameter.Value || - !requestParameter.Value.hasOwnProperty("id") || - !requestParameter.Value.hasOwnProperty("entityType")) { - throw new Error(invalidTypeMessage); - } - typeMap[requestParameter.Type].typeName = `mscrm.${requestParameter.Value.entityType}`; - } - else if (requestParameter.Type === "EntityCollection") { - if (!Array.isArray(requestParameter.Value) || - requestParameter.Value.every((v) => typeof v !== "object" || - !v || - !v.hasOwnProperty("id") || - !v.hasOwnProperty("entityType"))) { - throw new Error(invalidTypeMessage); - } - } - else if (requestParameter.Type === "DateTime") { - if (!(requestParameter.Value instanceof Date)) { - throw new Error(invalidTypeMessage); - } - } - else { - if (actualType !== expectedType) { - throw new Error(invalidTypeMessage); - } - } - } - XrmEx.checkRequestParameterType = checkRequestParameterType; - /** - * Executes an Action. - * @param {string} actionName - The unique name of the action. - * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. - * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. - * @returns {Promise} - A Promise with the request response. - * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. - */ - async function executeAction(actionName, requestParameters, boundEntity) { - const parameterDefinition = {}; - if (boundEntity) - requestParameters.push({ - Name: "entity", - Value: boundEntity, - Type: "EntityReference", - }); - for (const requestParameter of requestParameters) { - checkRequestParameterType(requestParameter); - parameterDefinition[requestParameter.Name] = { - typeName: typeMap[requestParameter.Type].typeName, - structuralProperty: typeMap[requestParameter.Type].structuralProperty, - }; - } - const req = Object.assign({ - getMetadata: () => ({ - boundParameter: boundEntity ? "entity" : null, - operationType: 0, - operationName: actionName, - parameterTypes: parameterDefinition, - }), - }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); - const response = await Xrm.WebApi.online.execute(req); - if (response.ok) - return response.json().catch(() => response); - } - XrmEx.executeAction = executeAction; - /** - * Executes a Function. - * @param {string} functionName - The unique name of the function. - * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. - * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. - * @returns {Promise} - A Promise with the request response. - * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. - */ - async function executeFunction(functionName, requestParameters, boundEntity) { - const parameterDefinition = {}; - if (boundEntity) - requestParameters.push({ - Name: "entity", - Value: boundEntity, - Type: "EntityReference", - }); - for (const requestParameter of requestParameters) { - checkRequestParameterType(requestParameter); - parameterDefinition[requestParameter.Name] = { - typeName: typeMap[requestParameter.Type].typeName, - structuralProperty: typeMap[requestParameter.Type].structuralProperty, - }; - } - const req = Object.assign({ - getMetadata: () => ({ - boundParameter: boundEntity ? "entity" : null, - operationType: 1, - operationName: functionName, - parameterTypes: parameterDefinition, - }), - }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); - const response = await Xrm.WebApi.online.execute(req); - if (response.ok) - return response.json().catch(() => response); - } - XrmEx.executeFunction = executeFunction; - /** - * Makes a GUID lowercase and removes brackets. - * @param {string} guid - The GUID to normalize. - * @returns {string} - The normalized GUID. - */ - function normalizeGuid(guid) { - if (typeof guid !== "string") - throw new Error(`XrmEx.normalizeGuid:\n'${guid}' is not a string`); - return guid.toLowerCase().replace(/[{}]/g, ""); - } - XrmEx.normalizeGuid = normalizeGuid; - /** - * Opens a dialog with dynamic height and width based on text content. - * @param {string} title - The title of the dialog. - * @param {string} text - The text content of the dialog. - * @returns {Promise} - A Promise with the dialog response. - */ - async function openAlertDialog(title, text) { - try { - const rows = text.split(/\r\n|\r|\n/); - let additionalRows = 0; - rows.forEach((row) => { - let width = getTextWidth(row, "1rem Segoe UI Regular, SegoeUI, Segoe UI"); - if (width > 940) { - additionalRows += width / 940; - } - }); - const longestRow = rows.reduce((acc, row) => (row.length > acc.length ? row : acc), ""); - const width = Math.min(getTextWidth(longestRow, "1rem Segoe UI Regular, SegoeUI, Segoe UI"), 1000); - const height = 109 + (rows.length + additionalRows) * 20; - return await Xrm.Navigation.openAlertDialog({ - confirmButtonLabel: "Ok", - text, - title, - }, { - height, - width, - }); - } - catch (error) { - console.error(error.message); - throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); - } - /** - * Uses canvas.measureText to compute and return the width of the given text of given font in pixels. - * - * @param {String} text The text to be rendered. - * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana"). - * - * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393 - */ - function getTextWidth(text, font) { - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); - context.font = font; - const metrics = context.measureText(text); - return metrics.width; - } - } - XrmEx.openAlertDialog = openAlertDialog; - /** - * Represents a form in Dynamics 365. - */ - class Form { - static _formContext; - static _executionContext; - constructor() { } - /**Gets a reference to the current form context*/ - static get formContext() { - return this._formContext; - } - /**Gets a reference to the current executio context*/ - static get executionContext() { - return this._executionContext; - } - /**Gets a lookup value that references the record.*/ - static get entityReference() { - return Form.formContext.data.entity.getEntityReference(); - } - /**Sets a reference to the current form context*/ - static set formContext(context) { - if ("getFormContext" in context) { - this._executionContext = context; - this._formContext = context.getFormContext(); - } - else if ("data" in context) - this._formContext = context; - else - throw new Error(`XrmEx.Form.setFormContext: The executionContext or formContext was not passed to the function.`); - } - /**Sets a reference to the current execution context*/ - static set executionContext(context) { - if ("getFormContext" in context) { - this._executionContext = context; - this._formContext = context.getFormContext(); - } - else if ("data" in context) - this._formContext = context; - else - throw new Error(`XrmEx.Form.setExecutionContext: The executionContext or formContext was not passed to the function.`); - } - /**Returns true if form is from type create*/ - static get IsCreate() { - return Form.formContext.ui.getFormType() == 1; - } - /**Returns true if form is from type update*/ - static get IsUpdate() { - return Form.formContext.ui.getFormType() == 2; - } - /**Returns true if form is not from type create*/ - static get IsNotCreate() { - return Form.formContext.ui.getFormType() != 1; - } - /**Returns true if form is not from type update*/ - static get IsNotUpdate() { - return Form.formContext.ui.getFormType() != 2; - } - /** - * Displays a form level notification. Any number of notifications can be displayed and will remain until removed using clearFormNotification. - * The height of the notification area is limited so each new message will be added to the top. - * @param message The text of the notification message. - * @param level The level of the notification which defines how the message will be displayed, such as the icon. - * ERROR: Notification will use the system error icon. - * WARNING: Notification will use the system warning icon. - * INFO: Notification will use the system info icon. - * @param uniqueId Unique identifier for the notification which is used with clearFormNotification to remove the notification. - * @returns true if it succeeds, otherwise false. - */ - static addFormNotification(message, level, uniqueId) { - try { - return Form.formContext.ui.setFormNotification(message, level, uniqueId); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Clears the form notification described by uniqueId. - * @param uniqueId Unique identifier. - * @returns True if it succeeds, otherwise false. - */ - static removeFormNotification(uniqueId) { - try { - return Form.formContext.ui.clearFormNotification(uniqueId); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a handler to be called when the record is saved. - */ - static addOnSaveEventHandler(handlers) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - Form.formContext.data.entity.addOnSave(handler); - }); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a function to be called after the OnSave is complete. - * @param handler The handler. - * @remarks Added in 9.2 - * @see {@link https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/events/postsave External Link: PostSave Event Documentation} - */ - static addOnPostSaveEventHandler(handlers) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - Form.formContext.data.entity.addOnPostSave(handler); - }); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a function to be called when form data is loaded. - * @param handler The function to be executed when the form data loads. The function will be added to the bottom of the event handler pipeline. - */ - static addOnLoadEventHandler(handlers) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - Form.formContext.data.addOnLoad(handler); - }); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a handler to be called when the attribute's value is changed. - * @param handler The function reference. - */ - static addOnChangeEventHandler(fields, handlers, execute) { - try { - if (!Array.isArray(handlers)) { - handlers = [handlers]; - } - handlers.forEach((handler) => { - if (typeof handler !== "function") { - throw new Error(`'${handler}' is not a function`); - } - fields.forEach((field) => { - field.addOnChange(handler); - }); - }); - if (execute) { - fields.forEach((field) => { - field.Attribute.fireOnChange(); - }); - } - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.Form = Form; - /** - * Used to execute methods related to a single Attribute - */ - class Field { - static allFields = []; - Name; - _attribute; - constructor(attributeName) { - const existingField = Field.allFields.find((f) => f.Name === attributeName); - if (existingField) { - return existingField; - } - this.Name = attributeName; - Field.allFields.push(this); - } - setValue(value) { - return this.Attribute.setValue(value); - } - getAttributeType() { - return this.Attribute.getAttributeType(); - } - getFormat() { - return this.Attribute.getFormat(); - } - getIsDirty() { - return this.Attribute.getIsDirty(); - } - getName() { - return this.Attribute.getName(); - } - getParent() { - return this.Attribute.getParent(); - } - getRequiredLevel() { - return this.Attribute.getRequiredLevel(); - } - getSubmitMode() { - return this.Attribute.getSubmitMode(); - } - getUserPrivilege() { - return this.Attribute.getUserPrivilege(); - } - removeOnChange(handler) { - return this.Attribute.removeOnChange(handler); - } - setSubmitMode(submitMode) { - return this.Attribute.setSubmitMode(submitMode); - } - getValue() { - return this.Attribute.getValue(); - } - setIsValid(isValid, message) { - return this.Attribute.setIsValid(isValid, message); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`The attribute '${this.Name}' was not found on the form.`)); - } - get controls() { - return this.Attribute.controls; - } - /** - * Gets the value. - * @returns The value. - */ - get Value() { - return this.Attribute.getValue(); - } - set Value(value) { - this.Attribute.setValue(value); - } - /** - * Sets a control-local notification message. - * @param message The message. - * @param uniqueId Unique identifier. - * @returns true if it succeeds, false if it fails. - * @remarks When this method is used on Microsoft Dynamics CRM for tablets a red "X" icon - * appears next to the control. Tapping on the icon will display the message. - */ - setNotification(message, uniqueId) { - try { - if (!message) - throw new Error(`no message was provided.`); - if (!uniqueId) - throw new Error(`no uniqueId was provided.`); - this.controls.forEach((control) => control.setNotification(message, uniqueId)); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the visibility state. - * @param visible true to show, false to hide. - */ - setVisible(visible) { - try { - this.controls.forEach((control) => control.setVisible(visible)); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the state of the control to either enabled, or disabled. - * @param disabled true to disable, false to enable. - */ - setDisabled(disabled) { - try { - this.controls.forEach((control) => control.setDisabled(disabled)); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the required level. - * @param requirementLevel The requirement level, as either "none", "required", or "recommended" - */ - setRequiredLevel(requirementLevel) { - try { - this.Attribute.setRequiredLevel(requirementLevel); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Sets the required level. - * @param required The requirement level, as either false for "none" or true for "required" - */ - setRequired(required) { - try { - this.Attribute.setRequiredLevel(required ? "required" : "none"); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /**Fire all "on change" event handlers. */ - fireOnChange() { - try { - this.Attribute.fireOnChange(); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds a handler or an array of handlers to be called when the attribute's value is changed. - * @param handlers The function reference or an array of function references. - */ - addOnChange(handlers) { - try { - if (Array.isArray(handlers)) { - for (const handler of handlers) { - if (typeof handler !== "function") - throw new Error(`'${handler}' is not a function`); - this.Attribute.removeOnChange(handler); - this.Attribute.addOnChange(handler); - } - } - else { - if (typeof handlers !== "function") - throw new Error(`'${handlers}' is not a function`); - this.Attribute.removeOnChange(handlers); - this.Attribute.addOnChange(handlers); - } - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Displays an error or recommendation notification for a control, and lets you specify actions to execute based on the notification. - */ - addNotification(message, notificationLevel, uniqueId, actions) { - try { - if (!uniqueId) - throw new Error(`no uniqueId was provided.`); - if (actions && !Array.isArray(actions)) - throw new Error(`the action parameter is not an array of ControlNotificationAction`); - this.controls.forEach((control) => { - control.addNotification({ - messages: [message], - notificationLevel: notificationLevel, - uniqueId: uniqueId, - actions: actions, - }); - }); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Clears the notification identified by uniqueId. - * @param uniqueId (Optional) Unique identifier. - * @returns true if it succeeds, false if it fails. - * @remarks If the uniqueId parameter is not used, the current notification shown will be removed. - */ - removeNotification(uniqueId) { - try { - this.controls.forEach((control) => { - control.clearNotification(uniqueId); - }); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.Field = Field; - class TextField extends Field { - constructor(attribute) { - super(attribute); - } - getMaxLength() { - return this.Attribute.getMaxLength(); - } - getFormat() { - return this.Attribute.getFormat(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.TextField = TextField; - class NumberField extends Field { - constructor(attribute) { - super(attribute); - } - getFormat() { - return this.Attribute.getFormat(); - } - getMax() { - return this.Attribute.getMax(); - } - getMin() { - return this.Attribute.getMin(); - } - getPrecision() { - return this.Attribute.getPrecision(); - } - setPrecision(precision) { - return this.Attribute.setPrecision(precision); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.NumberField = NumberField; - class DateField extends Field { - constructor(attribute) { - super(attribute); - } - getFormat() { - return this.Attribute.getFormat(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.DateField = DateField; - class BooleanField extends Field { - constructor(attribute) { - super(attribute); - } - getAttributeType() { - return this.Attribute.getAttributeType(); - } - getInitialValue() { - return this.Attribute.getInitialValue(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - } - XrmEx.BooleanField = BooleanField; - class MultiSelectOptionSetField extends Field { - Option; - constructor(attributeName, option) { - super(attributeName); - this.Option = option; - } - getFormat() { - return this.Attribute.getFormat(); - } - getOption(value) { - if (typeof value === "number") { - return this.Attribute.getOption(value); - } - else { - return this.Attribute.getOption(value); - } - } - getOptions() { - return this.Attribute.getOptions(); - } - getSelectedOption() { - return this.Attribute.getSelectedOption(); - } - getText() { - return this.Attribute.getText(); - } - getInitialValue() { - return this.Attribute.getInitialValue(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get Value() { - return this.Attribute.getValue(); - } - set Value(value) { - if (Array.isArray(value)) { - let values = []; - value.forEach((v) => { - if (typeof v == "number") - values.push(v); - else - values.push(this.Option[v]); - }); - this.Attribute.setValue(values); - } - else - XrmEx.throwError(`Field Value '${value}' is not an Array`); - } - } - XrmEx.MultiSelectOptionSetField = MultiSelectOptionSetField; - class LookupField extends Field { - _customFilters = []; - constructor(attribute) { - super(attribute); - } - getIsPartyList() { - return this.Attribute.getIsPartyList(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - /**Gets the id of the first lookup value*/ - get Id() { - return this.Value && this.Value.length > 0 - ? XrmEx.normalizeGuid(this.Value[0].id) - : null; - } - /**Gets the entityType of the first lookup value*/ - get EntityType() { - return this.Value && this.Value.length > 0 - ? this.Value[0].entityType - : null; - } - /**Gets the formatted value of the first lookup value*/ - get FormattedValue() { - return this.Value && this.Value.length > 0 ? this.Value[0].name : null; - } - get Value() { - return this.Attribute.getValue() ?? null; - } - set Value(value) { - this.Attribute.setValue(value); - } - /** - * Sets the value of a lookup - * @param id Guid of the record - * @param entityType logicalname of the entity - * @param name formatted value - * @param append if true, adds value to the array instead of replacing it - */ - setLookupValue(id, entityType, name, append = false) { - try { - if (!id) - throw new Error(`no id parameter was provided.`); - if (!entityType) - throw new Error(`no entityType parameter was provided.`); - id = XrmEx.normalizeGuid(id); - const lookupValue = { - id, - entityType, - name, - }; - this.Value = - append && this.Value ? this.Value.concat(lookupValue) : [lookupValue]; - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Retrieves an entity record. - * @param options (Optional) OData system query options, $select and $expand, to retrieve your data. - * - Use the $select system query option to limit the properties returned by including a comma-separated - * list of property names. This is an important performance best practice. If properties aren’t - * specified using $select, all properties will be returned. - * - Use the $expand system query option to control what data from related entities is returned. If you - * just include the name of the navigation property, you’ll receive all the properties for related - * records. You can limit the properties returned for related records using the $select system query - * option in parentheses after the navigation property name. Use this for both single-valued and - * collection-valued navigation properties. - * - You can also specify multiple query options by using & to separate the query options. - * @example options example: - * options: $select=name&$expand=primarycontactid($select=contactid,fullname) - * @returns On success, returns a promise containing a JSON object with the retrieved attributes and their values. - * @see {@link https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/reference/xrm-webapi/retrieverecord External Link: retrieveRecord (Client API reference)} - */ - async retrieve(options) { - try { - if (!this.Id || !this.EntityType) - return null; - const record = await Xrm.WebApi.retrieveRecord(this.EntityType, this.Id, options); - return record; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Adds an additional custom filter to the lookup, with the "AND" filter operator. - * @param filter Specifies the filter, as a serialized FetchXML "filter" node. - * @param entityLogicalName (Optional) The logical name of the entity. - * @remarks If entityLogicalName is not specified, the filter will be applied to all entities - * valid for the Lookup control. - * @example Example filter: - * - * - */ - addPreFilterToLookup(filterXml, entityLogicalName) { - try { - _addCustomFilter.controls = this.controls; - this.controls.forEach((control) => { - control.addPreSearch(_addCustomFilter); - }); - this._customFilters.push(_addCustomFilter); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - function _addCustomFilter() { - _addCustomFilter.controls.forEach((control) => { - control.addCustomFilter(filterXml, entityLogicalName); - }); - } - } - /** - * Adds an additional custom filter to the lookup, with the "AND" filter operator. - * @param entityLogicalName (Optional) The logical name of the entity. - * @param primaryAttributeIdName (Optional) The logical name of the primary key. - * @param fetchXml Specifies the FetchXML used to filter. - * @remarks If entityLogicalName is not specified, the filter will be applied to all entities - * valid for the Lookup control. - * @example Example fetchXml: - * - * - * - * - * - * - */ - async addPreFilterToLookupAdvanced(entityLogicalName, primaryAttributeIdName, fetchXml) { - try { - const result = await Xrm.WebApi.online.retrieveMultipleRecords(entityLogicalName, "?fetchXml=" + fetchXml); - const data = result.entities; - let filteredEntities = ""; - _addCustomFilter.controls = this.controls; - data.forEach((item) => { - filteredEntities += `${item[primaryAttributeIdName]}`; - }); - fetchXml = filteredEntities - ? `${filteredEntities}` - : ``; - this.controls.forEach((control) => { - control.addPreSearch(_addCustomFilter); - }); - this._customFilters.push(_addCustomFilter); - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - function _addCustomFilter() { - _addCustomFilter.controls.forEach((control) => { - control.addCustomFilter(fetchXml, entityLogicalName); - }); - } - } - /** - * Removes all filters set on the current lookup attribute by using addPreFilterToLookup or addPreFilterToLookupAdvanced - */ - clearPreFilterFromLookup() { - try { - this._customFilters.forEach((customFilter) => { - this.controls.forEach((control) => { - control.removePreSearch(customFilter); - }); - }); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.LookupField = LookupField; - class OptionsetField extends Field { - _control; - Option; - constructor(attributeName, option) { - super(attributeName); - this.Option = option; - } - getFormat() { - return this.Attribute.getFormat(); - } - getOption(value) { - if (typeof value === "number") { - return this.Attribute.getOption(value); - } - else { - return this.Attribute.getOption(value); - } - } - getOptions() { - return this.Attribute.getOptions(); - } - getSelectedOption() { - return this.Attribute.getSelectedOption(); - } - getText() { - return this.Attribute.getText(); - } - getInitialValue() { - return this.Attribute.getInitialValue(); - } - get Attribute() { - return (this._attribute ??= - Form.formContext.getAttribute(this.Name) ?? - XrmEx.throwError(`Field '${this.Name}' does not exist`)); - } - get controls() { - return this.Attribute.controls; - } - get control() { - return (this._control ??= - Form.formContext.getControl(this.Name) ?? - XrmEx.throwError(`Control '${this.Name}' does not exist`)); - } - get Value() { - return this.Attribute.getValue(); - } - set Value(value) { - if (typeof value == "number") - this.Attribute.setValue(value); - else - this.Attribute.setValue(this.Option[value]); - } - /** - * Adds an option. - * - * @param values an array with the option values to add - * @param index (Optional) zero-based index of the option. - * - * @remarks This method does not check that the values within the options you add are valid. - * If index is not provided, the new option will be added to the end of the list. - */ - addOption(values, index) { - try { - if (!Array.isArray(values)) - throw new Error(`values is not an Array:\nvalues: '${values}'`); - const optionSetValues = this.control.getAttribute().getOptions() ?? []; - for (const element of optionSetValues) { - if (values.includes(element.value)) { - this.control.addOption(element, index); - } - } - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Removes the option matching the value. - * - * @param value The value. - */ - removeOption(values) { - try { - if (!Array.isArray(values)) - throw new Error(`values is not an Array:\nvalues: '${values}'`); - const optionSetValues = this.control.getAttribute().getOptions() ?? []; - for (const element of optionSetValues) { - if (values.includes(element.value)) { - this.control.removeOption(element.value); - } - } - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - /** - * Clears all options. - */ - clearOptions() { - try { - this.control.clearOptions(); - return this; - } - catch (error) { - throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - XrmEx.OptionsetField = OptionsetField; - class Section { - Name; - _section; - parentTab; - constructor(name) { - this.Name = name; - } - get Section() { - return (this._section ??= - this.parentTab.sections.get(this.Name) ?? - XrmEx.throwError(`The section '${this.Name}' was not found on the form.`)); - } - getName() { - return this.Section.getName(); - } - getParent() { - return this.Section.getParent(); - } - controls; - setVisible(visible) { - return this.Section.setVisible(visible); - } - getVisible() { - return this.Section.getVisible(); - } - getLabel() { - return this.Section.getLabel(); - } - setLabel(label) { - return this.Section.setLabel(label); - } - } - XrmEx.Section = Section; - class Tab { - Name; - _tab; - Section; - constructor(name, section) { - this.Name = name; - this.Section = section; - for (let key in section) { - section[key].parentTab = this; - } - } - sections; - get Tab() { - return (this._tab ??= - Form.formContext.ui.tabs.get(this.Name) ?? - XrmEx.throwError(`The tab '${this.Name}' was not found on the form.`)); - } - addTabStateChange(handler) { - return this.Tab.addTabStateChange(handler); - } - getDisplayState() { - return this.Tab.getDisplayState(); - } - getName() { - return this.Tab.getName(); - } - getParent() { - return this.Tab.getParent(); - } - removeTabStateChange(handler) { - return this.Tab.removeTabStateChange(handler); - } - setDisplayState(displayState) { - return this.Tab.setDisplayState(displayState); - } - setVisible(visible) { - return this.Tab.setVisible(visible); - } - getVisible() { - return this.Tab.getVisible(); - } - getLabel() { - return this.Tab.getLabel(); - } - setLabel(label) { - return this.Tab.setLabel(label); - } - setFocus() { - return this.Tab.setFocus(); - } - } - XrmEx.Tab = Tab; - class GridControl { - Name; - _gridControl; - constructor(name) { - this.Name = name; - } - get GridControl() { - return ((this._gridControl ??= - Form.formContext.getControl(this.Name)) ?? - XrmEx.throwError(`The grid '${this.Name}' was not found on the form.`)); - } - get Grid() { - return this.GridControl.getGrid(); - } - addOnLoad(handler) { - return this.GridControl.addOnLoad(handler); - } - getContextType() { - return this.GridControl.getContextType(); - } - getEntityName() { - return this.GridControl.getEntityName(); - } - getFetchXml() { - return this.GridControl.getFetchXml(); - } - getGrid() { - return this.GridControl.getGrid(); - } - getRelationship() { - return this.GridControl.getRelationship(); - } - getUrl(client) { - return this.GridControl.getUrl(client); - } - getViewSelector() { - return this.GridControl.getViewSelector(); - } - openRelatedGrid() { - return this.GridControl.openRelatedGrid(); - } - refresh() { - return this.GridControl.refresh(); - } - refreshRibbon() { - return this.GridControl.refreshRibbon(); - } - removeOnLoad(handler) { - return this.GridControl.removeOnLoad(handler); - } - getControlType() { - return this.GridControl.getControlType(); - } - getName() { - return this.GridControl.getName(); - } - getParent() { - return this.GridControl.getParent(); - } - getLabel() { - return this.GridControl.getLabel(); - } - setLabel(label) { - return this.GridControl.setLabel(label); - } - getVisible() { - return this.GridControl.getVisible(); - } - setVisible(visible) { - return this.GridControl.setVisible(visible); - } - } - XrmEx.GridControl = GridControl; -})(XrmEx || (XrmEx = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWHJtRXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvWHJtRXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOERBQThEO0FBa0M5RCxJQUFVLEtBQUssQ0FvNUNkO0FBcDVDRCxXQUFVLEtBQUs7SUFDYjs7OztPQUlHO0lBQ0gsU0FBZ0IsVUFBVSxDQUFDLFlBQW9CO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUZlLGdCQUFVLGFBRXpCLENBQUE7SUFDRDs7O09BR0c7SUFDSCxTQUFnQixhQUFhO1FBQzNCLElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxtQkFBbUIsR0FDdkIsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLGlCQUFpQixHQUNyQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVuRSxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQWRlLG1CQUFhLGdCQWM1QixD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RSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxRQUFRLENBQUMsS0FBYTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxVQUFVLENBQUMsT0FBZ0I7WUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQ0Y7SUF6RVksaUJBQVcsY0F5RXZCLENBQUE7QUFDSCxDQUFDLEVBcDVDUyxLQUFLLEtBQUwsS0FBSyxRQW81Q2QiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vbm9kZV9tb2R1bGVzL0B0eXBlcy94cm0vaW5kZXguZC50c1wiIC8+XG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgZm9yIGEgcmVxdWVzdC5cbiAqIEB0eXBlIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7J0Jvb2xlYW4nIHwgJ0RhdGVUaW1lJyB8ICdEZWNpbWFsJyB8ICdFbnRpdHknIHwgJ0VudGl0eUNvbGxlY3Rpb24nIHwgJ0VudGl0eVJlZmVyZW5jZScgfCAnRmxvYXQnIHwgJ0ludGVnZXInIHwgJ01vbmV5JyB8ICdQaWNrbGlzdCcgfCAnU3RyaW5nJ30gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkgeyp9IFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbnR5cGUgUmVxdWVzdFBhcmFtZXRlciA9IHtcbiAgTmFtZTogc3RyaW5nO1xuICBUeXBlOlxuICAgIHwgXCJCb29sZWFuXCJcbiAgICB8IFwiRGF0ZVRpbWVcIlxuICAgIHwgXCJEZWNpbWFsXCJcbiAgICB8IFwiRW50aXR5XCJcbiAgICB8IFwiRW50aXR5Q29sbGVjdGlvblwiXG4gICAgfCBcIkVudGl0eVJlZmVyZW5jZVwiXG4gICAgfCBcIkZsb2F0XCJcbiAgICB8IFwiSW50ZWdlclwiXG4gICAgfCBcIk1vbmV5XCJcbiAgICB8IFwiUGlja2xpc3RcIlxuICAgIHwgXCJTdHJpbmdcIjtcbiAgVmFsdWU6IGFueTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW50aXR5LlxuICogQHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudGl0eVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5LlxuICovXG50eXBlIEVudGl0eVJlZmVyZW5jZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xufTtcbm5hbWVzcGFjZSBYcm1FeCB7XG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIHRocm93LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBBbHdheXMgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2ROYW1lKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICBjb25zdCBzdGFja1RyYWNlID0gZXJyb3Iuc3RhY2s/LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICAgICAgY29uc3QgY2FsbGluZ0Z1bmN0aW9uTGluZSA9XG4gICAgICAgIHN0YWNrVHJhY2UgJiYgc3RhY2tUcmFjZS5sZW5ndGggPj0gMyA/IHN0YWNrVHJhY2VbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVNYXRjaCA9XG4gICAgICAgIGNhbGxpbmdGdW5jdGlvbkxpbmU/Lm1hdGNoKC9hdFxccysoW15cXHNdKylcXHMrXFwoLyk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWVNYXRjaCA/IGZ1bmN0aW9uTmFtZU1hdGNoWzFdIDogXCJcIjtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LmdldE1ldGhvZE5hbWU6XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpZmljYXRpb24gZm9yIGFuIGFwcCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBsZXZlbCwgYW5kIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0byBzaG93IGEgY2xvc2UgYnV0dG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIG5vdGlmaWNhdGlvbi5cbiAgICogQHBhcmFtIHsnU1VDQ0VTUycgfCAnRVJST1InIHwgJ1dBUk5JTkcnIHwgJ0lORk8nfSBsZXZlbCAtIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uLiBDYW4gYmUgJ1NVQ0NFU1MnLCAnRVJST1InLCAnV0FSTklORycsIG9yICdJTkZPJy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0Nsb3NlQnV0dG9uPWZhbHNlXSAtIFdoZXRoZXIgdG8gc2hvdyBhIGNsb3NlIGJ1dHRvbiBvbiB0aGUgbm90aWZpY2F0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBJRCBvZiB0aGUgY3JlYXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2xvYmFsTm90aWZpY2F0aW9uKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsZXZlbDogXCJTVUNDRVNTXCIgfCBcIkVSUk9SXCIgfCBcIldBUk5JTkdcIiB8IFwiSU5GT1wiLFxuICAgIHNob3dDbG9zZUJ1dHRvbiA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbGV2ZWxNYXAgPSB7XG4gICAgICBTVUNDRVNTOiAxLFxuICAgICAgRVJST1I6IDIsXG4gICAgICBXQVJOSU5HOiAzLFxuICAgICAgSU5GTzogNCxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2VMZXZlbCA9IGxldmVsTWFwW2xldmVsXSB8fCBsZXZlbE1hcC5JTkZPO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICAgIHR5cGU6IDIsXG4gICAgICBsZXZlbDogbWVzc2FnZUxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNob3dDbG9zZUJ1dHRvbixcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5hZGRHbG9iYWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7Z2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgYSBub3RpZmljYXRpb24gaW4gdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiB1bmlxdWUgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bmlxdWVJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBjbGVhci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4gY2xlYXJlZC5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHbG9iYWxOb3RpZmljYXRpb24oXG4gICAgdW5pcXVlSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5jbGVhckdsb2JhbE5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke2dldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBieSB1c2luZyBpdHMgc2NoZW1hIG5hbWUgYXMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWUgLSBUaGUgc2NoZW1hIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBleGVjdXRlRnVuY3Rpb24oXCJSZXRyaWV2ZUVudmlyb25tZW50VmFyaWFibGVWYWx1ZVwiLCBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwiRGVmaW5pdGlvblNjaGVtYU5hbWVcIixcbiAgICAgICAgVHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgVmFsdWU6IGVudmlyb25tZW50VmFyaWFibGVTY2hlbWFOYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuICAvKipcbiAgICogQSBtYXAgb2YgQ1JNIGRhdGEgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlIG5hbWVzLCBzdHJ1Y3R1cmFsIHByb3BlcnRpZXMsIGFuZCBKYXZhU2NyaXB0IHR5cGVzLlxuICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIHsgdHlwZU5hbWU6IHN0cmluZywgc3RydWN0dXJhbFByb3BlcnR5OiBudW1iZXIsIGpzVHlwZTogc3RyaW5nIH0+fVxuICAgKi9cbiAgbGV0IHR5cGVNYXAgPSB7XG4gICAgU3RyaW5nOiB7IHR5cGVOYW1lOiBcIkVkbS5TdHJpbmdcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBJbnRlZ2VyOiB7IHR5cGVOYW1lOiBcIkVkbS5JbnQzMlwiLCBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsIGpzVHlwZTogXCJudW1iZXJcIiB9LFxuICAgIEJvb2xlYW46IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5Cb29sZWFuXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgRGF0ZVRpbWU6IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5EYXRlVGltZU9mZnNldFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm9iamVjdFwiLFxuICAgIH0sXG4gICAgRW50aXR5UmVmZXJlbmNlOiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBEZWNpbWFsOiB7XG4gICAgICB0eXBlTmFtZTogXCJFZG0uRGVjaW1hbFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgRW50aXR5OiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBFbnRpdHlDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlTmFtZTogXCJDb2xsZWN0aW9uKG1zY3JtLmNybWJhc2VlbnRpdHkpXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDQsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBGbG9hdDogeyB0eXBlTmFtZTogXCJFZG0uRG91YmxlXCIsIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSwganNUeXBlOiBcIm51bWJlclwiIH0sXG4gICAgTW9uZXk6IHsgdHlwZU5hbWU6IFwiRWRtLkRlY2ltYWxcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwibnVtYmVyXCIgfSxcbiAgICBQaWNrbGlzdDoge1xuICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaXMgb2YgYSBzdXBwb3J0ZWQgdHlwZSBhbmQgaGFzIGEgdmFsaWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcn0gcmVxdWVzdFBhcmFtZXRlciAtIFRoZSByZXF1ZXN0IHBhcmFtZXRlciB0byBjaGVjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShcbiAgICByZXF1ZXN0UGFyYW1ldGVyOiBSZXF1ZXN0UGFyYW1ldGVyXG4gICk6IHZvaWQge1xuICAgIGlmICghdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHByb3BlcnR5IHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9IG9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX0gaXMgbm90IHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS5qc1R5cGU7XG4gICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlO1xuICAgIGNvbnN0IGludmFsaWRUeXBlTWVzc2FnZSA9IGBUaGUgdmFsdWUgJHtyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlfVxcbm9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX1cXG5pcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9LmA7XG4gICAgaWYgKFxuICAgICAgcmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eVJlZmVyZW5jZVwiIHx8XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyLlR5cGUgPT09IFwiRW50aXR5XCJcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgfHxcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFwiKSB8fFxuICAgICAgICAhcmVxdWVzdFBhcmFtZXRlci5WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHR5cGVNYXBbXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXIuVHlwZVxuICAgICAgXS50eXBlTmFtZSA9IGBtc2NybS4ke3JlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuZW50aXR5VHlwZX1gO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eUNvbGxlY3Rpb25cIikge1xuICAgICAgaWYgKFxuICAgICAgICAhQXJyYXkuaXNBcnJheShyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlKSB8fFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlLmV2ZXJ5KFxuICAgICAgICAgICh2KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHYgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgICF2IHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpIHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkVHlwZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkRhdGVUaW1lXCIpIHtcbiAgICAgIGlmICghKHJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdHVhbFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIEFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyW119IHJlcXVlc3RQYXJhbWV0ZXJzIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZSwgdHlwZSBhbmQgdmFsdWUuXG4gICAqIEBwYXJhbSB7RW50aXR5UmVmZXJlbmNlfSBbYm91bmRFbnRpdHldIC0gQW4gb3B0aW9uYWwgRW50aXR5UmVmZXJlbmNlIG9mIHRoZSBib3VuZCBlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBQcm9taXNlIHdpdGggdGhlIHJlcXVlc3QgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihcbiAgICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJbXSxcbiAgICBib3VuZEVudGl0eT86IEVudGl0eVJlZmVyZW5jZVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckRlZmluaXRpb246IGFueSA9IHt9O1xuICAgIGlmIChib3VuZEVudGl0eSlcbiAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICBOYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBWYWx1ZTogYm91bmRFbnRpdHksXG4gICAgICAgIFR5cGU6IFwiRW50aXR5UmVmZXJlbmNlXCIsXG4gICAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RQYXJhbWV0ZXIgb2YgcmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgIGNoZWNrUmVxdWVzdFBhcmFtZXRlclR5cGUocmVxdWVzdFBhcmFtZXRlcik7XG4gICAgICBwYXJhbWV0ZXJEZWZpbml0aW9uW3JlcXVlc3RQYXJhbWV0ZXIuTmFtZV0gPSB7XG4gICAgICAgIHR5cGVOYW1lOiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0udHlwZU5hbWUsXG4gICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdLnN0cnVjdHVyYWxQcm9wZXJ0eSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGdldE1ldGFkYXRhOiAoKSA9PiAoe1xuICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBib3VuZEVudGl0eSA/IFwiZW50aXR5XCIgOiBudWxsLFxuICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyRGVmaW5pdGlvbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgLi4ucmVxdWVzdFBhcmFtZXRlcnMubWFwKChwKSA9PiAoeyBbcC5OYW1lXTogcC5WYWx1ZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgWHJtLldlYkFwaS5vbmxpbmUuZXhlY3V0ZShyZXEpO1xuICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBGdW5jdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcltdfSByZXF1ZXN0UGFyYW1ldGVycyAtIEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgcGFyYW1ldGVyIG5hbWUsIHR5cGUgYW5kIHZhbHVlLlxuICAgKiBAcGFyYW0ge0VudGl0eVJlZmVyZW5jZX0gW2JvdW5kRW50aXR5XSAtIEFuIG9wdGlvbmFsIEVudGl0eVJlZmVyZW5jZSBvZiB0aGUgYm91bmQgZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgUHJvbWlzZSB3aXRoIHRoZSByZXF1ZXN0IHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3QgcGFyYW1ldGVyIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVGdW5jdGlvbihcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICByZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcltdLFxuICAgIGJvdW5kRW50aXR5PzogRW50aXR5UmVmZXJlbmNlXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyRGVmaW5pdGlvbjogYW55ID0ge307XG4gICAgaWYgKGJvdW5kRW50aXR5KVxuICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIE5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIFZhbHVlOiBib3VuZEVudGl0eSxcbiAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdFBhcmFtZXRlciBvZiByZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShyZXF1ZXN0UGFyYW1ldGVyKTtcbiAgICAgIHBhcmFtZXRlckRlZmluaXRpb25bcmVxdWVzdFBhcmFtZXRlci5OYW1lXSA9IHtcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS50eXBlTmFtZSxcbiAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0uc3RydWN0dXJhbFByb3BlcnR5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgZ2V0TWV0YWRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgYm91bmRQYXJhbWV0ZXI6IGJvdW5kRW50aXR5ID8gXCJlbnRpdHlcIiA6IG51bGwsXG4gICAgICAgICAgb3BlcmF0aW9uVHlwZTogMSxcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlckRlZmluaXRpb24sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIC4uLnJlcXVlc3RQYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHsgW3AuTmFtZV06IHAuVmFsdWUgfSkpXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lLmV4ZWN1dGUocmVxKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgR1VJRCBsb3dlcmNhc2UgYW5kIHJlbW92ZXMgYnJhY2tldHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gVGhlIEdVSUQgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBub3JtYWxpemVkIEdVSUQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplR3VpZChndWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZ3VpZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXgubm9ybWFsaXplR3VpZDpcXG4nJHtndWlkfScgaXMgbm90IGEgc3RyaW5nYCk7XG4gICAgcmV0dXJuIGd1aWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9be31dL2csIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVucyBhIGRpYWxvZyB3aXRoIGR5bmFtaWMgaGVpZ2h0IGFuZCB3aWR0aCBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRpYWxvZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIFByb21pc2Ugd2l0aCB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5BbGVydERpYWxvZyhcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZ1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICAgIGxldCBhZGRpdGlvbmFsUm93cyA9IDA7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh3aWR0aCA+IDk0MCkge1xuICAgICAgICAgIGFkZGl0aW9uYWxSb3dzICs9IHdpZHRoIC8gOTQwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvbmdlc3RSb3cgPSByb3dzLnJlZHVjZShcbiAgICAgICAgKGFjYywgcm93KSA9PiAocm93Lmxlbmd0aCA+IGFjYy5sZW5ndGggPyByb3cgOiBhY2MpLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgZ2V0VGV4dFdpZHRoKGxvbmdlc3RSb3csIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiKSxcbiAgICAgICAgMTAwMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IDEwOSArIChyb3dzLmxlbmd0aCArIGFkZGl0aW9uYWxSb3dzKSAqIDIwO1xuICAgICAgcmV0dXJuIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbmZpcm1CdXR0b25MYWJlbDogXCJPa1wiLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtnZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlcyBjYW52YXMubWVhc3VyZVRleHQgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gdGV4dCBvZiBnaXZlbiBmb250IGluIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb250IFRoZSBjc3MgZm9udCBkZXNjcmlwdG9yIHRoYXQgdGV4dCBpcyB0byBiZSByZW5kZXJlZCB3aXRoIChlLmcuIFwiYm9sZCAxNHB4IHZlcmRhbmFcIikuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExODI0MS9jYWxjdWxhdGUtdGV4dC13aWR0aC13aXRoLWphdmFzY3JpcHQvMjEwMTUzOTMjMjEwMTUzOTNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dDogc3RyaW5nLCBmb250OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgIHJldHVybiBtZXRyaWNzLndpZHRoO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGZvcm0gaW4gRHluYW1pY3MgMzY1LlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEZvcm0ge1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2Zvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZXhlY3V0aW9uQ29udGV4dDogWHJtLkV2ZW50cy5FdmVudENvbnRleHQ7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZm9ybSBjb250ZXh0Ki9cbiAgICBzdGF0aWMgZ2V0IGZvcm1Db250ZXh0KCk6IFhybS5Gb3JtQ29udGV4dCB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRleHQ7XG4gICAgfVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZXhlY3V0aW8gY29udGV4dCovXG4gICAgc3RhdGljIGdldCBleGVjdXRpb25Db250ZXh0KCk6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0O1xuICAgIH1cbiAgICAvKipHZXRzIGEgbG9va3VwIHZhbHVlIHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVjb3JkLiovXG4gICAgc3RhdGljIGdldCBlbnRpdHlSZWZlcmVuY2UoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC5kYXRhLmVudGl0eS5nZXRFbnRpdHlSZWZlcmVuY2UoKTtcbiAgICB9XG4gICAgLyoqU2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb3JtIGNvbnRleHQqL1xuICAgIHN0YXRpYyBzZXQgZm9ybUNvbnRleHQoY29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHQpIHtcbiAgICAgIGlmIChcImdldEZvcm1Db250ZXh0XCIgaW4gY29udGV4dCkge1xuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIGNvbnRleHQpIHRoaXMuX2Zvcm1Db250ZXh0ID0gY29udGV4dDtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBYcm1FeC5Gb3JtLnNldEZvcm1Db250ZXh0OiBUaGUgZXhlY3V0aW9uQ29udGV4dCBvciBmb3JtQ29udGV4dCB3YXMgbm90IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0Ki9cbiAgICBzdGF0aWMgc2V0IGV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICBjb250ZXh0OiBYcm0uRm9ybUNvbnRleHQgfCBYcm0uRXZlbnRzLkV2ZW50Q29udGV4dFxuICAgICkge1xuICAgICAgaWYgKFwiZ2V0Rm9ybUNvbnRleHRcIiBpbiBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9mb3JtQ29udGV4dCA9IGNvbnRleHQuZ2V0Rm9ybUNvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gY29udGV4dCkgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFhybUV4LkZvcm0uc2V0RXhlY3V0aW9uQ29udGV4dDogVGhlIGV4ZWN1dGlvbkNvbnRleHQgb3IgZm9ybUNvbnRleHQgd2FzIG5vdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIGNyZWF0ZSovXG4gICAgc3RhdGljIGdldCBJc0NyZWF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIHVwZGF0ZSovXG4gICAgc3RhdGljIGdldCBJc1VwZGF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMjtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgbm90IGZyb20gdHlwZSBjcmVhdGUqL1xuICAgIHN0YXRpYyBnZXQgSXNOb3RDcmVhdGUoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5nZXRGb3JtVHlwZSgpICE9IDE7XG4gICAgfVxuICAgIC8qKlJldHVybnMgdHJ1ZSBpZiBmb3JtIGlzIG5vdCBmcm9tIHR5cGUgdXBkYXRlKi9cbiAgICBzdGF0aWMgZ2V0IElzTm90VXBkYXRlKCkge1xuICAgICAgcmV0dXJuIEZvcm0uZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGZvcm0gbGV2ZWwgbm90aWZpY2F0aW9uLiBBbnkgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgY2FuIGJlIGRpc3BsYXllZCBhbmQgd2lsbCByZW1haW4gdW50aWwgcmVtb3ZlZCB1c2luZyBjbGVhckZvcm1Ob3RpZmljYXRpb24uXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgbm90aWZpY2F0aW9uIGFyZWEgaXMgbGltaXRlZCBzbyBlYWNoIG5ldyBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGRlZmluZXMgaG93IHRoZSBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLCBzdWNoIGFzIHRoZSBpY29uLlxuICAgICAqIEVSUk9SOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBlcnJvciBpY29uLlxuICAgICAqIFdBUk5JTkc6IE5vdGlmaWNhdGlvbiB3aWxsIHVzZSB0aGUgc3lzdGVtIHdhcm5pbmcgaWNvbi5cbiAgICAgKiBJTkZPOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBpbmZvIGljb24uXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGlzIHVzZWQgd2l0aCBjbGVhckZvcm1Ob3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZSBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgbGV2ZWw6IFhybS5Gb3JtTm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICB1bmlxdWVJZDogc3RyaW5nXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5zZXRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgdW5pcXVlSWRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZvcm0gbm90aWZpY2F0aW9uIGRlc2NyaWJlZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVGb3JtTm90aWZpY2F0aW9uKHVuaXF1ZUlkOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmNsZWFyRm9ybU5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZCBpcyBzYXZlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25TYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25TYXZlKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBPblNhdmUgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIuXG4gICAgICogQHJlbWFya3MgQWRkZWQgaW4gOS4yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJhcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2V2ZW50cy9wb3N0c2F2ZSBFeHRlcm5hbCBMaW5rOiBQb3N0U2F2ZSBFdmVudCBEb2N1bWVudGF0aW9ufVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRPblBvc3RTYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25Qb3N0U2F2ZShoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZvcm0gZGF0YSBpcyBsb2FkZWQuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGZvcm0gZGF0YSBsb2Fkcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZXZlbnQgaGFuZGxlciBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25Mb2FkRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiByZWZlcmVuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGFkZE9uQ2hhbmdlRXZlbnRIYW5kbGVyKFxuICAgICAgZmllbGRzOiBGaWVsZFtdLFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXSxcbiAgICAgIGV4ZWN1dGU/OiBib29sZWFuXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBbaGFuZGxlcnNdO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtoYW5kbGVyfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5hZGRPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGVjdXRlKSB7XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5BdHRyaWJ1dGUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleGVjdXRlIG1ldGhvZHMgcmVsYXRlZCB0byBhIHNpbmdsZSBBdHRyaWJ1dGVcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgcHVibGljIHN0YXRpYyBhbGxGaWVsZHM6IEZpZWxkW10gPSBbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYXR0cmlidXRlPzogWHJtLkF0dHJpYnV0ZXMuQXR0cmlidXRlO1xuXG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0ZpZWxkID0gRmllbGQuYWxsRmllbGRzLmZpbmQoXG4gICAgICAgIChmKSA9PiBmLk5hbWUgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdGaWVsZCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGaWVsZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICBGaWVsZC5hbGxGaWVsZHMucHVzaCh0aGlzKTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlVHlwZSgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVUeXBlKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpO1xuICAgIH1cbiAgICBnZXRJc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldElzRGlydHkoKTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5FbnRpdHkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRSZXF1aXJlZExldmVsKCk6IFhybS5BdHRyaWJ1dGVzLlJlcXVpcmVtZW50TGV2ZWwge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFJlcXVpcmVkTGV2ZWwoKTtcbiAgICB9XG4gICAgZ2V0U3VibWl0TW9kZSgpOiBYcm0uU3VibWl0TW9kZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0U3VibWl0TW9kZSgpO1xuICAgIH1cbiAgICBnZXRVc2VyUHJpdmlsZWdlKCk6IFhybS5Qcml2aWxlZ2Uge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFVzZXJQcml2aWxlZ2UoKTtcbiAgICB9XG4gICAgcmVtb3ZlT25DaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5BdHRyaWJ1dGUuQ2hhbmdlRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUucmVtb3ZlT25DaGFuZ2UoaGFuZGxlcik7XG4gICAgfVxuICAgIHNldFN1Ym1pdE1vZGUoc3VibWl0TW9kZTogWHJtLlN1Ym1pdE1vZGUpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRTdWJtaXRNb2RlKHN1Ym1pdE1vZGUpO1xuICAgIH1cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXRJc1ZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRJc1ZhbGlkKGlzVmFsaWQsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgQXR0cmlidXRlKCk6IFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlICcke3RoaXMuTmFtZX0nIHdhcyBub3QgZm91bmQgb24gdGhlIGZvcm0uYFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbnRyb2xzKCk6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5TdGFuZGFyZENvbnRyb2w+IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBWYWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbnRyb2wtbG9jYWwgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMsIGZhbHNlIGlmIGl0IGZhaWxzLlxuICAgICAqIEByZW1hcmtzICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgb24gTWljcm9zb2Z0IER5bmFtaWNzIENSTSBmb3IgdGFibGV0cyBhIHJlZCBcIlhcIiBpY29uXG4gICAgICogICAgICAgICAgICAgIGFwcGVhcnMgbmV4dCB0byB0aGUgY29udHJvbC4gVGFwcGluZyBvbiB0aGUgaWNvbiB3aWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldE5vdGlmaWNhdGlvbihtZXNzYWdlOiBzdHJpbmcsIHVuaXF1ZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKGBubyBtZXNzYWdlIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKCF1bmlxdWVJZCkgdGhyb3cgbmV3IEVycm9yKGBubyB1bmlxdWVJZCB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT5cbiAgICAgICAgICBjb250cm9sLnNldE5vdGlmaWNhdGlvbihtZXNzYWdlLCB1bmlxdWVJZClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlLlxuICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IGNvbnRyb2wuc2V0VmlzaWJsZSh2aXNpYmxlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gZWl0aGVyIGVuYWJsZWQsIG9yIGRpc2FibGVkLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCB0cnVlIHRvIGRpc2FibGUsIGZhbHNlIHRvIGVuYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4gY29udHJvbC5zZXREaXNhYmxlZChkaXNhYmxlZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGxldmVsLlxuICAgICAqIEBwYXJhbSByZXF1aXJlbWVudExldmVsIFRoZSByZXF1aXJlbWVudCBsZXZlbCwgYXMgZWl0aGVyIFwibm9uZVwiLCBcInJlcXVpcmVkXCIsIG9yIFwicmVjb21tZW5kZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZExldmVsKFxuICAgICAgcmVxdWlyZW1lbnRMZXZlbDogWHJtLkF0dHJpYnV0ZXMuUmVxdWlyZW1lbnRMZXZlbFxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlbWVudExldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICAgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVtZW50IGxldmVsLCBhcyBlaXRoZXIgZmFsc2UgZm9yIFwibm9uZVwiIG9yIHRydWUgZm9yIFwicmVxdWlyZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlZCA/IFwicmVxdWlyZWRcIiA6IFwibm9uZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipGaXJlIGFsbCBcIm9uIGNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzLiAqL1xuICAgIHB1YmxpYyBmaXJlT25DaGFuZ2UoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkF0dHJpYnV0ZS5maXJlT25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgaGFuZGxlciBvciBhbiBhcnJheSBvZiBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhbiBhcnJheSBvZiBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPbkNoYW5nZShcbiAgICAgIGhhbmRsZXJzOlxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJcbiAgICAgICAgfCBYcm0uRXZlbnRzLkNvbnRleHRTZW5zaXRpdmVIYW5kbGVyW11cbiAgICApOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuQXR0cmlidXRlLmFkZE9uQ2hhbmdlKGhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2hhbmRsZXJzfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVycyk7XG4gICAgICAgICAgdGhpcy5BdHRyaWJ1dGUuYWRkT25DaGFuZ2UoaGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gZXJyb3Igb3IgcmVjb21tZW5kYXRpb24gbm90aWZpY2F0aW9uIGZvciBhIGNvbnRyb2wsIGFuZCBsZXRzIHlvdSBzcGVjaWZ5IGFjdGlvbnMgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGROb3RpZmljYXRpb24oXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBub3RpZmljYXRpb25MZXZlbDogXCJFUlJPUlwiIHwgXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgICAgdW5pcXVlSWQ6IHN0cmluZyxcbiAgICAgIGFjdGlvbnM/OiBYcm0uQ29udHJvbHMuQ29udHJvbE5vdGlmaWNhdGlvbkFjdGlvbltdXG4gICAgKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXVuaXF1ZUlkKSB0aHJvdyBuZXcgRXJyb3IoYG5vIHVuaXF1ZUlkIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKGFjdGlvbnMgJiYgIUFycmF5LmlzQXJyYXkoYWN0aW9ucykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRoZSBhY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCBhbiBhcnJheSBvZiBDb250cm9sTm90aWZpY2F0aW9uQWN0aW9uYFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sXG4gICAgICAgICAgICBub3RpZmljYXRpb25MZXZlbDogbm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICAgICAgICB1bmlxdWVJZDogdW5pcXVlSWQsXG4gICAgICAgICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBub3RpZmljYXRpb24gaWRlbnRpZmllZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgKE9wdGlvbmFsKSBVbmlxdWUgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRzLCBmYWxzZSBpZiBpdCBmYWlscy5cbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgdW5pcXVlSWQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCB0aGUgY3VycmVudCBub3RpZmljYXRpb24gc2hvd24gd2lsbCBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZU5vdGlmaWNhdGlvbih1bmlxdWVJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyTm90aWZpY2F0aW9uKHVuaXF1ZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBUZXh0RmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0TWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZUZvcm1hdDtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE51bWJlckZpZWxkXG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuTnVtYmVyQXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5OdW1iZXJBdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRGb3JtYXQoKSBhcyBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRNYXgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRNYXgoKTtcbiAgICB9XG4gICAgZ2V0TWluKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWluKCk7XG4gICAgfVxuICAgIGdldFByZWNpc2lvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFByZWNpc2lvbigpO1xuICAgIH1cbiAgICBzZXRQcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRQcmVjaXNpb24ocHJlY2lzaW9uKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZSB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQ7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogRGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZFxuICAgIGV4dGVuZHMgRmllbGRcbiAgICBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVHlwZSgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0SW5pdGlhbFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0T3B0aW9uU2V0RmllbGQ8T3B0aW9ucyBleHRlbmRzIE9wdGlvblZhbHVlcz5cbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5NdWx0aVNlbGVjdE9wdGlvblNldEF0dHJpYnV0ZVxuICB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuTXVsdGlTZWxlY3RPcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFNlbGVjdGVkT3B0aW9uKCk7XG4gICAgfVxuICAgIGdldFRleHQoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFRleHQoKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbFZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXJbXSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiAoa2V5b2YgT3B0aW9ucylbXSB8IG51bWJlcltdKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIGVsc2UgdmFsdWVzLnB1c2godGhpcy5PcHRpb25bdl0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWVzKTtcbiAgICAgIH0gZWxzZSBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCBWYWx1ZSAnJHt2YWx1ZX0nIGlzIG5vdCBhbiBBcnJheWApO1xuICAgIH1cbiAgfVxuICBleHBvcnQgY2xhc3MgTG9va3VwRmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZTtcbiAgICBwcm90ZWN0ZWQgX2N1c3RvbUZpbHRlcnM6IGFueSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlcihhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICBnZXRJc1BhcnR5TGlzdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJc1BhcnR5TGlzdCgpO1xuICAgIH1cbiAgICBnZXQgQXR0cmlidXRlKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9hdHRyaWJ1dGUgPz89XG4gICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihgRmllbGQgJyR7dGhpcy5OYW1lfScgZG9lcyBub3QgZXhpc3RgKSk7XG4gICAgfVxuICAgIGdldCBjb250cm9scygpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG4gICAgLyoqR2V0cyB0aGUgaWQgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IElkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwXG4gICAgICAgID8gWHJtRXgubm9ybWFsaXplR3VpZCh0aGlzLlZhbHVlWzBdLmlkKVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIC8qKkdldHMgdGhlIGVudGl0eVR5cGUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEVudGl0eVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5WYWx1ZSAmJiB0aGlzLlZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLlZhbHVlWzBdLmVudGl0eVR5cGVcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICAvKipHZXRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEZvcm1hdHRlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5WYWx1ZVswXS5uYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IFZhbHVlKCk6IFhybS5Mb29rdXBWYWx1ZVtdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpID8/IG51bGw7XG4gICAgfVxuICAgIHNldCBWYWx1ZSh2YWx1ZTogWHJtLkxvb2t1cFZhbHVlW10pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBsb29rdXBcbiAgICAgKiBAcGFyYW0gaWQgR3VpZCBvZiB0aGUgcmVjb3JkXG4gICAgICogQHBhcmFtIGVudGl0eVR5cGUgbG9naWNhbG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSBuYW1lIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYWRkcyB2YWx1ZSB0byB0aGUgYXJyYXkgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXRcbiAgICAgKi9cbiAgICBzZXRMb29rdXBWYWx1ZShcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBlbnRpdHlUeXBlOiBhbnksXG4gICAgICBuYW1lOiBhbnksXG4gICAgICBhcHBlbmQgPSBmYWxzZVxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBubyBpZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkLmApO1xuICAgICAgICBpZiAoIWVudGl0eVR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBlbnRpdHlUeXBlIHBhcmFtZXRlciB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlkID0gWHJtRXgubm9ybWFsaXplR3VpZChpZCk7XG4gICAgICAgIGNvbnN0IGxvb2t1cFZhbHVlID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGVudGl0eVR5cGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5WYWx1ZSA9XG4gICAgICAgICAgYXBwZW5kICYmIHRoaXMuVmFsdWUgPyB0aGlzLlZhbHVlLmNvbmNhdChsb29rdXBWYWx1ZSkgOiBbbG9va3VwVmFsdWVdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZW50aXR5IHJlY29yZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9EYXRhIHN5c3RlbSBxdWVyeSBvcHRpb25zLCAkc2VsZWN0IGFuZCAkZXhwYW5kLCB0byByZXRyaWV2ZSB5b3VyIGRhdGEuXG4gICAgICogLSBVc2UgdGhlICRzZWxlY3Qgc3lzdGVtIHF1ZXJ5IG9wdGlvbiB0byBsaW1pdCB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBieSBpbmNsdWRpbmcgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgKiAgIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHBlcmZvcm1hbmNlIGJlc3QgcHJhY3RpY2UuIElmIHByb3BlcnRpZXMgYXJlbuKAmXRcbiAgICAgKiAgIHNwZWNpZmllZCB1c2luZyAkc2VsZWN0LCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gVXNlIHRoZSAkZXhwYW5kIHN5c3RlbSBxdWVyeSBvcHRpb24gdG8gY29udHJvbCB3aGF0IGRhdGEgZnJvbSByZWxhdGVkIGVudGl0aWVzIGlzIHJldHVybmVkLiBJZiB5b3VcbiAgICAgKiAgIGp1c3QgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSwgeW914oCZbGwgcmVjZWl2ZSBhbGwgdGhlIHByb3BlcnRpZXMgZm9yIHJlbGF0ZWRcbiAgICAgKiAgIHJlY29yZHMuIFlvdSBjYW4gbGltaXQgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgZm9yIHJlbGF0ZWQgcmVjb3JkcyB1c2luZyB0aGUgJHNlbGVjdCBzeXN0ZW0gcXVlcnlcbiAgICAgKiAgIG9wdGlvbiBpbiBwYXJlbnRoZXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lLiBVc2UgdGhpcyBmb3IgYm90aCBzaW5nbGUtdmFsdWVkIGFuZFxuICAgICAqICAgY29sbGVjdGlvbi12YWx1ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqIC0gWW91IGNhbiBhbHNvIHNwZWNpZnkgbXVsdGlwbGUgcXVlcnkgb3B0aW9ucyBieSB1c2luZyAmIHRvIHNlcGFyYXRlIHRoZSBxdWVyeSBvcHRpb25zLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPm9wdGlvbnMgZXhhbXBsZTo8L2NhcHRpb24+XG4gICAgICogb3B0aW9uczogJHNlbGVjdD1uYW1lJiRleHBhbmQ9cHJpbWFyeWNvbnRhY3RpZCgkc2VsZWN0PWNvbnRhY3RpZCxmdWxsbmFtZSlcbiAgICAgKiBAcmV0dXJucyBPbiBzdWNjZXNzLCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgcmV0cmlldmVkIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9keW5hbWljczM2NS9jdXN0b21lci1lbmdhZ2VtZW50L2RldmVsb3Blci9jbGllbnRhcGkvcmVmZXJlbmNlL3hybS13ZWJhcGkvcmV0cmlldmVyZWNvcmQgRXh0ZXJuYWwgTGluazogcmV0cmlldmVSZWNvcmQgKENsaWVudCBBUEkgcmVmZXJlbmNlKX1cbiAgICAgKi9cbiAgICBhc3luYyByZXRyaWV2ZShvcHRpb25zOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5JZCB8fCAhdGhpcy5FbnRpdHlUeXBlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgWHJtLldlYkFwaS5yZXRyaWV2ZVJlY29yZChcbiAgICAgICAgICB0aGlzLkVudGl0eVR5cGUsXG4gICAgICAgICAgdGhpcy5JZCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhZGRpdGlvbmFsIGN1c3RvbSBmaWx0ZXIgdG8gdGhlIGxvb2t1cCwgd2l0aCB0aGUgXCJBTkRcIiBmaWx0ZXIgb3BlcmF0b3IuXG4gICAgICogQHBhcmFtIGZpbHRlciBTcGVjaWZpZXMgdGhlIGZpbHRlciwgYXMgYSBzZXJpYWxpemVkIEZldGNoWE1MIFwiZmlsdGVyXCIgbm9kZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5TG9naWNhbE5hbWUgKE9wdGlvbmFsKSBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBlbnRpdHkuXG4gICAgICogQHJlbWFya3MgICAgIElmIGVudGl0eUxvZ2ljYWxOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbnRpdGllc1xuICAgICAqICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIExvb2t1cCBjb250cm9sLlxuICAgICAqIEBleGFtcGxlICAgICBFeGFtcGxlIGZpbHRlcjogPGZpbHRlciB0eXBlPVwiYW5kXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImFkZHJlc3MxX2NpdHlcIiBvcGVyYXRvcj1cImVxXCIgdmFsdWU9XCJSZWRtb25kXCIgLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAqL1xuICAgIGFkZFByZUZpbHRlclRvTG9va3VwKGZpbHRlclhtbDogc3RyaW5nLCBlbnRpdHlMb2dpY2FsTmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkUHJlU2VhcmNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmlsdGVycy5wdXNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfYWRkQ3VzdG9tRmlsdGVyKCkge1xuICAgICAgICBfYWRkQ3VzdG9tRmlsdGVyLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmFkZEN1c3RvbUZpbHRlcihmaWx0ZXJYbWwsIGVudGl0eUxvZ2ljYWxOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYWRkaXRpb25hbCBjdXN0b20gZmlsdGVyIHRvIHRoZSBsb29rdXAsIHdpdGggdGhlIFwiQU5EXCIgZmlsdGVyIG9wZXJhdG9yLlxuICAgICAqIEBwYXJhbSBlbnRpdHlMb2dpY2FsTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5LlxuICAgICAqIEBwYXJhbSBmZXRjaFhtbCBTcGVjaWZpZXMgdGhlIEZldGNoWE1MIHVzZWQgdG8gZmlsdGVyLlxuICAgICAqIEByZW1hcmtzICAgICBJZiBlbnRpdHlMb2dpY2FsTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgZW50aXRpZXNcbiAgICAgKiAgICAgICAgICAgICAgdmFsaWQgZm9yIHRoZSBMb29rdXAgY29udHJvbC5cbiAgICAgKiBAZXhhbXBsZSAgICAgRXhhbXBsZSBmZXRjaFhtbDogPGZldGNoPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudGl0eSBuYW1lPVwiY29udGFjdFwiPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJhZGRyZXNzMV9jaXR5XCIgb3BlcmF0b3I9XCJlcVwiIHZhbHVlPVwiUmVkbW9uZFwiIC8+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudGl0eT5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmV0Y2g+XG4gICAgICovXG4gICAgYXN5bmMgYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgIGVudGl0eUxvZ2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgICBwcmltYXJ5QXR0cmlidXRlSWROYW1lOiBzdHJpbmcsXG4gICAgICBmZXRjaFhtbDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZS5yZXRyaWV2ZU11bHRpcGxlUmVjb3JkcyhcbiAgICAgICAgICBlbnRpdHlMb2dpY2FsTmFtZSxcbiAgICAgICAgICBcIj9mZXRjaFhtbD1cIiArIGZldGNoWG1sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgICAgIGxldCBmaWx0ZXJlZEVudGl0aWVzID0gXCJcIjtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGZpbHRlcmVkRW50aXRpZXMgKz0gYDx2YWx1ZT4ke2l0ZW1bcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZV19PC92YWx1ZT5gO1xuICAgICAgICB9KTtcbiAgICAgICAgZmV0Y2hYbWwgPSBmaWx0ZXJlZEVudGl0aWVzXG4gICAgICAgICAgPyBgPGZpbHRlcj48Y29uZGl0aW9uIGF0dHJpYnV0ZT0nJHtwcmltYXJ5QXR0cmlidXRlSWROYW1lfScgb3BlcmF0b3I9J2luJz4ke2ZpbHRlcmVkRW50aXRpZXN9PC9jb25kaXRpb24+PC9maWx0ZXI+YFxuICAgICAgICAgIDogYDxmaWx0ZXI+PGNvbmRpdGlvbiBhdHRyaWJ1dGU9JyR7cHJpbWFyeUF0dHJpYnV0ZUlkTmFtZX0nIG9wZXJhdG9yPSdudWxsJy8+PC9maWx0ZXI+YDtcbiAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29udHJvbC5hZGRQcmVTZWFyY2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLnB1c2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZGRDdXN0b21GaWx0ZXIoKSB7XG4gICAgICAgIF9hZGRDdXN0b21GaWx0ZXIuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkQ3VzdG9tRmlsdGVyKGZldGNoWG1sLCBlbnRpdHlMb2dpY2FsTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBmaWx0ZXJzIHNldCBvbiB0aGUgY3VycmVudCBsb29rdXAgYXR0cmlidXRlIGJ5IHVzaW5nIGFkZFByZUZpbHRlclRvTG9va3VwIG9yIGFkZFByZUZpbHRlclRvTG9va3VwQWR2YW5jZWRcbiAgICAgKi9cbiAgICBjbGVhclByZUZpbHRlckZyb21Mb29rdXAoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLmZvckVhY2goXG4gICAgICAgICAgKGN1c3RvbUZpbHRlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlUHJlU2VhcmNoKGN1c3RvbUZpbHRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHR5cGUgT3B0aW9uVmFsdWVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgZXhwb3J0IGNsYXNzIE9wdGlvbnNldEZpZWxkPE9wdGlvbnMgZXh0ZW5kcyBPcHRpb25WYWx1ZXM+XG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5PcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgcHJvdGVjdGVkIF9jb250cm9sITogWHJtLkNvbnRyb2xzLk9wdGlvblNldENvbnRyb2w7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRTZWxlY3RlZE9wdGlvbigpO1xuICAgIH1cbiAgICBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBjb250cm9sKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9jb250cm9sID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2wodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBDb250cm9sICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGtleW9mIE9wdGlvbnMgfCBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgZWxzZSB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh0aGlzLk9wdGlvblt2YWx1ZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgd2l0aCB0aGUgb3B0aW9uIHZhbHVlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0gaW5kZXggKE9wdGlvbmFsKSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgd2l0aGluIHRoZSBvcHRpb25zIHlvdSBhZGQgYXJlIHZhbGlkLlxuICAgICAqICAgICAgICAgIElmIGluZGV4IGlzIG5vdCBwcm92aWRlZCwgdGhlIG5ldyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGFkZE9wdGlvbih2YWx1ZXM6IG51bWJlcltdLCBpbmRleD86IG51bWJlcik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5hZGRPcHRpb24oZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBvcHRpb24gbWF0Y2hpbmcgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICByZW1vdmVPcHRpb24odmFsdWVzOiBudW1iZXJbXSk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZW1vdmVPcHRpb24oZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBjbGVhck9wdGlvbnMoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuY2xlYXJPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBTZWN0aW9uIGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlNlY3Rpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfc2VjdGlvbj86IFhybS5Db250cm9scy5TZWN0aW9uO1xuICAgIHB1YmxpYyBwYXJlbnRUYWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5OYW1lID0gbmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBTZWN0aW9uKCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiAodGhpcy5fc2VjdGlvbiA/Pz1cbiAgICAgICAgdGhpcy5wYXJlbnRUYWIuc2VjdGlvbnMuZ2V0KHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihcbiAgICAgICAgICBgVGhlIHNlY3Rpb24gJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5UYWIge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgY29udHJvbHM6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5Db250cm9sPjtcbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9XG4gICAgZ2V0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRMYWJlbCgpO1xuICAgIH1cbiAgICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLnNldExhYmVsKGxhYmVsKTtcbiAgICB9XG4gIH1cbiAgdHlwZSBUYWJTZWN0aW9ucyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWN0aW9uO1xuICB9O1xuICBleHBvcnQgY2xhc3MgVGFiPFNlY3Rpb25zIGV4dGVuZHMgVGFiU2VjdGlvbnM+IGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF90YWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIFNlY3Rpb246IFNlY3Rpb25zO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2VjdGlvbj86IFNlY3Rpb25zKSB7XG4gICAgICB0aGlzLk5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5TZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzZWN0aW9uKSB7XG4gICAgICAgIHNlY3Rpb25ba2V5XS5wYXJlbnRUYWIgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWN0aW9uczogWHJtLkNvbGxlY3Rpb24uSXRlbUNvbGxlY3Rpb248WHJtLkNvbnRyb2xzLlNlY3Rpb24+O1xuXG4gICAgcHVibGljIGdldCBUYWIoKTogWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgICByZXR1cm4gKHRoaXMuX3RhYiA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC51aS50YWJzLmdldCh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYFRoZSB0YWIgJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gKSk7XG4gICAgfVxuICAgIGFkZFRhYlN0YXRlQ2hhbmdlKGhhbmRsZXI6IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5hZGRUYWJTdGF0ZUNoYW5nZShoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0RGlzcGxheVN0YXRlKCk6IFhybS5EaXNwbGF5U3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldERpc3BsYXlTdGF0ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBnZXRQYXJlbnQoKTogWHJtLlVpIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFiU3RhdGVDaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnJlbW92ZVRhYlN0YXRlQ2hhbmdlKGhhbmRsZXIpO1xuICAgIH1cbiAgICBzZXREaXNwbGF5U3RhdGUoZGlzcGxheVN0YXRlOiBYcm0uRGlzcGxheVN0YXRlKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuc2V0RGlzcGxheVN0YXRlKGRpc3BsYXlTdGF0ZSk7XG4gICAgfVxuICAgIHNldFZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICAgIGdldFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldExhYmVsKCk7XG4gICAgfVxuICAgIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5zZXRMYWJlbChsYWJlbCk7XG4gICAgfVxuICAgIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldEZvY3VzKCk7XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBHcmlkQ29udHJvbCBpbXBsZW1lbnRzIFhybS5Db250cm9scy5HcmlkQ29udHJvbCB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ncmlkQ29udHJvbD86IFhybS5Db250cm9scy5HcmlkQ29udHJvbDtcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgR3JpZENvbnRyb2woKTogWHJtLkNvbnRyb2xzLkdyaWRDb250cm9sIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9ncmlkQ29udHJvbCA/Pz1cbiAgICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2w8WHJtLkNvbnRyb2xzLkdyaWRDb250cm9sPih0aGlzLk5hbWUpKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBUaGUgZ3JpZCAnJHt0aGlzLk5hbWV9JyB3YXMgbm90IGZvdW5kIG9uIHRoZSBmb3JtLmApXG4gICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBhZGRPbkxvYWQoaGFuZGxlcjogWHJtLkV2ZW50cy5HcmlkQ29udHJvbC5Mb2FkRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgfVxuICAgIGdldENvbnRleHRUeXBlKCk6IFhybUVudW0uR3JpZENvbnRyb2xDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRleHRUeXBlKCk7XG4gICAgfVxuICAgIGdldEVudGl0eU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEVudGl0eU5hbWUoKTtcbiAgICB9XG4gICAgZ2V0RmV0Y2hYbWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEZldGNoWG1sKCk7XG4gICAgfVxuICAgIGdldEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBnZXRSZWxhdGlvbnNoaXAoKTogWHJtLkNvbnRyb2xzLkdyaWRSZWxhdGlvbnNoaXAge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0UmVsYXRpb25zaGlwKCk7XG4gICAgfVxuICAgIGdldFVybChjbGllbnQ/OiBYcm1FbnVtLkdyaWRDbGllbnQpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VXJsKGNsaWVudCk7XG4gICAgfVxuICAgIGdldFZpZXdTZWxlY3RvcigpOiBYcm0uQ29udHJvbHMuVmlld1NlbGVjdG9yIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFZpZXdTZWxlY3RvcigpO1xuICAgIH1cbiAgICBvcGVuUmVsYXRlZEdyaWQoKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5vcGVuUmVsYXRlZEdyaWQoKTtcbiAgICB9XG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2goKTtcbiAgICB9XG4gICAgcmVmcmVzaFJpYmJvbigpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2hSaWJib24oKTtcbiAgICB9XG4gICAgcmVtb3ZlT25Mb2FkKGhhbmRsZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlbW92ZU9uTG9hZChoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0Q29udHJvbFR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRyb2xUeXBlKCk7XG4gICAgfVxuICAgIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0TGFiZWwoKTtcbiAgICB9XG4gICAgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuc2V0TGFiZWwobGFiZWwpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/package.json b/build/package.json index 173045d..e151fd7 100644 --- a/build/package.json +++ b/build/package.json @@ -33,65 +33,9 @@ "access": "public" }, "scripts": { - "build": "npm run clean && npm run type:dts && npm run build:main && npm run format && npm run docs && npm run copy && npm run postbuild && npm run zip", - "build:main": "tsc --build", - "clean": "rimraf build/dist coverage nyc_output", - "docs": "npx typedoc --plugin typedoc-plugin-markdown --out docs src/XrmEx.ts", - "copy": "npm run copyPackage && npm run copyReadme && npm run copyEslint", - "copyPackage": "node -e \"require('fs').cpSync('./package.json', './build/package.json');\"", - "copyReadme": "node -e \"require('fs').cpSync('./README.md', './build/README.md');\"", - "copyEslint": "node -e \"require('fs').cpSync('./.eslintrc.cjs', './build/.eslintrc.cjs');\"", - "postbuild": "rimraf build/dist/tests", - "zip": "npm-build-zip --destination=release/ --name=xrm-ex --name_only=true", - "type:dts": "tsc --emitDeclarationOnly --project tsconfig.build.json", - "type:check": "tsc --noEmit", - "format": "prettier \"src/**/*.ts\" --write", - "format:check": "prettier \"src/**/*.ts\" --check", - "lint": "eslint src --ext .ts --fix", - "lint:check": "eslint src --ext .ts", - "test": "vitest run", - "test:watch": "vitest watch", - "test:coverage": "vitest run --coverage", - "spell:check": "cspell \"{README.md,CODE_OF_CONDUCT.md,CONTRIBUTING.md,.github/*.md,src/**/*.ts}\"", - "cz": "cz", - "semantic-release": "semantic-release" + "build": "tsc --build" }, "devDependencies": { - "@aashutoshrathi/word-wrap": "^1.2.6", - "@playwright/test": "^1.37.0", - "@semantic-release/changelog": "^6.0.3", - "@semantic-release/commit-analyzer": "^10.0.1", - "@semantic-release/github": "^9.0.3", - "@semantic-release/npm": "^10.0.4", - "@semantic-release/release-notes-generator": "^11.0.3", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.66", - "@types/node": "^18.16.3", - "@types/prompts": "^2.4.4", - "@types/xrm": "^9.0.73", - "@typescript-eslint/eslint-plugin": "^5.60.1", - "@typescript-eslint/parser": "^5.60.0", - "c8": "^8.0.0", - "cspell": "^6.31.1", - "eslint": "^8.43.0", - "eslint-config-prettier": "^8.8.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-simple-import-sort": "^10.0.0", - "nyc": "^15.1.0", - "prettier": "^2.8.8", - "rimraf": "^5.0.1", - "semantic-release": "^21.0.5", - "source-map-support": "^0.5.21", - "typedoc": "^0.24.8", - "typedoc-plugin-markdown": "^3.15.3", - "typescript": "^5.1.3", - "vitest": "^0.32.2", - "npm-build-zip": "^1.0.4" - }, - "overrides": { - "semver": "~7.5.3", - "word-wrap": "npm:@aashutoshrathi/word-wrap" + "@types/xrm": "^9.0.73" } } \ No newline at end of file diff --git a/build/dist/src/XrmEx.d.ts b/build/src/XrmEx.d.ts similarity index 100% rename from build/dist/src/XrmEx.d.ts rename to build/src/XrmEx.d.ts diff --git a/build/src/XrmEx.js b/build/src/XrmEx.js new file mode 100644 index 0000000..1e16590 --- /dev/null +++ b/build/src/XrmEx.js @@ -0,0 +1,1327 @@ +/// +var XrmEx; +(function (XrmEx) { + /** + * Throws an error with the given error message. + * @param {string} errorMessage - The error message to throw. + * @throws {Error} - Always throws an error with the given error message. + */ + function throwError(errorMessage) { + throw new Error(errorMessage); + } + XrmEx.throwError = throwError; + /** + * Returns the name of the calling function. + * @returns {string} - The name of the calling function. + */ + function getMethodName() { + try { + const error = new Error(); + const stackTrace = error.stack?.split("\n").map((line) => line.trim()); + const callingFunctionLine = stackTrace && stackTrace.length >= 3 ? stackTrace[2] : undefined; + const functionNameMatch = callingFunctionLine?.match(/at\s+([^\s]+)\s+\(/); + const functionName = functionNameMatch ? functionNameMatch[1] : ""; + return functionName; + } + catch (error) { + throw new Error(`XrmEx.getMethodName:\n${error.message}`); + } + } + XrmEx.getMethodName = getMethodName; + /** + * Displays a notification for an app with the given message and level, and lets you specify whether to show a close button. + * @param {string} message - The message to display in the notification. + * @param {'SUCCESS' | 'ERROR' | 'WARNING' | 'INFO'} level - The level of the notification. Can be 'SUCCESS', 'ERROR', 'WARNING', or 'INFO'. + * @param {boolean} [showCloseButton=false] - Whether to show a close button on the notification. Defaults to false. + * @returns {Promise} - A promise that resolves with the ID of the created notification. + */ + async function addGlobalNotification(message, level, showCloseButton = false) { + const levelMap = { + SUCCESS: 1, + ERROR: 2, + WARNING: 3, + INFO: 4, + }; + const messageLevel = levelMap[level] || levelMap.INFO; + const notification = { + type: 2, + level: messageLevel, + message, + showCloseButton, + }; + try { + return await Xrm.App.addGlobalNotification(notification); + } + catch (error) { + throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); + } + } + XrmEx.addGlobalNotification = addGlobalNotification; + /** + * Clears a notification in the app with the given unique ID. + * @param {string} uniqueId - The unique ID of the notification to clear. + * @returns {Promise} - A promise that resolves when the notification has been cleared. + */ + async function removeGlobalNotification(uniqueId) { + try { + return await Xrm.App.clearGlobalNotification(uniqueId); + } + catch (error) { + throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); + } + } + XrmEx.removeGlobalNotification = removeGlobalNotification; + /** + * Retrieves the value of an environment variable by using its schema name as key. + * @param {string} environmentVariableSchemaName - The schema name of the environment variable to retrieve. + * @returns {Promise} - A promise that resolves with the value of the environment variable. + */ + async function getEnvironmentVariableValue(environmentVariableSchemaName) { + return executeFunction("RetrieveEnvironmentVariableValue", [ + { + Name: "DefinitionSchemaName", + Type: "String", + Value: environmentVariableSchemaName, + }, + ]); + } + XrmEx.getEnvironmentVariableValue = getEnvironmentVariableValue; + /** + * A map of CRM data types to their corresponding type names, structural properties, and JavaScript types. + * @type {Object.} + */ + let typeMap = { + String: { typeName: "Edm.String", structuralProperty: 1, jsType: "string" }, + Integer: { typeName: "Edm.Int32", structuralProperty: 1, jsType: "number" }, + Boolean: { + typeName: "Edm.Boolean", + structuralProperty: 1, + jsType: "boolean", + }, + DateTime: { + typeName: "Edm.DateTimeOffset", + structuralProperty: 1, + jsType: "object", + }, + EntityReference: { + typeName: "mscrm.crmbaseentity", + structuralProperty: 5, + jsType: "object", + }, + Decimal: { + typeName: "Edm.Decimal", + structuralProperty: 1, + jsType: "number", + }, + Entity: { + typeName: "mscrm.crmbaseentity", + structuralProperty: 5, + jsType: "object", + }, + EntityCollection: { + typeName: "Collection(mscrm.crmbaseentity)", + structuralProperty: 4, + jsType: "object", + }, + Float: { typeName: "Edm.Double", structuralProperty: 1, jsType: "number" }, + Money: { typeName: "Edm.Decimal", structuralProperty: 1, jsType: "number" }, + Picklist: { + typeName: "Edm.Int32", + structuralProperty: 1, + jsType: "number", + }, + }; + /** + * Checks if the given request parameter is of a supported type and has a valid value. + * @param {RequestParameter} requestParameter - The request parameter to check. + * @returns {void} + * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. + */ + function checkRequestParameterType(requestParameter) { + if (!typeMap[requestParameter.Type]) + throw new Error(`The property type ${requestParameter.Type} of the property ${requestParameter.Name} is not supported.`); + const expectedType = typeMap[requestParameter.Type].jsType; + const actualType = typeof requestParameter.Value; + const invalidTypeMessage = `The value ${requestParameter.Value}\nof the property ${requestParameter.Name}\nis not of the expected type ${requestParameter.Type}.`; + if (requestParameter.Type === "EntityReference" || + requestParameter.Type === "Entity") { + if (!requestParameter.Value || + !requestParameter.Value.hasOwnProperty("id") || + !requestParameter.Value.hasOwnProperty("entityType")) { + throw new Error(invalidTypeMessage); + } + typeMap[requestParameter.Type].typeName = `mscrm.${requestParameter.Value.entityType}`; + } + else if (requestParameter.Type === "EntityCollection") { + if (!Array.isArray(requestParameter.Value) || + requestParameter.Value.every((v) => typeof v !== "object" || + !v || + !v.hasOwnProperty("id") || + !v.hasOwnProperty("entityType"))) { + throw new Error(invalidTypeMessage); + } + } + else if (requestParameter.Type === "DateTime") { + if (!(requestParameter.Value instanceof Date)) { + throw new Error(invalidTypeMessage); + } + } + else { + if (actualType !== expectedType) { + throw new Error(invalidTypeMessage); + } + } + } + XrmEx.checkRequestParameterType = checkRequestParameterType; + /** + * Executes an Action. + * @param {string} actionName - The unique name of the action. + * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. + * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. + * @returns {Promise} - A Promise with the request response. + * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. + */ + async function executeAction(actionName, requestParameters, boundEntity) { + const parameterDefinition = {}; + if (boundEntity) + requestParameters.push({ + Name: "entity", + Value: boundEntity, + Type: "EntityReference", + }); + for (const requestParameter of requestParameters) { + checkRequestParameterType(requestParameter); + parameterDefinition[requestParameter.Name] = { + typeName: typeMap[requestParameter.Type].typeName, + structuralProperty: typeMap[requestParameter.Type].structuralProperty, + }; + } + const req = Object.assign({ + getMetadata: () => ({ + boundParameter: boundEntity ? "entity" : null, + operationType: 0, + operationName: actionName, + parameterTypes: parameterDefinition, + }), + }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); + const response = await Xrm.WebApi.online.execute(req); + if (response.ok) + return response.json().catch(() => response); + } + XrmEx.executeAction = executeAction; + /** + * Executes a Function. + * @param {string} functionName - The unique name of the function. + * @param {RequestParameter[]} requestParameters - An array of objects with the parameter name, type and value. + * @param {EntityReference} [boundEntity] - An optional EntityReference of the bound entity. + * @returns {Promise} - A Promise with the request response. + * @throws {Error} - Throws an error if the request parameter is not of a supported type or has an invalid value. + */ + async function executeFunction(functionName, requestParameters, boundEntity) { + const parameterDefinition = {}; + if (boundEntity) + requestParameters.push({ + Name: "entity", + Value: boundEntity, + Type: "EntityReference", + }); + for (const requestParameter of requestParameters) { + checkRequestParameterType(requestParameter); + parameterDefinition[requestParameter.Name] = { + typeName: typeMap[requestParameter.Type].typeName, + structuralProperty: typeMap[requestParameter.Type].structuralProperty, + }; + } + const req = Object.assign({ + getMetadata: () => ({ + boundParameter: boundEntity ? "entity" : null, + operationType: 1, + operationName: functionName, + parameterTypes: parameterDefinition, + }), + }, ...requestParameters.map((p) => ({ [p.Name]: p.Value }))); + const response = await Xrm.WebApi.online.execute(req); + if (response.ok) + return response.json().catch(() => response); + } + XrmEx.executeFunction = executeFunction; + /** + * Makes a GUID lowercase and removes brackets. + * @param {string} guid - The GUID to normalize. + * @returns {string} - The normalized GUID. + */ + function normalizeGuid(guid) { + if (typeof guid !== "string") + throw new Error(`XrmEx.normalizeGuid:\n'${guid}' is not a string`); + return guid.toLowerCase().replace(/[{}]/g, ""); + } + XrmEx.normalizeGuid = normalizeGuid; + /** + * Opens a dialog with dynamic height and width based on text content. + * @param {string} title - The title of the dialog. + * @param {string} text - The text content of the dialog. + * @returns {Promise} - A Promise with the dialog response. + */ + async function openAlertDialog(title, text) { + try { + const rows = text.split(/\r\n|\r|\n/); + let additionalRows = 0; + rows.forEach((row) => { + let width = getTextWidth(row, "1rem Segoe UI Regular, SegoeUI, Segoe UI"); + if (width > 940) { + additionalRows += width / 940; + } + }); + const longestRow = rows.reduce((acc, row) => (row.length > acc.length ? row : acc), ""); + const width = Math.min(getTextWidth(longestRow, "1rem Segoe UI Regular, SegoeUI, Segoe UI"), 1000); + const height = 109 + (rows.length + additionalRows) * 20; + return await Xrm.Navigation.openAlertDialog({ + confirmButtonLabel: "Ok", + text, + title, + }, { + height, + width, + }); + } + catch (error) { + console.error(error.message); + throw new Error(`XrmEx.${getMethodName()}:\n${error.message}`); + } + /** + * Uses canvas.measureText to compute and return the width of the given text of given font in pixels. + * + * @param {String} text The text to be rendered. + * @param {String} font The css font descriptor that text is to be rendered with (e.g. "bold 14px verdana"). + * + * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393 + */ + function getTextWidth(text, font) { + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + context.font = font; + const metrics = context.measureText(text); + return metrics.width; + } + } + XrmEx.openAlertDialog = openAlertDialog; + /** + * Represents a form in Dynamics 365. + */ + class Form { + static _formContext; + static _executionContext; + constructor() { } + /**Gets a reference to the current form context*/ + static get formContext() { + return this._formContext; + } + /**Gets a reference to the current executio context*/ + static get executionContext() { + return this._executionContext; + } + /**Gets a lookup value that references the record.*/ + static get entityReference() { + return Form.formContext.data.entity.getEntityReference(); + } + /**Sets a reference to the current form context*/ + static set formContext(context) { + if ("getFormContext" in context) { + this._executionContext = context; + this._formContext = context.getFormContext(); + } + else if ("data" in context) + this._formContext = context; + else + throw new Error(`XrmEx.Form.setFormContext: The executionContext or formContext was not passed to the function.`); + } + /**Sets a reference to the current execution context*/ + static set executionContext(context) { + if ("getFormContext" in context) { + this._executionContext = context; + this._formContext = context.getFormContext(); + } + else if ("data" in context) + this._formContext = context; + else + throw new Error(`XrmEx.Form.setExecutionContext: The executionContext or formContext was not passed to the function.`); + } + /**Returns true if form is from type create*/ + static get IsCreate() { + return Form.formContext.ui.getFormType() == 1; + } + /**Returns true if form is from type update*/ + static get IsUpdate() { + return Form.formContext.ui.getFormType() == 2; + } + /**Returns true if form is not from type create*/ + static get IsNotCreate() { + return Form.formContext.ui.getFormType() != 1; + } + /**Returns true if form is not from type update*/ + static get IsNotUpdate() { + return Form.formContext.ui.getFormType() != 2; + } + /** + * Displays a form level notification. Any number of notifications can be displayed and will remain until removed using clearFormNotification. + * The height of the notification area is limited so each new message will be added to the top. + * @param message The text of the notification message. + * @param level The level of the notification which defines how the message will be displayed, such as the icon. + * ERROR: Notification will use the system error icon. + * WARNING: Notification will use the system warning icon. + * INFO: Notification will use the system info icon. + * @param uniqueId Unique identifier for the notification which is used with clearFormNotification to remove the notification. + * @returns true if it succeeds, otherwise false. + */ + static addFormNotification(message, level, uniqueId) { + try { + return Form.formContext.ui.setFormNotification(message, level, uniqueId); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Clears the form notification described by uniqueId. + * @param uniqueId Unique identifier. + * @returns True if it succeeds, otherwise false. + */ + static removeFormNotification(uniqueId) { + try { + return Form.formContext.ui.clearFormNotification(uniqueId); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a handler to be called when the record is saved. + */ + static addOnSaveEventHandler(handlers) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + Form.formContext.data.entity.addOnSave(handler); + }); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a function to be called after the OnSave is complete. + * @param handler The handler. + * @remarks Added in 9.2 + * @see {@link https://docs.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/events/postsave External Link: PostSave Event Documentation} + */ + static addOnPostSaveEventHandler(handlers) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + Form.formContext.data.entity.addOnPostSave(handler); + }); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a function to be called when form data is loaded. + * @param handler The function to be executed when the form data loads. The function will be added to the bottom of the event handler pipeline. + */ + static addOnLoadEventHandler(handlers) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + Form.formContext.data.addOnLoad(handler); + }); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a handler to be called when the attribute's value is changed. + * @param handler The function reference. + */ + static addOnChangeEventHandler(fields, handlers, execute) { + try { + if (!Array.isArray(handlers)) { + handlers = [handlers]; + } + handlers.forEach((handler) => { + if (typeof handler !== "function") { + throw new Error(`'${handler}' is not a function`); + } + fields.forEach((field) => { + field.addOnChange(handler); + }); + }); + if (execute) { + fields.forEach((field) => { + field.Attribute.fireOnChange(); + }); + } + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.Form = Form; + /** + * Used to execute methods related to a single Attribute + */ + class Field { + static allFields = []; + Name; + _attribute; + constructor(attributeName) { + const existingField = Field.allFields.find((f) => f.Name === attributeName); + if (existingField) { + return existingField; + } + this.Name = attributeName; + Field.allFields.push(this); + } + setValue(value) { + return this.Attribute.setValue(value); + } + getAttributeType() { + return this.Attribute.getAttributeType(); + } + getFormat() { + return this.Attribute.getFormat(); + } + getIsDirty() { + return this.Attribute.getIsDirty(); + } + getName() { + return this.Attribute.getName(); + } + getParent() { + return this.Attribute.getParent(); + } + getRequiredLevel() { + return this.Attribute.getRequiredLevel(); + } + getSubmitMode() { + return this.Attribute.getSubmitMode(); + } + getUserPrivilege() { + return this.Attribute.getUserPrivilege(); + } + removeOnChange(handler) { + return this.Attribute.removeOnChange(handler); + } + setSubmitMode(submitMode) { + return this.Attribute.setSubmitMode(submitMode); + } + getValue() { + return this.Attribute.getValue(); + } + setIsValid(isValid, message) { + return this.Attribute.setIsValid(isValid, message); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`The attribute '${this.Name}' was not found on the form.`)); + } + get controls() { + return this.Attribute.controls; + } + /** + * Gets the value. + * @returns The value. + */ + get Value() { + return this.Attribute.getValue(); + } + set Value(value) { + this.Attribute.setValue(value); + } + /** + * Sets a control-local notification message. + * @param message The message. + * @param uniqueId Unique identifier. + * @returns true if it succeeds, false if it fails. + * @remarks When this method is used on Microsoft Dynamics CRM for tablets a red "X" icon + * appears next to the control. Tapping on the icon will display the message. + */ + setNotification(message, uniqueId) { + try { + if (!message) + throw new Error(`no message was provided.`); + if (!uniqueId) + throw new Error(`no uniqueId was provided.`); + this.controls.forEach((control) => control.setNotification(message, uniqueId)); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the visibility state. + * @param visible true to show, false to hide. + */ + setVisible(visible) { + try { + this.controls.forEach((control) => control.setVisible(visible)); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the state of the control to either enabled, or disabled. + * @param disabled true to disable, false to enable. + */ + setDisabled(disabled) { + try { + this.controls.forEach((control) => control.setDisabled(disabled)); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the required level. + * @param requirementLevel The requirement level, as either "none", "required", or "recommended" + */ + setRequiredLevel(requirementLevel) { + try { + this.Attribute.setRequiredLevel(requirementLevel); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Sets the required level. + * @param required The requirement level, as either false for "none" or true for "required" + */ + setRequired(required) { + try { + this.Attribute.setRequiredLevel(required ? "required" : "none"); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /**Fire all "on change" event handlers. */ + fireOnChange() { + try { + this.Attribute.fireOnChange(); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds a handler or an array of handlers to be called when the attribute's value is changed. + * @param handlers The function reference or an array of function references. + */ + addOnChange(handlers) { + try { + if (Array.isArray(handlers)) { + for (const handler of handlers) { + if (typeof handler !== "function") + throw new Error(`'${handler}' is not a function`); + this.Attribute.removeOnChange(handler); + this.Attribute.addOnChange(handler); + } + } + else { + if (typeof handlers !== "function") + throw new Error(`'${handlers}' is not a function`); + this.Attribute.removeOnChange(handlers); + this.Attribute.addOnChange(handlers); + } + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Displays an error or recommendation notification for a control, and lets you specify actions to execute based on the notification. + */ + addNotification(message, notificationLevel, uniqueId, actions) { + try { + if (!uniqueId) + throw new Error(`no uniqueId was provided.`); + if (actions && !Array.isArray(actions)) + throw new Error(`the action parameter is not an array of ControlNotificationAction`); + this.controls.forEach((control) => { + control.addNotification({ + messages: [message], + notificationLevel: notificationLevel, + uniqueId: uniqueId, + actions: actions, + }); + }); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Clears the notification identified by uniqueId. + * @param uniqueId (Optional) Unique identifier. + * @returns true if it succeeds, false if it fails. + * @remarks If the uniqueId parameter is not used, the current notification shown will be removed. + */ + removeNotification(uniqueId) { + try { + this.controls.forEach((control) => { + control.clearNotification(uniqueId); + }); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.Field = Field; + class TextField extends Field { + constructor(attribute) { + super(attribute); + } + getMaxLength() { + return this.Attribute.getMaxLength(); + } + getFormat() { + return this.Attribute.getFormat(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.TextField = TextField; + class NumberField extends Field { + constructor(attribute) { + super(attribute); + } + getFormat() { + return this.Attribute.getFormat(); + } + getMax() { + return this.Attribute.getMax(); + } + getMin() { + return this.Attribute.getMin(); + } + getPrecision() { + return this.Attribute.getPrecision(); + } + setPrecision(precision) { + return this.Attribute.setPrecision(precision); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.NumberField = NumberField; + class DateField extends Field { + constructor(attribute) { + super(attribute); + } + getFormat() { + return this.Attribute.getFormat(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.DateField = DateField; + class BooleanField extends Field { + constructor(attribute) { + super(attribute); + } + getAttributeType() { + return this.Attribute.getAttributeType(); + } + getInitialValue() { + return this.Attribute.getInitialValue(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + } + XrmEx.BooleanField = BooleanField; + class MultiSelectOptionSetField extends Field { + Option; + constructor(attributeName, option) { + super(attributeName); + this.Option = option; + } + getFormat() { + return this.Attribute.getFormat(); + } + getOption(value) { + if (typeof value === "number") { + return this.Attribute.getOption(value); + } + else { + return this.Attribute.getOption(value); + } + } + getOptions() { + return this.Attribute.getOptions(); + } + getSelectedOption() { + return this.Attribute.getSelectedOption(); + } + getText() { + return this.Attribute.getText(); + } + getInitialValue() { + return this.Attribute.getInitialValue(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get Value() { + return this.Attribute.getValue(); + } + set Value(value) { + if (Array.isArray(value)) { + let values = []; + value.forEach((v) => { + if (typeof v == "number") + values.push(v); + else + values.push(this.Option[v]); + }); + this.Attribute.setValue(values); + } + else + XrmEx.throwError(`Field Value '${value}' is not an Array`); + } + } + XrmEx.MultiSelectOptionSetField = MultiSelectOptionSetField; + class LookupField extends Field { + _customFilters = []; + constructor(attribute) { + super(attribute); + } + getIsPartyList() { + return this.Attribute.getIsPartyList(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + /**Gets the id of the first lookup value*/ + get Id() { + return this.Value && this.Value.length > 0 + ? XrmEx.normalizeGuid(this.Value[0].id) + : null; + } + /**Gets the entityType of the first lookup value*/ + get EntityType() { + return this.Value && this.Value.length > 0 + ? this.Value[0].entityType + : null; + } + /**Gets the formatted value of the first lookup value*/ + get FormattedValue() { + return this.Value && this.Value.length > 0 ? this.Value[0].name : null; + } + get Value() { + return this.Attribute.getValue() ?? null; + } + set Value(value) { + this.Attribute.setValue(value); + } + /** + * Sets the value of a lookup + * @param id Guid of the record + * @param entityType logicalname of the entity + * @param name formatted value + * @param append if true, adds value to the array instead of replacing it + */ + setLookupValue(id, entityType, name, append = false) { + try { + if (!id) + throw new Error(`no id parameter was provided.`); + if (!entityType) + throw new Error(`no entityType parameter was provided.`); + id = XrmEx.normalizeGuid(id); + const lookupValue = { + id, + entityType, + name, + }; + this.Value = + append && this.Value ? this.Value.concat(lookupValue) : [lookupValue]; + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Retrieves an entity record. + * @param options (Optional) OData system query options, $select and $expand, to retrieve your data. + * - Use the $select system query option to limit the properties returned by including a comma-separated + * list of property names. This is an important performance best practice. If properties aren’t + * specified using $select, all properties will be returned. + * - Use the $expand system query option to control what data from related entities is returned. If you + * just include the name of the navigation property, you’ll receive all the properties for related + * records. You can limit the properties returned for related records using the $select system query + * option in parentheses after the navigation property name. Use this for both single-valued and + * collection-valued navigation properties. + * - You can also specify multiple query options by using & to separate the query options. + * @example options example: + * options: $select=name&$expand=primarycontactid($select=contactid,fullname) + * @returns On success, returns a promise containing a JSON object with the retrieved attributes and their values. + * @see {@link https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/reference/xrm-webapi/retrieverecord External Link: retrieveRecord (Client API reference)} + */ + async retrieve(options) { + try { + if (!this.Id || !this.EntityType) + return null; + const record = await Xrm.WebApi.retrieveRecord(this.EntityType, this.Id, options); + return record; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Adds an additional custom filter to the lookup, with the "AND" filter operator. + * @param filter Specifies the filter, as a serialized FetchXML "filter" node. + * @param entityLogicalName (Optional) The logical name of the entity. + * @remarks If entityLogicalName is not specified, the filter will be applied to all entities + * valid for the Lookup control. + * @example Example filter: + * + * + */ + addPreFilterToLookup(filterXml, entityLogicalName) { + try { + _addCustomFilter.controls = this.controls; + this.controls.forEach((control) => { + control.addPreSearch(_addCustomFilter); + }); + this._customFilters.push(_addCustomFilter); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + function _addCustomFilter() { + _addCustomFilter.controls.forEach((control) => { + control.addCustomFilter(filterXml, entityLogicalName); + }); + } + } + /** + * Adds an additional custom filter to the lookup, with the "AND" filter operator. + * @param entityLogicalName (Optional) The logical name of the entity. + * @param primaryAttributeIdName (Optional) The logical name of the primary key. + * @param fetchXml Specifies the FetchXML used to filter. + * @remarks If entityLogicalName is not specified, the filter will be applied to all entities + * valid for the Lookup control. + * @example Example fetchXml: + * + * + * + * + * + * + */ + async addPreFilterToLookupAdvanced(entityLogicalName, primaryAttributeIdName, fetchXml) { + try { + const result = await Xrm.WebApi.online.retrieveMultipleRecords(entityLogicalName, "?fetchXml=" + fetchXml); + const data = result.entities; + let filteredEntities = ""; + _addCustomFilter.controls = this.controls; + data.forEach((item) => { + filteredEntities += `${item[primaryAttributeIdName]}`; + }); + fetchXml = filteredEntities + ? `${filteredEntities}` + : ``; + this.controls.forEach((control) => { + control.addPreSearch(_addCustomFilter); + }); + this._customFilters.push(_addCustomFilter); + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + function _addCustomFilter() { + _addCustomFilter.controls.forEach((control) => { + control.addCustomFilter(fetchXml, entityLogicalName); + }); + } + } + /** + * Removes all filters set on the current lookup attribute by using addPreFilterToLookup or addPreFilterToLookupAdvanced + */ + clearPreFilterFromLookup() { + try { + this._customFilters.forEach((customFilter) => { + this.controls.forEach((control) => { + control.removePreSearch(customFilter); + }); + }); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.LookupField = LookupField; + class OptionsetField extends Field { + _control; + Option; + constructor(attributeName, option) { + super(attributeName); + this.Option = option; + } + getFormat() { + return this.Attribute.getFormat(); + } + getOption(value) { + if (typeof value === "number") { + return this.Attribute.getOption(value); + } + else { + return this.Attribute.getOption(value); + } + } + getOptions() { + return this.Attribute.getOptions(); + } + getSelectedOption() { + return this.Attribute.getSelectedOption(); + } + getText() { + return this.Attribute.getText(); + } + getInitialValue() { + return this.Attribute.getInitialValue(); + } + get Attribute() { + return (this._attribute ??= + Form.formContext.getAttribute(this.Name) ?? + XrmEx.throwError(`Field '${this.Name}' does not exist`)); + } + get controls() { + return this.Attribute.controls; + } + get control() { + return (this._control ??= + Form.formContext.getControl(this.Name) ?? + XrmEx.throwError(`Control '${this.Name}' does not exist`)); + } + get Value() { + return this.Attribute.getValue(); + } + set Value(value) { + if (typeof value == "number") + this.Attribute.setValue(value); + else + this.Attribute.setValue(this.Option[value]); + } + /** + * Adds an option. + * + * @param values an array with the option values to add + * @param index (Optional) zero-based index of the option. + * + * @remarks This method does not check that the values within the options you add are valid. + * If index is not provided, the new option will be added to the end of the list. + */ + addOption(values, index) { + try { + if (!Array.isArray(values)) + throw new Error(`values is not an Array:\nvalues: '${values}'`); + const optionSetValues = this.control.getAttribute().getOptions() ?? []; + for (const element of optionSetValues) { + if (values.includes(element.value)) { + this.control.addOption(element, index); + } + } + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Removes the option matching the value. + * + * @param value The value. + */ + removeOption(values) { + try { + if (!Array.isArray(values)) + throw new Error(`values is not an Array:\nvalues: '${values}'`); + const optionSetValues = this.control.getAttribute().getOptions() ?? []; + for (const element of optionSetValues) { + if (values.includes(element.value)) { + this.control.removeOption(element.value); + } + } + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + /** + * Clears all options. + */ + clearOptions() { + try { + this.control.clearOptions(); + return this; + } + catch (error) { + throw new Error(`XrmEx.${XrmEx.getMethodName()}:\n${error.message}`); + } + } + } + XrmEx.OptionsetField = OptionsetField; + class Section { + Name; + _section; + parentTab; + constructor(name) { + this.Name = name; + } + get Section() { + return (this._section ??= + this.parentTab.sections.get(this.Name) ?? + XrmEx.throwError(`The section '${this.Name}' was not found on the form.`)); + } + getName() { + return this.Section.getName(); + } + getParent() { + return this.Section.getParent(); + } + controls; + setVisible(visible) { + return this.Section.setVisible(visible); + } + getVisible() { + return this.Section.getVisible(); + } + getLabel() { + return this.Section.getLabel(); + } + setLabel(label) { + return this.Section.setLabel(label); + } + } + XrmEx.Section = Section; + class Tab { + Name; + _tab; + Section; + constructor(name, section) { + this.Name = name; + this.Section = section; + for (let key in section) { + section[key].parentTab = this; + } + } + sections; + get Tab() { + return (this._tab ??= + Form.formContext.ui.tabs.get(this.Name) ?? + XrmEx.throwError(`The tab '${this.Name}' was not found on the form.`)); + } + addTabStateChange(handler) { + return this.Tab.addTabStateChange(handler); + } + getDisplayState() { + return this.Tab.getDisplayState(); + } + getName() { + return this.Tab.getName(); + } + getParent() { + return this.Tab.getParent(); + } + removeTabStateChange(handler) { + return this.Tab.removeTabStateChange(handler); + } + setDisplayState(displayState) { + return this.Tab.setDisplayState(displayState); + } + setVisible(visible) { + return this.Tab.setVisible(visible); + } + getVisible() { + return this.Tab.getVisible(); + } + getLabel() { + return this.Tab.getLabel(); + } + setLabel(label) { + return this.Tab.setLabel(label); + } + setFocus() { + return this.Tab.setFocus(); + } + } + XrmEx.Tab = Tab; + class GridControl { + Name; + _gridControl; + constructor(name) { + this.Name = name; + } + get GridControl() { + return ((this._gridControl ??= + Form.formContext.getControl(this.Name)) ?? + XrmEx.throwError(`The grid '${this.Name}' was not found on the form.`)); + } + get Grid() { + return this.GridControl.getGrid(); + } + addOnLoad(handler) { + return this.GridControl.addOnLoad(handler); + } + getContextType() { + return this.GridControl.getContextType(); + } + getEntityName() { + return this.GridControl.getEntityName(); + } + getFetchXml() { + return this.GridControl.getFetchXml(); + } + getGrid() { + return this.GridControl.getGrid(); + } + getRelationship() { + return this.GridControl.getRelationship(); + } + getUrl(client) { + return this.GridControl.getUrl(client); + } + getViewSelector() { + return this.GridControl.getViewSelector(); + } + openRelatedGrid() { + return this.GridControl.openRelatedGrid(); + } + refresh() { + return this.GridControl.refresh(); + } + refreshRibbon() { + return this.GridControl.refreshRibbon(); + } + removeOnLoad(handler) { + return this.GridControl.removeOnLoad(handler); + } + getControlType() { + return this.GridControl.getControlType(); + } + getName() { + return this.GridControl.getName(); + } + getParent() { + return this.GridControl.getParent(); + } + getLabel() { + return this.GridControl.getLabel(); + } + setLabel(label) { + return this.GridControl.setLabel(label); + } + getVisible() { + return this.GridControl.getVisible(); + } + setVisible(visible) { + return this.GridControl.setVisible(visible); + } + } + XrmEx.GridControl = GridControl; +})(XrmEx || (XrmEx = {})); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWHJtRXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvWHJtRXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOERBQThEO0FBa0M5RCxJQUFVLEtBQUssQ0FvNUNkO0FBcDVDRCxXQUFVLEtBQUs7SUFDYjs7OztPQUlHO0lBQ0gsU0FBZ0IsVUFBVSxDQUFDLFlBQW9CO1FBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUZlLGdCQUFVLGFBRXpCLENBQUE7SUFDRDs7O09BR0c7SUFDSCxTQUFnQixhQUFhO1FBQzNCLElBQUk7WUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzFCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxtQkFBbUIsR0FDdkIsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLGlCQUFpQixHQUNyQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVuRSxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQWRlLG1CQUFhLGdCQWM1QixDQUFB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QUFDO1FBQ3JDLENBQUM7UUFDRCxRQUFRLENBQUMsS0FBYTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxVQUFVLENBQUMsT0FBZ0I7WUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQ0Y7SUF6RVksaUJBQVcsY0F5RXZCLENBQUE7QUFDSCxDQUFDLEVBcDVDUyxLQUFLLEtBQUwsS0FBSyxRQW81Q2QiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vbm9kZV9tb2R1bGVzL0B0eXBlcy94cm0vaW5kZXguZC50c1wiIC8+XG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgZm9yIGEgcmVxdWVzdC5cbiAqIEB0eXBlIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAqIEBwcm9wZXJ0eSB7J0Jvb2xlYW4nIHwgJ0RhdGVUaW1lJyB8ICdEZWNpbWFsJyB8ICdFbnRpdHknIHwgJ0VudGl0eUNvbGxlY3Rpb24nIHwgJ0VudGl0eVJlZmVyZW5jZScgfCAnRmxvYXQnIHwgJ0ludGVnZXInIHwgJ01vbmV5JyB8ICdQaWNrbGlzdCcgfCAnU3RyaW5nJ30gVHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkgeyp9IFZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbnR5cGUgUmVxdWVzdFBhcmFtZXRlciA9IHtcbiAgTmFtZTogc3RyaW5nO1xuICBUeXBlOlxuICAgIHwgXCJCb29sZWFuXCJcbiAgICB8IFwiRGF0ZVRpbWVcIlxuICAgIHwgXCJEZWNpbWFsXCJcbiAgICB8IFwiRW50aXR5XCJcbiAgICB8IFwiRW50aXR5Q29sbGVjdGlvblwiXG4gICAgfCBcIkVudGl0eVJlZmVyZW5jZVwiXG4gICAgfCBcIkZsb2F0XCJcbiAgICB8IFwiSW50ZWdlclwiXG4gICAgfCBcIk1vbmV5XCJcbiAgICB8IFwiUGlja2xpc3RcIlxuICAgIHwgXCJTdHJpbmdcIjtcbiAgVmFsdWU6IGFueTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZW50aXR5LlxuICogQHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudGl0eVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZW50aXR5LlxuICovXG50eXBlIEVudGl0eVJlZmVyZW5jZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xufTtcbm5hbWVzcGFjZSBYcm1FeCB7XG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIHRocm93LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBBbHdheXMgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvck1lc3NhZ2U6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbi5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNZXRob2ROYW1lKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICBjb25zdCBzdGFja1RyYWNlID0gZXJyb3Iuc3RhY2s/LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICAgICAgY29uc3QgY2FsbGluZ0Z1bmN0aW9uTGluZSA9XG4gICAgICAgIHN0YWNrVHJhY2UgJiYgc3RhY2tUcmFjZS5sZW5ndGggPj0gMyA/IHN0YWNrVHJhY2VbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVNYXRjaCA9XG4gICAgICAgIGNhbGxpbmdGdW5jdGlvbkxpbmU/Lm1hdGNoKC9hdFxccysoW15cXHNdKylcXHMrXFwoLyk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWVNYXRjaCA/IGZ1bmN0aW9uTmFtZU1hdGNoWzFdIDogXCJcIjtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LmdldE1ldGhvZE5hbWU6XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpZmljYXRpb24gZm9yIGFuIGFwcCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBsZXZlbCwgYW5kIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0byBzaG93IGEgY2xvc2UgYnV0dG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gdGhlIG5vdGlmaWNhdGlvbi5cbiAgICogQHBhcmFtIHsnU1VDQ0VTUycgfCAnRVJST1InIHwgJ1dBUk5JTkcnIHwgJ0lORk8nfSBsZXZlbCAtIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uLiBDYW4gYmUgJ1NVQ0NFU1MnLCAnRVJST1InLCAnV0FSTklORycsIG9yICdJTkZPJy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbc2hvd0Nsb3NlQnV0dG9uPWZhbHNlXSAtIFdoZXRoZXIgdG8gc2hvdyBhIGNsb3NlIGJ1dHRvbiBvbiB0aGUgbm90aWZpY2F0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBJRCBvZiB0aGUgY3JlYXRlZCBub3RpZmljYXRpb24uXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2xvYmFsTm90aWZpY2F0aW9uKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsZXZlbDogXCJTVUNDRVNTXCIgfCBcIkVSUk9SXCIgfCBcIldBUk5JTkdcIiB8IFwiSU5GT1wiLFxuICAgIHNob3dDbG9zZUJ1dHRvbiA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbGV2ZWxNYXAgPSB7XG4gICAgICBTVUNDRVNTOiAxLFxuICAgICAgRVJST1I6IDIsXG4gICAgICBXQVJOSU5HOiAzLFxuICAgICAgSU5GTzogNCxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2VMZXZlbCA9IGxldmVsTWFwW2xldmVsXSB8fCBsZXZlbE1hcC5JTkZPO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICAgIHR5cGU6IDIsXG4gICAgICBsZXZlbDogbWVzc2FnZUxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNob3dDbG9zZUJ1dHRvbixcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5hZGRHbG9iYWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7Z2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgYSBub3RpZmljYXRpb24gaW4gdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiB1bmlxdWUgSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bmlxdWVJZCAtIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG5vdGlmaWNhdGlvbiB0byBjbGVhci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBub3RpZmljYXRpb24gaGFzIGJlZW4gY2xlYXJlZC5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHbG9iYWxOb3RpZmljYXRpb24oXG4gICAgdW5pcXVlSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgWHJtLkFwcC5jbGVhckdsb2JhbE5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke2dldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBieSB1c2luZyBpdHMgc2NoZW1hIG5hbWUgYXMga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWUgLSBUaGUgc2NoZW1hIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoXG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNjaGVtYU5hbWU6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBleGVjdXRlRnVuY3Rpb24oXCJSZXRyaWV2ZUVudmlyb25tZW50VmFyaWFibGVWYWx1ZVwiLCBbXG4gICAgICB7XG4gICAgICAgIE5hbWU6IFwiRGVmaW5pdGlvblNjaGVtYU5hbWVcIixcbiAgICAgICAgVHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgVmFsdWU6IGVudmlyb25tZW50VmFyaWFibGVTY2hlbWFOYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuICAvKipcbiAgICogQSBtYXAgb2YgQ1JNIGRhdGEgdHlwZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlIG5hbWVzLCBzdHJ1Y3R1cmFsIHByb3BlcnRpZXMsIGFuZCBKYXZhU2NyaXB0IHR5cGVzLlxuICAgKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIHsgdHlwZU5hbWU6IHN0cmluZywgc3RydWN0dXJhbFByb3BlcnR5OiBudW1iZXIsIGpzVHlwZTogc3RyaW5nIH0+fVxuICAgKi9cbiAgbGV0IHR5cGVNYXAgPSB7XG4gICAgU3RyaW5nOiB7IHR5cGVOYW1lOiBcIkVkbS5TdHJpbmdcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwic3RyaW5nXCIgfSxcbiAgICBJbnRlZ2VyOiB7IHR5cGVOYW1lOiBcIkVkbS5JbnQzMlwiLCBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsIGpzVHlwZTogXCJudW1iZXJcIiB9LFxuICAgIEJvb2xlYW46IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5Cb29sZWFuXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgRGF0ZVRpbWU6IHtcbiAgICAgIHR5cGVOYW1lOiBcIkVkbS5EYXRlVGltZU9mZnNldFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm9iamVjdFwiLFxuICAgIH0sXG4gICAgRW50aXR5UmVmZXJlbmNlOiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBEZWNpbWFsOiB7XG4gICAgICB0eXBlTmFtZTogXCJFZG0uRGVjaW1hbFwiLFxuICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiAxLFxuICAgICAganNUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgRW50aXR5OiB7XG4gICAgICB0eXBlTmFtZTogXCJtc2NybS5jcm1iYXNlZW50aXR5XCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDUsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBFbnRpdHlDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlTmFtZTogXCJDb2xsZWN0aW9uKG1zY3JtLmNybWJhc2VlbnRpdHkpXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDQsXG4gICAgICBqc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgfSxcbiAgICBGbG9hdDogeyB0eXBlTmFtZTogXCJFZG0uRG91YmxlXCIsIHN0cnVjdHVyYWxQcm9wZXJ0eTogMSwganNUeXBlOiBcIm51bWJlclwiIH0sXG4gICAgTW9uZXk6IHsgdHlwZU5hbWU6IFwiRWRtLkRlY2ltYWxcIiwgc3RydWN0dXJhbFByb3BlcnR5OiAxLCBqc1R5cGU6IFwibnVtYmVyXCIgfSxcbiAgICBQaWNrbGlzdDoge1xuICAgICAgdHlwZU5hbWU6IFwiRWRtLkludDMyXCIsXG4gICAgICBzdHJ1Y3R1cmFsUHJvcGVydHk6IDEsXG4gICAgICBqc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaXMgb2YgYSBzdXBwb3J0ZWQgdHlwZSBhbmQgaGFzIGEgdmFsaWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcn0gcmVxdWVzdFBhcmFtZXRlciAtIFRoZSByZXF1ZXN0IHBhcmFtZXRlciB0byBjaGVjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShcbiAgICByZXF1ZXN0UGFyYW1ldGVyOiBSZXF1ZXN0UGFyYW1ldGVyXG4gICk6IHZvaWQge1xuICAgIGlmICghdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHByb3BlcnR5IHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9IG9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX0gaXMgbm90IHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS5qc1R5cGU7XG4gICAgY29uc3QgYWN0dWFsVHlwZSA9IHR5cGVvZiByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlO1xuICAgIGNvbnN0IGludmFsaWRUeXBlTWVzc2FnZSA9IGBUaGUgdmFsdWUgJHtyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlfVxcbm9mIHRoZSBwcm9wZXJ0eSAke3JlcXVlc3RQYXJhbWV0ZXIuTmFtZX1cXG5pcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUgJHtyZXF1ZXN0UGFyYW1ldGVyLlR5cGV9LmA7XG4gICAgaWYgKFxuICAgICAgcmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eVJlZmVyZW5jZVwiIHx8XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyLlR5cGUgPT09IFwiRW50aXR5XCJcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgfHxcbiAgICAgICAgIXJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuaGFzT3duUHJvcGVydHkoXCJpZFwiKSB8fFxuICAgICAgICAhcmVxdWVzdFBhcmFtZXRlci5WYWx1ZS5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHR5cGVNYXBbXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXIuVHlwZVxuICAgICAgXS50eXBlTmFtZSA9IGBtc2NybS4ke3JlcXVlc3RQYXJhbWV0ZXIuVmFsdWUuZW50aXR5VHlwZX1gO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkVudGl0eUNvbGxlY3Rpb25cIikge1xuICAgICAgaWYgKFxuICAgICAgICAhQXJyYXkuaXNBcnJheShyZXF1ZXN0UGFyYW1ldGVyLlZhbHVlKSB8fFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyLlZhbHVlLmV2ZXJ5KFxuICAgICAgICAgICh2KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHYgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgICF2IHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImlkXCIpIHx8XG4gICAgICAgICAgICAhdi5oYXNPd25Qcm9wZXJ0eShcImVudGl0eVR5cGVcIilcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihpbnZhbGlkVHlwZU1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdFBhcmFtZXRlci5UeXBlID09PSBcIkRhdGVUaW1lXCIpIHtcbiAgICAgIGlmICghKHJlcXVlc3RQYXJhbWV0ZXIuVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFjdHVhbFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW52YWxpZFR5cGVNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIEFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBUaGUgdW5pcXVlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyW119IHJlcXVlc3RQYXJhbWV0ZXJzIC0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBwYXJhbWV0ZXIgbmFtZSwgdHlwZSBhbmQgdmFsdWUuXG4gICAqIEBwYXJhbSB7RW50aXR5UmVmZXJlbmNlfSBbYm91bmRFbnRpdHldIC0gQW4gb3B0aW9uYWwgRW50aXR5UmVmZXJlbmNlIG9mIHRoZSBib3VuZCBlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBQcm9taXNlIHdpdGggdGhlIHJlcXVlc3QgcmVzcG9uc2UuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXIgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gICAqL1xuICBleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGlvbihcbiAgICBhY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgcmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJbXSxcbiAgICBib3VuZEVudGl0eT86IEVudGl0eVJlZmVyZW5jZVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlckRlZmluaXRpb246IGFueSA9IHt9O1xuICAgIGlmIChib3VuZEVudGl0eSlcbiAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgICBOYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBWYWx1ZTogYm91bmRFbnRpdHksXG4gICAgICAgIFR5cGU6IFwiRW50aXR5UmVmZXJlbmNlXCIsXG4gICAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RQYXJhbWV0ZXIgb2YgcmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgIGNoZWNrUmVxdWVzdFBhcmFtZXRlclR5cGUocmVxdWVzdFBhcmFtZXRlcik7XG4gICAgICBwYXJhbWV0ZXJEZWZpbml0aW9uW3JlcXVlc3RQYXJhbWV0ZXIuTmFtZV0gPSB7XG4gICAgICAgIHR5cGVOYW1lOiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0udHlwZU5hbWUsXG4gICAgICAgIHN0cnVjdHVyYWxQcm9wZXJ0eTogdHlwZU1hcFtyZXF1ZXN0UGFyYW1ldGVyLlR5cGVdLnN0cnVjdHVyYWxQcm9wZXJ0eSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGdldE1ldGFkYXRhOiAoKSA9PiAoe1xuICAgICAgICAgIGJvdW5kUGFyYW1ldGVyOiBib3VuZEVudGl0eSA/IFwiZW50aXR5XCIgOiBudWxsLFxuICAgICAgICAgIG9wZXJhdGlvblR5cGU6IDAsXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogYWN0aW9uTmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyRGVmaW5pdGlvbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgLi4ucmVxdWVzdFBhcmFtZXRlcnMubWFwKChwKSA9PiAoeyBbcC5OYW1lXTogcC5WYWx1ZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgWHJtLldlYkFwaS5vbmxpbmUuZXhlY3V0ZShyZXEpO1xuICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuIHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiByZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBGdW5jdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIFRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7UmVxdWVzdFBhcmFtZXRlcltdfSByZXF1ZXN0UGFyYW1ldGVycyAtIEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGUgcGFyYW1ldGVyIG5hbWUsIHR5cGUgYW5kIHZhbHVlLlxuICAgKiBAcGFyYW0ge0VudGl0eVJlZmVyZW5jZX0gW2JvdW5kRW50aXR5XSAtIEFuIG9wdGlvbmFsIEVudGl0eVJlZmVyZW5jZSBvZiB0aGUgYm91bmQgZW50aXR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgUHJvbWlzZSB3aXRoIHRoZSByZXF1ZXN0IHJlc3BvbnNlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHJlcXVlc3QgcGFyYW1ldGVyIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVGdW5jdGlvbihcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICByZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcltdLFxuICAgIGJvdW5kRW50aXR5PzogRW50aXR5UmVmZXJlbmNlXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyRGVmaW5pdGlvbjogYW55ID0ge307XG4gICAgaWYgKGJvdW5kRW50aXR5KVxuICAgICAgcmVxdWVzdFBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIE5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIFZhbHVlOiBib3VuZEVudGl0eSxcbiAgICAgICAgVHlwZTogXCJFbnRpdHlSZWZlcmVuY2VcIixcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdFBhcmFtZXRlciBvZiByZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgY2hlY2tSZXF1ZXN0UGFyYW1ldGVyVHlwZShyZXF1ZXN0UGFyYW1ldGVyKTtcbiAgICAgIHBhcmFtZXRlckRlZmluaXRpb25bcmVxdWVzdFBhcmFtZXRlci5OYW1lXSA9IHtcbiAgICAgICAgdHlwZU5hbWU6IHR5cGVNYXBbcmVxdWVzdFBhcmFtZXRlci5UeXBlXS50eXBlTmFtZSxcbiAgICAgICAgc3RydWN0dXJhbFByb3BlcnR5OiB0eXBlTWFwW3JlcXVlc3RQYXJhbWV0ZXIuVHlwZV0uc3RydWN0dXJhbFByb3BlcnR5LFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgZ2V0TWV0YWRhdGE6ICgpID0+ICh7XG4gICAgICAgICAgYm91bmRQYXJhbWV0ZXI6IGJvdW5kRW50aXR5ID8gXCJlbnRpdHlcIiA6IG51bGwsXG4gICAgICAgICAgb3BlcmF0aW9uVHlwZTogMSxcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlckRlZmluaXRpb24sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIC4uLnJlcXVlc3RQYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHsgW3AuTmFtZV06IHAuVmFsdWUgfSkpXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFhybS5XZWJBcGkub25saW5lLmV4ZWN1dGUocmVxKTtcbiAgICBpZiAocmVzcG9uc2Uub2spIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgR1VJRCBsb3dlcmNhc2UgYW5kIHJlbW92ZXMgYnJhY2tldHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gVGhlIEdVSUQgdG8gbm9ybWFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBub3JtYWxpemVkIEdVSUQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplR3VpZChndWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgZ3VpZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXgubm9ybWFsaXplR3VpZDpcXG4nJHtndWlkfScgaXMgbm90IGEgc3RyaW5nYCk7XG4gICAgcmV0dXJuIGd1aWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9be31dL2csIFwiXCIpO1xuICB9XG4gIC8qKlxuICAgKiBPcGVucyBhIGRpYWxvZyB3aXRoIGR5bmFtaWMgaGVpZ2h0IGFuZCB3aWR0aCBiYXNlZCBvbiB0ZXh0IGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRpYWxvZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIFByb21pc2Ugd2l0aCB0aGUgZGlhbG9nIHJlc3BvbnNlLlxuICAgKi9cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5BbGVydERpYWxvZyhcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZ1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgvXFxyXFxufFxccnxcXG4vKTtcbiAgICAgIGxldCBhZGRpdGlvbmFsUm93cyA9IDA7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgICAgICAgcm93LFxuICAgICAgICAgIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICh3aWR0aCA+IDk0MCkge1xuICAgICAgICAgIGFkZGl0aW9uYWxSb3dzICs9IHdpZHRoIC8gOTQwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvbmdlc3RSb3cgPSByb3dzLnJlZHVjZShcbiAgICAgICAgKGFjYywgcm93KSA9PiAocm93Lmxlbmd0aCA+IGFjYy5sZW5ndGggPyByb3cgOiBhY2MpLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgZ2V0VGV4dFdpZHRoKGxvbmdlc3RSb3csIFwiMXJlbSBTZWdvZSBVSSBSZWd1bGFyLCBTZWdvZVVJLCBTZWdvZSBVSVwiKSxcbiAgICAgICAgMTAwMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IDEwOSArIChyb3dzLmxlbmd0aCArIGFkZGl0aW9uYWxSb3dzKSAqIDIwO1xuICAgICAgcmV0dXJuIGF3YWl0IFhybS5OYXZpZ2F0aW9uLm9wZW5BbGVydERpYWxvZyhcbiAgICAgICAge1xuICAgICAgICAgIGNvbmZpcm1CdXR0b25MYWJlbDogXCJPa1wiLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtnZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlcyBjYW52YXMubWVhc3VyZVRleHQgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gdGV4dCBvZiBnaXZlbiBmb250IGluIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb250IFRoZSBjc3MgZm9udCBkZXNjcmlwdG9yIHRoYXQgdGV4dCBpcyB0byBiZSByZW5kZXJlZCB3aXRoIChlLmcuIFwiYm9sZCAxNHB4IHZlcmRhbmFcIikuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExODI0MS9jYWxjdWxhdGUtdGV4dC13aWR0aC13aXRoLWphdmFzY3JpcHQvMjEwMTUzOTMjMjEwMTUzOTNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dDogc3RyaW5nLCBmb250OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGNvbnRleHQuZm9udCA9IGZvbnQ7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgIHJldHVybiBtZXRyaWNzLndpZHRoO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIGZvcm0gaW4gRHluYW1pY3MgMzY1LlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEZvcm0ge1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2Zvcm1Db250ZXh0OiBYcm0uRm9ybUNvbnRleHQ7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZXhlY3V0aW9uQ29udGV4dDogWHJtLkV2ZW50cy5FdmVudENvbnRleHQ7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZm9ybSBjb250ZXh0Ki9cbiAgICBzdGF0aWMgZ2V0IGZvcm1Db250ZXh0KCk6IFhybS5Gb3JtQ29udGV4dCB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRleHQ7XG4gICAgfVxuICAgIC8qKkdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZXhlY3V0aW8gY29udGV4dCovXG4gICAgc3RhdGljIGdldCBleGVjdXRpb25Db250ZXh0KCk6IFhybS5FdmVudHMuRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0O1xuICAgIH1cbiAgICAvKipHZXRzIGEgbG9va3VwIHZhbHVlIHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVjb3JkLiovXG4gICAgc3RhdGljIGdldCBlbnRpdHlSZWZlcmVuY2UoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC5kYXRhLmVudGl0eS5nZXRFbnRpdHlSZWZlcmVuY2UoKTtcbiAgICB9XG4gICAgLyoqU2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb3JtIGNvbnRleHQqL1xuICAgIHN0YXRpYyBzZXQgZm9ybUNvbnRleHQoY29udGV4dDogWHJtLkZvcm1Db250ZXh0IHwgWHJtLkV2ZW50cy5FdmVudENvbnRleHQpIHtcbiAgICAgIGlmIChcImdldEZvcm1Db250ZXh0XCIgaW4gY29udGV4dCkge1xuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0LmdldEZvcm1Db250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKFwiZGF0YVwiIGluIGNvbnRleHQpIHRoaXMuX2Zvcm1Db250ZXh0ID0gY29udGV4dDtcbiAgICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBYcm1FeC5Gb3JtLnNldEZvcm1Db250ZXh0OiBUaGUgZXhlY3V0aW9uQ29udGV4dCBvciBmb3JtQ29udGV4dCB3YXMgbm90IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0Ki9cbiAgICBzdGF0aWMgc2V0IGV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICBjb250ZXh0OiBYcm0uRm9ybUNvbnRleHQgfCBYcm0uRXZlbnRzLkV2ZW50Q29udGV4dFxuICAgICkge1xuICAgICAgaWYgKFwiZ2V0Rm9ybUNvbnRleHRcIiBpbiBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9mb3JtQ29udGV4dCA9IGNvbnRleHQuZ2V0Rm9ybUNvbnRleHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoXCJkYXRhXCIgaW4gY29udGV4dCkgdGhpcy5fZm9ybUNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFhybUV4LkZvcm0uc2V0RXhlY3V0aW9uQ29udGV4dDogVGhlIGV4ZWN1dGlvbkNvbnRleHQgb3IgZm9ybUNvbnRleHQgd2FzIG5vdCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLmBcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIGNyZWF0ZSovXG4gICAgc3RhdGljIGdldCBJc0NyZWF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMTtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgZnJvbSB0eXBlIHVwZGF0ZSovXG4gICAgc3RhdGljIGdldCBJc1VwZGF0ZSgpIHtcbiAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmdldEZvcm1UeXBlKCkgPT0gMjtcbiAgICB9XG4gICAgLyoqUmV0dXJucyB0cnVlIGlmIGZvcm0gaXMgbm90IGZyb20gdHlwZSBjcmVhdGUqL1xuICAgIHN0YXRpYyBnZXQgSXNOb3RDcmVhdGUoKSB7XG4gICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5nZXRGb3JtVHlwZSgpICE9IDE7XG4gICAgfVxuICAgIC8qKlJldHVybnMgdHJ1ZSBpZiBmb3JtIGlzIG5vdCBmcm9tIHR5cGUgdXBkYXRlKi9cbiAgICBzdGF0aWMgZ2V0IElzTm90VXBkYXRlKCkge1xuICAgICAgcmV0dXJuIEZvcm0uZm9ybUNvbnRleHQudWkuZ2V0Rm9ybVR5cGUoKSAhPSAyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGZvcm0gbGV2ZWwgbm90aWZpY2F0aW9uLiBBbnkgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgY2FuIGJlIGRpc3BsYXllZCBhbmQgd2lsbCByZW1haW4gdW50aWwgcmVtb3ZlZCB1c2luZyBjbGVhckZvcm1Ob3RpZmljYXRpb24uXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgbm90aWZpY2F0aW9uIGFyZWEgaXMgbGltaXRlZCBzbyBlYWNoIG5ldyBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgdGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIGxldmVsIFRoZSBsZXZlbCBvZiB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGRlZmluZXMgaG93IHRoZSBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLCBzdWNoIGFzIHRoZSBpY29uLlxuICAgICAqIEVSUk9SOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBlcnJvciBpY29uLlxuICAgICAqIFdBUk5JTkc6IE5vdGlmaWNhdGlvbiB3aWxsIHVzZSB0aGUgc3lzdGVtIHdhcm5pbmcgaWNvbi5cbiAgICAgKiBJTkZPOiBOb3RpZmljYXRpb24gd2lsbCB1c2UgdGhlIHN5c3RlbSBpbmZvIGljb24uXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm90aWZpY2F0aW9uIHdoaWNoIGlzIHVzZWQgd2l0aCBjbGVhckZvcm1Ob3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZSBub3RpZmljYXRpb24uXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgbGV2ZWw6IFhybS5Gb3JtTm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICB1bmlxdWVJZDogc3RyaW5nXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gRm9ybS5mb3JtQ29udGV4dC51aS5zZXRGb3JtTm90aWZpY2F0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgdW5pcXVlSWRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZvcm0gbm90aWZpY2F0aW9uIGRlc2NyaWJlZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCBzdWNjZWVkcywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVGb3JtTm90aWZpY2F0aW9uKHVuaXF1ZUlkOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBGb3JtLmZvcm1Db250ZXh0LnVpLmNsZWFyRm9ybU5vdGlmaWNhdGlvbih1bmlxdWVJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZCBpcyBzYXZlZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25TYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25TYXZlKGhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBPblNhdmUgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIuXG4gICAgICogQHJlbWFya3MgQWRkZWQgaW4gOS4yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcG93ZXJhcHBzL2RldmVsb3Blci9tb2RlbC1kcml2ZW4tYXBwcy9jbGllbnRhcGkvcmVmZXJlbmNlL2V2ZW50cy9wb3N0c2F2ZSBFeHRlcm5hbCBMaW5rOiBQb3N0U2F2ZSBFdmVudCBEb2N1bWVudGF0aW9ufVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRPblBvc3RTYXZlRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5lbnRpdHkuYWRkT25Qb3N0U2F2ZShoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGZvcm0gZGF0YSBpcyBsb2FkZWQuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGZvcm0gZGF0YSBsb2Fkcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgZXZlbnQgaGFuZGxlciBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkT25Mb2FkRXZlbnRIYW5kbGVyKFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGhhbmRsZXJzID0gW2hhbmRsZXJzXTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZGF0YS5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBoYW5kbGVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBmdW5jdGlvbiByZWZlcmVuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGFkZE9uQ2hhbmdlRXZlbnRIYW5kbGVyKFxuICAgICAgZmllbGRzOiBGaWVsZFtdLFxuICAgICAgaGFuZGxlcnM6XG4gICAgICAgIHwgWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlclxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJbXSxcbiAgICAgIGV4ZWN1dGU/OiBib29sZWFuXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgaGFuZGxlcnMgPSBbaGFuZGxlcnNdO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtoYW5kbGVyfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5hZGRPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChleGVjdXRlKSB7XG4gICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5BdHRyaWJ1dGUuZmlyZU9uQ2hhbmdlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleGVjdXRlIG1ldGhvZHMgcmVsYXRlZCB0byBhIHNpbmdsZSBBdHRyaWJ1dGVcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBGaWVsZCBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgcHVibGljIHN0YXRpYyBhbGxGaWVsZHM6IEZpZWxkW10gPSBbXTtcblxuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYXR0cmlidXRlPzogWHJtLkF0dHJpYnV0ZXMuQXR0cmlidXRlO1xuXG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0ZpZWxkID0gRmllbGQuYWxsRmllbGRzLmZpbmQoXG4gICAgICAgIChmKSA9PiBmLk5hbWUgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoZXhpc3RpbmdGaWVsZCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGaWVsZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICBGaWVsZC5hbGxGaWVsZHMucHVzaCh0aGlzKTtcbiAgICB9XG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlVHlwZSgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVUeXBlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVUeXBlKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5BdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpO1xuICAgIH1cbiAgICBnZXRJc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldElzRGlydHkoKTtcbiAgICB9XG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5FbnRpdHkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRSZXF1aXJlZExldmVsKCk6IFhybS5BdHRyaWJ1dGVzLlJlcXVpcmVtZW50TGV2ZWwge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFJlcXVpcmVkTGV2ZWwoKTtcbiAgICB9XG4gICAgZ2V0U3VibWl0TW9kZSgpOiBYcm0uU3VibWl0TW9kZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0U3VibWl0TW9kZSgpO1xuICAgIH1cbiAgICBnZXRVc2VyUHJpdmlsZWdlKCk6IFhybS5Qcml2aWxlZ2Uge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFVzZXJQcml2aWxlZ2UoKTtcbiAgICB9XG4gICAgcmVtb3ZlT25DaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5BdHRyaWJ1dGUuQ2hhbmdlRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUucmVtb3ZlT25DaGFuZ2UoaGFuZGxlcik7XG4gICAgfVxuICAgIHNldFN1Ym1pdE1vZGUoc3VibWl0TW9kZTogWHJtLlN1Ym1pdE1vZGUpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRTdWJtaXRNb2RlKHN1Ym1pdE1vZGUpO1xuICAgIH1cbiAgICBnZXRWYWx1ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXRJc1ZhbGlkKGlzVmFsaWQ6IGJvb2xlYW4sIG1lc3NhZ2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRJc1ZhbGlkKGlzVmFsaWQsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgQXR0cmlidXRlKCk6IFhybS5BdHRyaWJ1dGVzLkF0dHJpYnV0ZSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKFxuICAgICAgICAgIGBUaGUgYXR0cmlidXRlICcke3RoaXMuTmFtZX0nIHdhcyBub3QgZm91bmQgb24gdGhlIGZvcm0uYFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbnRyb2xzKCk6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5TdGFuZGFyZENvbnRyb2w+IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBWYWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbnRyb2wtbG9jYWwgbm90aWZpY2F0aW9uIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMsIGZhbHNlIGlmIGl0IGZhaWxzLlxuICAgICAqIEByZW1hcmtzICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIHVzZWQgb24gTWljcm9zb2Z0IER5bmFtaWNzIENSTSBmb3IgdGFibGV0cyBhIHJlZCBcIlhcIiBpY29uXG4gICAgICogICAgICAgICAgICAgIGFwcGVhcnMgbmV4dCB0byB0aGUgY29udHJvbC4gVGFwcGluZyBvbiB0aGUgaWNvbiB3aWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldE5vdGlmaWNhdGlvbihtZXNzYWdlOiBzdHJpbmcsIHVuaXF1ZUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKGBubyBtZXNzYWdlIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKCF1bmlxdWVJZCkgdGhyb3cgbmV3IEVycm9yKGBubyB1bmlxdWVJZCB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT5cbiAgICAgICAgICBjb250cm9sLnNldE5vdGlmaWNhdGlvbihtZXNzYWdlLCB1bmlxdWVJZClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlLlxuICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgdG8gc2hvdywgZmFsc2UgdG8gaGlkZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IGNvbnRyb2wuc2V0VmlzaWJsZSh2aXNpYmxlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdG8gZWl0aGVyIGVuYWJsZWQsIG9yIGRpc2FibGVkLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCB0cnVlIHRvIGRpc2FibGUsIGZhbHNlIHRvIGVuYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4gY29udHJvbC5zZXREaXNhYmxlZChkaXNhYmxlZCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIGxldmVsLlxuICAgICAqIEBwYXJhbSByZXF1aXJlbWVudExldmVsIFRoZSByZXF1aXJlbWVudCBsZXZlbCwgYXMgZWl0aGVyIFwibm9uZVwiLCBcInJlcXVpcmVkXCIsIG9yIFwicmVjb21tZW5kZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZExldmVsKFxuICAgICAgcmVxdWlyZW1lbnRMZXZlbDogWHJtLkF0dHJpYnV0ZXMuUmVxdWlyZW1lbnRMZXZlbFxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlbWVudExldmVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICAgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVtZW50IGxldmVsLCBhcyBlaXRoZXIgZmFsc2UgZm9yIFwibm9uZVwiIG9yIHRydWUgZm9yIFwicmVxdWlyZWRcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXF1aXJlZChyZXF1aXJlZDogYm9vbGVhbik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlZCA/IFwicmVxdWlyZWRcIiA6IFwibm9uZVwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipGaXJlIGFsbCBcIm9uIGNoYW5nZVwiIGV2ZW50IGhhbmRsZXJzLiAqL1xuICAgIHB1YmxpYyBmaXJlT25DaGFuZ2UoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkF0dHJpYnV0ZS5maXJlT25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgaGFuZGxlciBvciBhbiBhcnJheSBvZiBoYW5kbGVycyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gaGFuZGxlcnMgVGhlIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBhbiBhcnJheSBvZiBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRPbkNoYW5nZShcbiAgICAgIGhhbmRsZXJzOlxuICAgICAgICB8IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXJcbiAgICAgICAgfCBYcm0uRXZlbnRzLkNvbnRleHRTZW5zaXRpdmVIYW5kbGVyW11cbiAgICApOiB0aGlzIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7aGFuZGxlcn0nIGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gICAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuQXR0cmlidXRlLmFkZE9uQ2hhbmdlKGhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2hhbmRsZXJzfScgaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICAgICAgICB0aGlzLkF0dHJpYnV0ZS5yZW1vdmVPbkNoYW5nZShoYW5kbGVycyk7XG4gICAgICAgICAgdGhpcy5BdHRyaWJ1dGUuYWRkT25DaGFuZ2UoaGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gZXJyb3Igb3IgcmVjb21tZW5kYXRpb24gbm90aWZpY2F0aW9uIGZvciBhIGNvbnRyb2wsIGFuZCBsZXRzIHlvdSBzcGVjaWZ5IGFjdGlvbnMgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUgbm90aWZpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGROb3RpZmljYXRpb24oXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBub3RpZmljYXRpb25MZXZlbDogXCJFUlJPUlwiIHwgXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgICAgdW5pcXVlSWQ6IHN0cmluZyxcbiAgICAgIGFjdGlvbnM/OiBYcm0uQ29udHJvbHMuQ29udHJvbE5vdGlmaWNhdGlvbkFjdGlvbltdXG4gICAgKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXVuaXF1ZUlkKSB0aHJvdyBuZXcgRXJyb3IoYG5vIHVuaXF1ZUlkIHdhcyBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKGFjdGlvbnMgJiYgIUFycmF5LmlzQXJyYXkoYWN0aW9ucykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRoZSBhY3Rpb24gcGFyYW1ldGVyIGlzIG5vdCBhbiBhcnJheSBvZiBDb250cm9sTm90aWZpY2F0aW9uQWN0aW9uYFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBbbWVzc2FnZV0sXG4gICAgICAgICAgICBub3RpZmljYXRpb25MZXZlbDogbm90aWZpY2F0aW9uTGV2ZWwsXG4gICAgICAgICAgICB1bmlxdWVJZDogdW5pcXVlSWQsXG4gICAgICAgICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBub3RpZmljYXRpb24gaWRlbnRpZmllZCBieSB1bmlxdWVJZC5cbiAgICAgKiBAcGFyYW0gdW5pcXVlSWQgKE9wdGlvbmFsKSBVbmlxdWUgaWRlbnRpZmllci5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRzLCBmYWxzZSBpZiBpdCBmYWlscy5cbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgdW5pcXVlSWQgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLCB0aGUgY3VycmVudCBub3RpZmljYXRpb24gc2hvd24gd2lsbCBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZU5vdGlmaWNhdGlvbih1bmlxdWVJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmNsZWFyTm90aWZpY2F0aW9uKHVuaXF1ZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBUZXh0RmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0TWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5TdHJpbmdBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLlN0cmluZ0F0dHJpYnV0ZUZvcm1hdDtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE51bWJlckZpZWxkXG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuTnVtYmVyQXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5OdW1iZXJBdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEZvcm1hdCgpOiBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0IHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRGb3JtYXQoKSBhcyBYcm0uQXR0cmlidXRlcy5JbnRlZ2VyQXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRNYXgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRNYXgoKTtcbiAgICB9XG4gICAgZ2V0TWluKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0TWluKCk7XG4gICAgfVxuICAgIGdldFByZWNpc2lvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFByZWNpc2lvbigpO1xuICAgIH1cbiAgICBzZXRQcmVjaXNpb24ocHJlY2lzaW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5zZXRQcmVjaXNpb24ocHJlY2lzaW9uKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFZhbHVlKCkgPz8gbnVsbDtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIERhdGVGaWVsZCBleHRlbmRzIEZpZWxkIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZSB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuRGF0ZUF0dHJpYnV0ZTtcbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldEZvcm1hdCgpIGFzIFhybS5BdHRyaWJ1dGVzLkRhdGVBdHRyaWJ1dGVGb3JtYXQ7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogRGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZFxuICAgIGV4dGVuZHMgRmllbGRcbiAgICBpbXBsZW1lbnRzIFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkJvb2xlYW5BdHRyaWJ1dGU7XG4gICAgY29uc3RydWN0b3IoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVHlwZSgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0SW5pdGlhbFZhbHVlKCk7XG4gICAgfVxuICAgIGdldCBBdHRyaWJ1dGUoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX2F0dHJpYnV0ZSA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC5nZXRBdHRyaWJ1dGUodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCAnJHt0aGlzLk5hbWV9JyBkb2VzIG5vdCBleGlzdGApKTtcbiAgICB9XG4gICAgZ2V0IGNvbnRyb2xzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmNvbnRyb2xzO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKSA/PyBudWxsO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0T3B0aW9uU2V0RmllbGQ8T3B0aW9ucyBleHRlbmRzIE9wdGlvblZhbHVlcz5cbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5NdWx0aVNlbGVjdE9wdGlvblNldEF0dHJpYnV0ZVxuICB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgX2F0dHJpYnV0ZTogWHJtLkF0dHJpYnV0ZXMuTXVsdGlTZWxlY3RPcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFNlbGVjdGVkT3B0aW9uKCk7XG4gICAgfVxuICAgIGdldFRleHQoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldFRleHQoKTtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbFZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBWYWx1ZSgpOiBudW1iZXJbXSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgc2V0IFZhbHVlKHZhbHVlOiAoa2V5b2YgT3B0aW9ucylbXSB8IG51bWJlcltdKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpIHZhbHVlcy5wdXNoKHYpO1xuICAgICAgICAgIGVsc2UgdmFsdWVzLnB1c2godGhpcy5PcHRpb25bdl0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWVzKTtcbiAgICAgIH0gZWxzZSBYcm1FeC50aHJvd0Vycm9yKGBGaWVsZCBWYWx1ZSAnJHt2YWx1ZX0nIGlzIG5vdCBhbiBBcnJheWApO1xuICAgIH1cbiAgfVxuICBleHBvcnQgY2xhc3MgTG9va3VwRmllbGRcbiAgICBleHRlbmRzIEZpZWxkXG4gICAgaW1wbGVtZW50cyBYcm0uQXR0cmlidXRlcy5Mb29rdXBBdHRyaWJ1dGVcbiAge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIF9hdHRyaWJ1dGU6IFhybS5BdHRyaWJ1dGVzLkxvb2t1cEF0dHJpYnV0ZTtcbiAgICBwcm90ZWN0ZWQgX2N1c3RvbUZpbHRlcnM6IGFueSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgICBzdXBlcihhdHRyaWJ1dGUpO1xuICAgIH1cbiAgICBnZXRJc1BhcnR5TGlzdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJc1BhcnR5TGlzdCgpO1xuICAgIH1cbiAgICBnZXQgQXR0cmlidXRlKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9hdHRyaWJ1dGUgPz89XG4gICAgICAgIEZvcm0uZm9ybUNvbnRleHQuZ2V0QXR0cmlidXRlKHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihgRmllbGQgJyR7dGhpcy5OYW1lfScgZG9lcyBub3QgZXhpc3RgKSk7XG4gICAgfVxuICAgIGdldCBjb250cm9scygpIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5jb250cm9scztcbiAgICB9XG4gICAgLyoqR2V0cyB0aGUgaWQgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IElkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwXG4gICAgICAgID8gWHJtRXgubm9ybWFsaXplR3VpZCh0aGlzLlZhbHVlWzBdLmlkKVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIC8qKkdldHMgdGhlIGVudGl0eVR5cGUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEVudGl0eVR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5WYWx1ZSAmJiB0aGlzLlZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLlZhbHVlWzBdLmVudGl0eVR5cGVcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICAvKipHZXRzIHRoZSBmb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGZpcnN0IGxvb2t1cCB2YWx1ZSovXG4gICAgZ2V0IEZvcm1hdHRlZFZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuVmFsdWUgJiYgdGhpcy5WYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5WYWx1ZVswXS5uYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IFZhbHVlKCk6IFhybS5Mb29rdXBWYWx1ZVtdIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpID8/IG51bGw7XG4gICAgfVxuICAgIHNldCBWYWx1ZSh2YWx1ZTogWHJtLkxvb2t1cFZhbHVlW10pIHtcbiAgICAgIHRoaXMuQXR0cmlidXRlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBsb29rdXBcbiAgICAgKiBAcGFyYW0gaWQgR3VpZCBvZiB0aGUgcmVjb3JkXG4gICAgICogQHBhcmFtIGVudGl0eVR5cGUgbG9naWNhbG5hbWUgb2YgdGhlIGVudGl0eVxuICAgICAqIEBwYXJhbSBuYW1lIGZvcm1hdHRlZCB2YWx1ZVxuICAgICAqIEBwYXJhbSBhcHBlbmQgaWYgdHJ1ZSwgYWRkcyB2YWx1ZSB0byB0aGUgYXJyYXkgaW5zdGVhZCBvZiByZXBsYWNpbmcgaXRcbiAgICAgKi9cbiAgICBzZXRMb29rdXBWYWx1ZShcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBlbnRpdHlUeXBlOiBhbnksXG4gICAgICBuYW1lOiBhbnksXG4gICAgICBhcHBlbmQgPSBmYWxzZVxuICAgICk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBubyBpZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkLmApO1xuICAgICAgICBpZiAoIWVudGl0eVR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBlbnRpdHlUeXBlIHBhcmFtZXRlciB3YXMgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlkID0gWHJtRXgubm9ybWFsaXplR3VpZChpZCk7XG4gICAgICAgIGNvbnN0IGxvb2t1cFZhbHVlID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGVudGl0eVR5cGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5WYWx1ZSA9XG4gICAgICAgICAgYXBwZW5kICYmIHRoaXMuVmFsdWUgPyB0aGlzLlZhbHVlLmNvbmNhdChsb29rdXBWYWx1ZSkgOiBbbG9va3VwVmFsdWVdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZW50aXR5IHJlY29yZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAoT3B0aW9uYWwpIE9EYXRhIHN5c3RlbSBxdWVyeSBvcHRpb25zLCAkc2VsZWN0IGFuZCAkZXhwYW5kLCB0byByZXRyaWV2ZSB5b3VyIGRhdGEuXG4gICAgICogLSBVc2UgdGhlICRzZWxlY3Qgc3lzdGVtIHF1ZXJ5IG9wdGlvbiB0byBsaW1pdCB0aGUgcHJvcGVydGllcyByZXR1cm5lZCBieSBpbmNsdWRpbmcgYSBjb21tYS1zZXBhcmF0ZWRcbiAgICAgKiAgIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHBlcmZvcm1hbmNlIGJlc3QgcHJhY3RpY2UuIElmIHByb3BlcnRpZXMgYXJlbuKAmXRcbiAgICAgKiAgIHNwZWNpZmllZCB1c2luZyAkc2VsZWN0LCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIC0gVXNlIHRoZSAkZXhwYW5kIHN5c3RlbSBxdWVyeSBvcHRpb24gdG8gY29udHJvbCB3aGF0IGRhdGEgZnJvbSByZWxhdGVkIGVudGl0aWVzIGlzIHJldHVybmVkLiBJZiB5b3VcbiAgICAgKiAgIGp1c3QgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSwgeW914oCZbGwgcmVjZWl2ZSBhbGwgdGhlIHByb3BlcnRpZXMgZm9yIHJlbGF0ZWRcbiAgICAgKiAgIHJlY29yZHMuIFlvdSBjYW4gbGltaXQgdGhlIHByb3BlcnRpZXMgcmV0dXJuZWQgZm9yIHJlbGF0ZWQgcmVjb3JkcyB1c2luZyB0aGUgJHNlbGVjdCBzeXN0ZW0gcXVlcnlcbiAgICAgKiAgIG9wdGlvbiBpbiBwYXJlbnRoZXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lLiBVc2UgdGhpcyBmb3IgYm90aCBzaW5nbGUtdmFsdWVkIGFuZFxuICAgICAqICAgY29sbGVjdGlvbi12YWx1ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICAgICAqIC0gWW91IGNhbiBhbHNvIHNwZWNpZnkgbXVsdGlwbGUgcXVlcnkgb3B0aW9ucyBieSB1c2luZyAmIHRvIHNlcGFyYXRlIHRoZSBxdWVyeSBvcHRpb25zLlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPm9wdGlvbnMgZXhhbXBsZTo8L2NhcHRpb24+XG4gICAgICogb3B0aW9uczogJHNlbGVjdD1uYW1lJiRleHBhbmQ9cHJpbWFyeWNvbnRhY3RpZCgkc2VsZWN0PWNvbnRhY3RpZCxmdWxsbmFtZSlcbiAgICAgKiBAcmV0dXJucyBPbiBzdWNjZXNzLCByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgcmV0cmlldmVkIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9keW5hbWljczM2NS9jdXN0b21lci1lbmdhZ2VtZW50L2RldmVsb3Blci9jbGllbnRhcGkvcmVmZXJlbmNlL3hybS13ZWJhcGkvcmV0cmlldmVyZWNvcmQgRXh0ZXJuYWwgTGluazogcmV0cmlldmVSZWNvcmQgKENsaWVudCBBUEkgcmVmZXJlbmNlKX1cbiAgICAgKi9cbiAgICBhc3luYyByZXRyaWV2ZShvcHRpb25zOiBzdHJpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghdGhpcy5JZCB8fCAhdGhpcy5FbnRpdHlUeXBlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgWHJtLldlYkFwaS5yZXRyaWV2ZVJlY29yZChcbiAgICAgICAgICB0aGlzLkVudGl0eVR5cGUsXG4gICAgICAgICAgdGhpcy5JZCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhZGRpdGlvbmFsIGN1c3RvbSBmaWx0ZXIgdG8gdGhlIGxvb2t1cCwgd2l0aCB0aGUgXCJBTkRcIiBmaWx0ZXIgb3BlcmF0b3IuXG4gICAgICogQHBhcmFtIGZpbHRlciBTcGVjaWZpZXMgdGhlIGZpbHRlciwgYXMgYSBzZXJpYWxpemVkIEZldGNoWE1MIFwiZmlsdGVyXCIgbm9kZS5cbiAgICAgKiBAcGFyYW0gZW50aXR5TG9naWNhbE5hbWUgKE9wdGlvbmFsKSBUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBlbnRpdHkuXG4gICAgICogQHJlbWFya3MgICAgIElmIGVudGl0eUxvZ2ljYWxOYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbnRpdGllc1xuICAgICAqICAgICAgICAgICAgICB2YWxpZCBmb3IgdGhlIExvb2t1cCBjb250cm9sLlxuICAgICAqIEBleGFtcGxlICAgICBFeGFtcGxlIGZpbHRlcjogPGZpbHRlciB0eXBlPVwiYW5kXCI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIGF0dHJpYnV0ZT1cImFkZHJlc3MxX2NpdHlcIiBvcGVyYXRvcj1cImVxXCIgdmFsdWU9XCJSZWRtb25kXCIgLz5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAqL1xuICAgIGFkZFByZUZpbHRlclRvTG9va3VwKGZpbHRlclhtbDogc3RyaW5nLCBlbnRpdHlMb2dpY2FsTmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkUHJlU2VhcmNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3VzdG9tRmlsdGVycy5wdXNoKF9hZGRDdXN0b21GaWx0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfYWRkQ3VzdG9tRmlsdGVyKCkge1xuICAgICAgICBfYWRkQ3VzdG9tRmlsdGVyLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb250cm9sLmFkZEN1c3RvbUZpbHRlcihmaWx0ZXJYbWwsIGVudGl0eUxvZ2ljYWxOYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYWRkaXRpb25hbCBjdXN0b20gZmlsdGVyIHRvIHRoZSBsb29rdXAsIHdpdGggdGhlIFwiQU5EXCIgZmlsdGVyIG9wZXJhdG9yLlxuICAgICAqIEBwYXJhbSBlbnRpdHlMb2dpY2FsTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZSAoT3B0aW9uYWwpIFRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5LlxuICAgICAqIEBwYXJhbSBmZXRjaFhtbCBTcGVjaWZpZXMgdGhlIEZldGNoWE1MIHVzZWQgdG8gZmlsdGVyLlxuICAgICAqIEByZW1hcmtzICAgICBJZiBlbnRpdHlMb2dpY2FsTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlsdGVyIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgZW50aXRpZXNcbiAgICAgKiAgICAgICAgICAgICAgdmFsaWQgZm9yIHRoZSBMb29rdXAgY29udHJvbC5cbiAgICAgKiBAZXhhbXBsZSAgICAgRXhhbXBsZSBmZXRjaFhtbDogPGZldGNoPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudGl0eSBuYW1lPVwiY29udGFjdFwiPlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBhdHRyaWJ1dGU9XCJhZGRyZXNzMV9jaXR5XCIgb3BlcmF0b3I9XCJlcVwiIHZhbHVlPVwiUmVkbW9uZFwiIC8+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudGl0eT5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmV0Y2g+XG4gICAgICovXG4gICAgYXN5bmMgYWRkUHJlRmlsdGVyVG9Mb29rdXBBZHZhbmNlZChcbiAgICAgIGVudGl0eUxvZ2ljYWxOYW1lOiBzdHJpbmcsXG4gICAgICBwcmltYXJ5QXR0cmlidXRlSWROYW1lOiBzdHJpbmcsXG4gICAgICBmZXRjaFhtbDogc3RyaW5nXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBYcm0uV2ViQXBpLm9ubGluZS5yZXRyaWV2ZU11bHRpcGxlUmVjb3JkcyhcbiAgICAgICAgICBlbnRpdHlMb2dpY2FsTmFtZSxcbiAgICAgICAgICBcIj9mZXRjaFhtbD1cIiArIGZldGNoWG1sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgICAgIGxldCBmaWx0ZXJlZEVudGl0aWVzID0gXCJcIjtcbiAgICAgICAgX2FkZEN1c3RvbUZpbHRlci5jb250cm9scyA9IHRoaXMuY29udHJvbHM7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGZpbHRlcmVkRW50aXRpZXMgKz0gYDx2YWx1ZT4ke2l0ZW1bcHJpbWFyeUF0dHJpYnV0ZUlkTmFtZV19PC92YWx1ZT5gO1xuICAgICAgICB9KTtcbiAgICAgICAgZmV0Y2hYbWwgPSBmaWx0ZXJlZEVudGl0aWVzXG4gICAgICAgICAgPyBgPGZpbHRlcj48Y29uZGl0aW9uIGF0dHJpYnV0ZT0nJHtwcmltYXJ5QXR0cmlidXRlSWROYW1lfScgb3BlcmF0b3I9J2luJz4ke2ZpbHRlcmVkRW50aXRpZXN9PC9jb25kaXRpb24+PC9maWx0ZXI+YFxuICAgICAgICAgIDogYDxmaWx0ZXI+PGNvbmRpdGlvbiBhdHRyaWJ1dGU9JyR7cHJpbWFyeUF0dHJpYnV0ZUlkTmFtZX0nIG9wZXJhdG9yPSdudWxsJy8+PC9maWx0ZXI+YDtcbiAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgY29udHJvbC5hZGRQcmVTZWFyY2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLnB1c2goX2FkZEN1c3RvbUZpbHRlcik7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWHJtRXguJHtYcm1FeC5nZXRNZXRob2ROYW1lKCl9OlxcbiR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9hZGRDdXN0b21GaWx0ZXIoKSB7XG4gICAgICAgIF9hZGRDdXN0b21GaWx0ZXIuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnRyb2wuYWRkQ3VzdG9tRmlsdGVyKGZldGNoWG1sLCBlbnRpdHlMb2dpY2FsTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBmaWx0ZXJzIHNldCBvbiB0aGUgY3VycmVudCBsb29rdXAgYXR0cmlidXRlIGJ5IHVzaW5nIGFkZFByZUZpbHRlclRvTG9va3VwIG9yIGFkZFByZUZpbHRlclRvTG9va3VwQWR2YW5jZWRcbiAgICAgKi9cbiAgICBjbGVhclByZUZpbHRlckZyb21Mb29rdXAoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jdXN0b21GaWx0ZXJzLmZvckVhY2goXG4gICAgICAgICAgKGN1c3RvbUZpbHRlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnRyb2wucmVtb3ZlUHJlU2VhcmNoKGN1c3RvbUZpbHRlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHR5cGUgT3B0aW9uVmFsdWVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgZXhwb3J0IGNsYXNzIE9wdGlvbnNldEZpZWxkPE9wdGlvbnMgZXh0ZW5kcyBPcHRpb25WYWx1ZXM+XG4gICAgZXh0ZW5kcyBGaWVsZFxuICAgIGltcGxlbWVudHMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlXG4gIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBfYXR0cmlidXRlOiBYcm0uQXR0cmlidXRlcy5PcHRpb25TZXRBdHRyaWJ1dGU7XG4gICAgcHJvdGVjdGVkIF9jb250cm9sITogWHJtLkNvbnRyb2xzLk9wdGlvblNldENvbnRyb2w7XG4gICAgT3B0aW9uOiBPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZU5hbWU6IHN0cmluZywgb3B0aW9uPzogT3B0aW9ucykge1xuICAgICAgc3VwZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICB0aGlzLk9wdGlvbiA9IG9wdGlvbjtcbiAgICB9XG4gICAgZ2V0Rm9ybWF0KCk6IFhybS5BdHRyaWJ1dGVzLk9wdGlvblNldEF0dHJpYnV0ZUZvcm1hdCB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0Rm9ybWF0KCkgYXMgWHJtLkF0dHJpYnV0ZXMuT3B0aW9uU2V0QXR0cmlidXRlRm9ybWF0O1xuICAgIH1cbiAgICBnZXRPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyk6IFhybS5PcHRpb25TZXRWYWx1ZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRPcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGdldE9wdGlvbnMoKTogWHJtLk9wdGlvblNldFZhbHVlW10ge1xuICAgICAgcmV0dXJuIHRoaXMuQXR0cmlidXRlLmdldE9wdGlvbnMoKTtcbiAgICB9XG4gICAgZ2V0U2VsZWN0ZWRPcHRpb24oKTogWHJtLk9wdGlvblNldFZhbHVlIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRTZWxlY3RlZE9wdGlvbigpO1xuICAgIH1cbiAgICBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRJbml0aWFsVmFsdWUoKTtcbiAgICB9XG4gICAgZ2V0IEF0dHJpYnV0ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fYXR0cmlidXRlID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldEF0dHJpYnV0ZSh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYEZpZWxkICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgY29udHJvbHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5BdHRyaWJ1dGUuY29udHJvbHM7XG4gICAgfVxuICAgIGdldCBjb250cm9sKCkge1xuICAgICAgcmV0dXJuICh0aGlzLl9jb250cm9sID8/PVxuICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2wodGhpcy5OYW1lKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBDb250cm9sICcke3RoaXMuTmFtZX0nIGRvZXMgbm90IGV4aXN0YCkpO1xuICAgIH1cbiAgICBnZXQgVmFsdWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLkF0dHJpYnV0ZS5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICBzZXQgVmFsdWUodmFsdWU6IGtleW9mIE9wdGlvbnMgfCBudW1iZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgdGhpcy5BdHRyaWJ1dGUuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgZWxzZSB0aGlzLkF0dHJpYnV0ZS5zZXRWYWx1ZSh0aGlzLk9wdGlvblt2YWx1ZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgYW4gYXJyYXkgd2l0aCB0aGUgb3B0aW9uIHZhbHVlcyB0byBhZGRcbiAgICAgKiBAcGFyYW0gaW5kZXggKE9wdGlvbmFsKSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgd2l0aGluIHRoZSBvcHRpb25zIHlvdSBhZGQgYXJlIHZhbGlkLlxuICAgICAqICAgICAgICAgIElmIGluZGV4IGlzIG5vdCBwcm92aWRlZCwgdGhlIG5ldyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGFkZE9wdGlvbih2YWx1ZXM6IG51bWJlcltdLCBpbmRleD86IG51bWJlcik6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5hZGRPcHRpb24oZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYcm1FeC4ke1hybUV4LmdldE1ldGhvZE5hbWUoKX06XFxuJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBvcHRpb24gbWF0Y2hpbmcgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZS5cbiAgICAgKi9cbiAgICByZW1vdmVPcHRpb24odmFsdWVzOiBudW1iZXJbXSk6IHRoaXMge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZXMgaXMgbm90IGFuIEFycmF5OlxcbnZhbHVlczogJyR7dmFsdWVzfSdgKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uU2V0VmFsdWVzID0gdGhpcy5jb250cm9sLmdldEF0dHJpYnV0ZSgpLmdldE9wdGlvbnMoKSA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9wdGlvblNldFZhbHVlcykge1xuICAgICAgICAgIGlmICh2YWx1ZXMuaW5jbHVkZXMoZWxlbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZW1vdmVPcHRpb24oZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBjbGVhck9wdGlvbnMoKTogdGhpcyB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuY2xlYXJPcHRpb25zKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFhybUV4LiR7WHJtRXguZ2V0TWV0aG9kTmFtZSgpfTpcXG4ke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBTZWN0aW9uIGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlNlY3Rpb24ge1xuICAgIHB1YmxpYyByZWFkb25seSBOYW1lITogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfc2VjdGlvbj86IFhybS5Db250cm9scy5TZWN0aW9uO1xuICAgIHB1YmxpYyBwYXJlbnRUYWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgICAgdGhpcy5OYW1lID0gbmFtZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBTZWN0aW9uKCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiAodGhpcy5fc2VjdGlvbiA/Pz1cbiAgICAgICAgdGhpcy5wYXJlbnRUYWIuc2VjdGlvbnMuZ2V0KHRoaXMuTmFtZSkgPz9cbiAgICAgICAgWHJtRXgudGhyb3dFcnJvcihcbiAgICAgICAgICBgVGhlIHNlY3Rpb24gJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5UYWIge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgY29udHJvbHM6IFhybS5Db2xsZWN0aW9uLkl0ZW1Db2xsZWN0aW9uPFhybS5Db250cm9scy5Db250cm9sPjtcbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uc2V0VmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9XG4gICAgZ2V0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLlNlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuU2VjdGlvbi5nZXRMYWJlbCgpO1xuICAgIH1cbiAgICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5TZWN0aW9uLnNldExhYmVsKGxhYmVsKTtcbiAgICB9XG4gIH1cbiAgdHlwZSBUYWJTZWN0aW9ucyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWN0aW9uO1xuICB9O1xuICBleHBvcnQgY2xhc3MgVGFiPFNlY3Rpb25zIGV4dGVuZHMgVGFiU2VjdGlvbnM+IGltcGxlbWVudHMgWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF90YWI/OiBYcm0uQ29udHJvbHMuVGFiO1xuICAgIFNlY3Rpb246IFNlY3Rpb25zO1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2VjdGlvbj86IFNlY3Rpb25zKSB7XG4gICAgICB0aGlzLk5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5TZWN0aW9uID0gc2VjdGlvbjtcbiAgICAgIGZvciAobGV0IGtleSBpbiBzZWN0aW9uKSB7XG4gICAgICAgIHNlY3Rpb25ba2V5XS5wYXJlbnRUYWIgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWN0aW9uczogWHJtLkNvbGxlY3Rpb24uSXRlbUNvbGxlY3Rpb248WHJtLkNvbnRyb2xzLlNlY3Rpb24+O1xuXG4gICAgcHVibGljIGdldCBUYWIoKTogWHJtLkNvbnRyb2xzLlRhYiB7XG4gICAgICByZXR1cm4gKHRoaXMuX3RhYiA/Pz1cbiAgICAgICAgRm9ybS5mb3JtQ29udGV4dC51aS50YWJzLmdldCh0aGlzLk5hbWUpID8/XG4gICAgICAgIFhybUV4LnRocm93RXJyb3IoYFRoZSB0YWIgJyR7dGhpcy5OYW1lfScgd2FzIG5vdCBmb3VuZCBvbiB0aGUgZm9ybS5gKSk7XG4gICAgfVxuICAgIGFkZFRhYlN0YXRlQ2hhbmdlKGhhbmRsZXI6IFhybS5FdmVudHMuQ29udGV4dFNlbnNpdGl2ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5hZGRUYWJTdGF0ZUNoYW5nZShoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0RGlzcGxheVN0YXRlKCk6IFhybS5EaXNwbGF5U3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldERpc3BsYXlTdGF0ZSgpO1xuICAgIH1cbiAgICBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBnZXRQYXJlbnQoKTogWHJtLlVpIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgcmVtb3ZlVGFiU3RhdGVDaGFuZ2UoaGFuZGxlcjogWHJtLkV2ZW50cy5Db250ZXh0U2Vuc2l0aXZlSGFuZGxlcik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnJlbW92ZVRhYlN0YXRlQ2hhbmdlKGhhbmRsZXIpO1xuICAgIH1cbiAgICBzZXREaXNwbGF5U3RhdGUoZGlzcGxheVN0YXRlOiBYcm0uRGlzcGxheVN0YXRlKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuc2V0RGlzcGxheVN0YXRlKGRpc3BsYXlTdGF0ZSk7XG4gICAgfVxuICAgIHNldFZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICAgIGdldFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5UYWIuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLmdldExhYmVsKCk7XG4gICAgfVxuICAgIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLlRhYi5zZXRMYWJlbChsYWJlbCk7XG4gICAgfVxuICAgIHNldEZvY3VzKCk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuVGFiLnNldEZvY3VzKCk7XG4gICAgfVxuICB9XG4gIGV4cG9ydCBjbGFzcyBHcmlkQ29udHJvbCBpbXBsZW1lbnRzIFhybS5Db250cm9scy5HcmlkQ29udHJvbCB7XG4gICAgcHVibGljIHJlYWRvbmx5IE5hbWUhOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ncmlkQ29udHJvbD86IFhybS5Db250cm9scy5HcmlkQ29udHJvbDtcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgR3JpZENvbnRyb2woKTogWHJtLkNvbnRyb2xzLkdyaWRDb250cm9sIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0aGlzLl9ncmlkQ29udHJvbCA/Pz1cbiAgICAgICAgICBGb3JtLmZvcm1Db250ZXh0LmdldENvbnRyb2w8WHJtLkNvbnRyb2xzLkdyaWRDb250cm9sPih0aGlzLk5hbWUpKSA/P1xuICAgICAgICBYcm1FeC50aHJvd0Vycm9yKGBUaGUgZ3JpZCAnJHt0aGlzLk5hbWV9JyB3YXMgbm90IGZvdW5kIG9uIHRoZSBmb3JtLmApXG4gICAgICApO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBhZGRPbkxvYWQoaGFuZGxlcjogWHJtLkV2ZW50cy5HcmlkQ29udHJvbC5Mb2FkRXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5hZGRPbkxvYWQoaGFuZGxlcik7XG4gICAgfVxuICAgIGdldENvbnRleHRUeXBlKCk6IFhybUVudW0uR3JpZENvbnRyb2xDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRleHRUeXBlKCk7XG4gICAgfVxuICAgIGdldEVudGl0eU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEVudGl0eU5hbWUoKTtcbiAgICB9XG4gICAgZ2V0RmV0Y2hYbWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldEZldGNoWG1sKCk7XG4gICAgfVxuICAgIGdldEdyaWQoKTogWHJtLkNvbnRyb2xzLkdyaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0R3JpZCgpO1xuICAgIH1cbiAgICBnZXRSZWxhdGlvbnNoaXAoKTogWHJtLkNvbnRyb2xzLkdyaWRSZWxhdGlvbnNoaXAge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0UmVsYXRpb25zaGlwKCk7XG4gICAgfVxuICAgIGdldFVybChjbGllbnQ/OiBYcm1FbnVtLkdyaWRDbGllbnQpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VXJsKGNsaWVudCk7XG4gICAgfVxuICAgIGdldFZpZXdTZWxlY3RvcigpOiBYcm0uQ29udHJvbHMuVmlld1NlbGVjdG9yIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFZpZXdTZWxlY3RvcigpO1xuICAgIH1cbiAgICBvcGVuUmVsYXRlZEdyaWQoKTogdm9pZCB7XG4gICAgICByZXR1cm4gdGhpcy5HcmlkQ29udHJvbC5vcGVuUmVsYXRlZEdyaWQoKTtcbiAgICB9XG4gICAgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2goKTtcbiAgICB9XG4gICAgcmVmcmVzaFJpYmJvbigpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlZnJlc2hSaWJib24oKTtcbiAgICB9XG4gICAgcmVtb3ZlT25Mb2FkKGhhbmRsZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnJlbW92ZU9uTG9hZChoYW5kbGVyKTtcbiAgICB9XG4gICAgZ2V0Q29udHJvbFR5cGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldENvbnRyb2xUeXBlKCk7XG4gICAgfVxuICAgIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldE5hbWUoKTtcbiAgICB9XG4gICAgZ2V0UGFyZW50KCk6IFhybS5Db250cm9scy5TZWN0aW9uIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLmdldFBhcmVudCgpO1xuICAgIH1cbiAgICBnZXRMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0TGFiZWwoKTtcbiAgICB9XG4gICAgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuc2V0TGFiZWwobGFiZWwpO1xuICAgIH1cbiAgICBnZXRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuR3JpZENvbnRyb2wuZ2V0VmlzaWJsZSgpO1xuICAgIH1cbiAgICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHJldHVybiB0aGlzLkdyaWRDb250cm9sLnNldFZpc2libGUodmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/docs/classes/XrmEx.BooleanField.md b/docs/classes/XrmEx.BooleanField.md index 14135e2..a389e4e 100644 --- a/docs/classes/XrmEx.BooleanField.md +++ b/docs/classes/XrmEx.BooleanField.md @@ -78,7 +78,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:915](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L915) +[XrmEx.ts:915](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L915) ## Properties @@ -92,7 +92,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -106,7 +106,7 @@ ___ #### Defined in -[XrmEx.ts:914](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L914) +[XrmEx.ts:914](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L914) ___ @@ -120,7 +120,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -138,7 +138,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:924](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L924) +[XrmEx.ts:924](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L924) ___ @@ -160,7 +160,7 @@ Field.Value #### Defined in -[XrmEx.ts:932](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L932) +[XrmEx.ts:932](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L932) • `set` **Value**(`value`): `void` @@ -180,7 +180,7 @@ Field.Value #### Defined in -[XrmEx.ts:935](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L935) +[XrmEx.ts:935](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L935) ___ @@ -202,7 +202,7 @@ Field.controls #### Defined in -[XrmEx.ts:929](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L929) +[XrmEx.ts:929](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L929) ## Methods @@ -231,7 +231,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -261,7 +261,7 @@ Xrm.Attributes.BooleanAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -285,7 +285,7 @@ Xrm.Attributes.BooleanAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -307,7 +307,7 @@ Xrm.Attributes.BooleanAttribute.getAttributeType #### Defined in -[XrmEx.ts:918](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L918) +[XrmEx.ts:918](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L918) ___ @@ -329,7 +329,7 @@ Xrm.Attributes.BooleanAttribute.getFormat #### Defined in -[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603) +[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603) ___ @@ -347,7 +347,7 @@ Xrm.Attributes.BooleanAttribute.getInitialValue #### Defined in -[XrmEx.ts:921](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L921) +[XrmEx.ts:921](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L921) ___ @@ -369,7 +369,7 @@ Xrm.Attributes.BooleanAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -391,7 +391,7 @@ Xrm.Attributes.BooleanAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -413,7 +413,7 @@ Xrm.Attributes.BooleanAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -435,7 +435,7 @@ Xrm.Attributes.BooleanAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -457,7 +457,7 @@ Xrm.Attributes.BooleanAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -479,7 +479,7 @@ Xrm.Attributes.BooleanAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -501,7 +501,7 @@ Xrm.Attributes.BooleanAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -533,7 +533,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -561,7 +561,7 @@ Xrm.Attributes.BooleanAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -587,7 +587,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -616,7 +616,7 @@ Xrm.Attributes.BooleanAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -650,7 +650,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -676,7 +676,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -706,7 +706,7 @@ Xrm.Attributes.BooleanAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -734,7 +734,7 @@ Xrm.Attributes.BooleanAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -762,7 +762,7 @@ Xrm.Attributes.BooleanAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -788,4 +788,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.DateField.md b/docs/classes/XrmEx.DateField.md index cf51d7c..960dce0 100644 --- a/docs/classes/XrmEx.DateField.md +++ b/docs/classes/XrmEx.DateField.md @@ -77,7 +77,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:889](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L889) +[XrmEx.ts:889](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L889) ## Properties @@ -91,7 +91,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -105,7 +105,7 @@ ___ #### Defined in -[XrmEx.ts:888](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L888) +[XrmEx.ts:888](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L888) ___ @@ -119,7 +119,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -137,7 +137,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:895](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L895) +[XrmEx.ts:895](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L895) ___ @@ -159,7 +159,7 @@ Field.Value #### Defined in -[XrmEx.ts:903](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L903) +[XrmEx.ts:903](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L903) • `set` **Value**(`value`): `void` @@ -179,7 +179,7 @@ Field.Value #### Defined in -[XrmEx.ts:906](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L906) +[XrmEx.ts:906](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L906) ___ @@ -201,7 +201,7 @@ Field.controls #### Defined in -[XrmEx.ts:900](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L900) +[XrmEx.ts:900](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L900) ## Methods @@ -230,7 +230,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -260,7 +260,7 @@ Xrm.Attributes.DateAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -284,7 +284,7 @@ Xrm.Attributes.DateAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -306,7 +306,7 @@ Xrm.Attributes.DateAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -328,7 +328,7 @@ Xrm.Attributes.DateAttribute.getFormat #### Defined in -[XrmEx.ts:892](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L892) +[XrmEx.ts:892](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L892) ___ @@ -350,7 +350,7 @@ Xrm.Attributes.DateAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -372,7 +372,7 @@ Xrm.Attributes.DateAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -394,7 +394,7 @@ Xrm.Attributes.DateAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -416,7 +416,7 @@ Xrm.Attributes.DateAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -438,7 +438,7 @@ Xrm.Attributes.DateAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -460,7 +460,7 @@ Xrm.Attributes.DateAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -482,7 +482,7 @@ Xrm.Attributes.DateAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -514,7 +514,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -542,7 +542,7 @@ Xrm.Attributes.DateAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -568,7 +568,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -597,7 +597,7 @@ Xrm.Attributes.DateAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -631,7 +631,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -657,7 +657,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -687,7 +687,7 @@ Xrm.Attributes.DateAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -715,7 +715,7 @@ Xrm.Attributes.DateAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -743,7 +743,7 @@ Xrm.Attributes.DateAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -769,4 +769,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.Field.md b/docs/classes/XrmEx.Field.md index b89bb2d..1c9f2c5 100644 --- a/docs/classes/XrmEx.Field.md +++ b/docs/classes/XrmEx.Field.md @@ -85,7 +85,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:587](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L587) +[XrmEx.ts:587](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L587) ## Properties @@ -95,7 +95,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -105,7 +105,7 @@ ___ #### Defined in -[XrmEx.ts:585](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L585) +[XrmEx.ts:585](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L585) ___ @@ -115,7 +115,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -129,7 +129,7 @@ ___ #### Defined in -[XrmEx.ts:637](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L637) +[XrmEx.ts:637](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L637) ___ @@ -147,7 +147,7 @@ The value. #### Defined in -[XrmEx.ts:653](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L653) +[XrmEx.ts:653](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L653) • `set` **Value**(`value`): `void` @@ -163,7 +163,7 @@ The value. #### Defined in -[XrmEx.ts:657](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L657) +[XrmEx.ts:657](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L657) ___ @@ -181,7 +181,7 @@ Xrm.Attributes.Attribute.controls #### Defined in -[XrmEx.ts:645](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L645) +[XrmEx.ts:645](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L645) ## Methods @@ -206,7 +206,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -232,7 +232,7 @@ Xrm.Attributes.Attribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -252,7 +252,7 @@ Xrm.Attributes.Attribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -270,7 +270,7 @@ Xrm.Attributes.Attribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -288,7 +288,7 @@ Xrm.Attributes.Attribute.getFormat #### Defined in -[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603) +[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603) ___ @@ -306,7 +306,7 @@ Xrm.Attributes.Attribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -324,7 +324,7 @@ Xrm.Attributes.Attribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -342,7 +342,7 @@ Xrm.Attributes.Attribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -360,7 +360,7 @@ Xrm.Attributes.Attribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -378,7 +378,7 @@ Xrm.Attributes.Attribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -396,7 +396,7 @@ Xrm.Attributes.Attribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -414,7 +414,7 @@ Xrm.Attributes.Attribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -442,7 +442,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -466,7 +466,7 @@ Xrm.Attributes.Attribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -488,7 +488,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -513,7 +513,7 @@ Xrm.Attributes.Attribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -543,7 +543,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -565,7 +565,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -591,7 +591,7 @@ Xrm.Attributes.Attribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -615,7 +615,7 @@ Xrm.Attributes.Attribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -639,7 +639,7 @@ Xrm.Attributes.Attribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -661,4 +661,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.Form.md b/docs/classes/XrmEx.Form.md index b175c18..412db2b 100644 --- a/docs/classes/XrmEx.Form.md +++ b/docs/classes/XrmEx.Form.md @@ -44,7 +44,7 @@ Represents a form in Dynamics 365. #### Defined in -[XrmEx.ts:384](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L384) +[XrmEx.ts:384](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L384) ## Properties @@ -54,7 +54,7 @@ Represents a form in Dynamics 365. #### Defined in -[XrmEx.ts:383](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L383) +[XrmEx.ts:383](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L383) ___ @@ -64,7 +64,7 @@ ___ #### Defined in -[XrmEx.ts:382](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L382) +[XrmEx.ts:382](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L382) ## Accessors @@ -80,7 +80,7 @@ Returns true if form is from type create #### Defined in -[XrmEx.ts:422](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L422) +[XrmEx.ts:422](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L422) ___ @@ -96,7 +96,7 @@ Returns true if form is not from type create #### Defined in -[XrmEx.ts:430](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L430) +[XrmEx.ts:430](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L430) ___ @@ -112,7 +112,7 @@ Returns true if form is not from type update #### Defined in -[XrmEx.ts:434](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L434) +[XrmEx.ts:434](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L434) ___ @@ -128,7 +128,7 @@ Returns true if form is from type update #### Defined in -[XrmEx.ts:426](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L426) +[XrmEx.ts:426](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L426) ___ @@ -144,7 +144,7 @@ Gets a lookup value that references the record. #### Defined in -[XrmEx.ts:394](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L394) +[XrmEx.ts:394](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L394) ___ @@ -160,7 +160,7 @@ Gets a reference to the current executio context #### Defined in -[XrmEx.ts:390](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L390) +[XrmEx.ts:390](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L390) • `Static` `set` **executionContext**(`context`): `void` @@ -178,7 +178,7 @@ Sets a reference to the current execution context #### Defined in -[XrmEx.ts:409](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L409) +[XrmEx.ts:409](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L409) ___ @@ -194,7 +194,7 @@ Gets a reference to the current form context #### Defined in -[XrmEx.ts:386](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L386) +[XrmEx.ts:386](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L386) • `Static` `set` **formContext**(`context`): `void` @@ -212,7 +212,7 @@ Sets a reference to the current form context #### Defined in -[XrmEx.ts:398](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L398) +[XrmEx.ts:398](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L398) ## Methods @@ -239,7 +239,7 @@ true if it succeeds, otherwise false. #### Defined in -[XrmEx.ts:448](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L448) +[XrmEx.ts:448](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L448) ___ @@ -263,7 +263,7 @@ Adds a handler to be called when the attribute's value is changed. #### Defined in -[XrmEx.ts:549](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L549) +[XrmEx.ts:549](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L549) ___ @@ -285,7 +285,7 @@ Adds a function to be called when form data is loaded. #### Defined in -[XrmEx.ts:526](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L526) +[XrmEx.ts:526](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L526) ___ @@ -315,7 +315,7 @@ Added in 9.2 #### Defined in -[XrmEx.ts:503](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L503) +[XrmEx.ts:503](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L503) ___ @@ -337,7 +337,7 @@ Adds a handler to be called when the record is saved. #### Defined in -[XrmEx.ts:478](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L478) +[XrmEx.ts:478](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L478) ___ @@ -361,4 +361,4 @@ True if it succeeds, otherwise false. #### Defined in -[XrmEx.ts:468](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L468) +[XrmEx.ts:468](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L468) diff --git a/docs/classes/XrmEx.GridControl.md b/docs/classes/XrmEx.GridControl.md index 79a7906..950daf4 100644 --- a/docs/classes/XrmEx.GridControl.md +++ b/docs/classes/XrmEx.GridControl.md @@ -60,7 +60,7 @@ #### Defined in -[XrmEx.ts:1392](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1392) +[XrmEx.ts:1392](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1392) ## Properties @@ -70,7 +70,7 @@ #### Defined in -[XrmEx.ts:1390](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1390) +[XrmEx.ts:1390](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1390) ___ @@ -80,7 +80,7 @@ ___ #### Defined in -[XrmEx.ts:1391](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1391) +[XrmEx.ts:1391](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1391) ## Accessors @@ -94,7 +94,7 @@ ___ #### Defined in -[XrmEx.ts:1402](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1402) +[XrmEx.ts:1402](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1402) ___ @@ -108,7 +108,7 @@ ___ #### Defined in -[XrmEx.ts:1395](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1395) +[XrmEx.ts:1395](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1395) ## Methods @@ -132,7 +132,7 @@ Xrm.Controls.GridControl.addOnLoad #### Defined in -[XrmEx.ts:1405](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1405) +[XrmEx.ts:1405](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1405) ___ @@ -150,7 +150,7 @@ Xrm.Controls.GridControl.getContextType #### Defined in -[XrmEx.ts:1408](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1408) +[XrmEx.ts:1408](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1408) ___ @@ -168,7 +168,7 @@ Xrm.Controls.GridControl.getControlType #### Defined in -[XrmEx.ts:1441](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1441) +[XrmEx.ts:1441](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1441) ___ @@ -186,7 +186,7 @@ Xrm.Controls.GridControl.getEntityName #### Defined in -[XrmEx.ts:1411](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1411) +[XrmEx.ts:1411](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1411) ___ @@ -204,7 +204,7 @@ Xrm.Controls.GridControl.getFetchXml #### Defined in -[XrmEx.ts:1414](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1414) +[XrmEx.ts:1414](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1414) ___ @@ -222,7 +222,7 @@ Xrm.Controls.GridControl.getGrid #### Defined in -[XrmEx.ts:1417](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1417) +[XrmEx.ts:1417](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1417) ___ @@ -240,7 +240,7 @@ Xrm.Controls.GridControl.getLabel #### Defined in -[XrmEx.ts:1450](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1450) +[XrmEx.ts:1450](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1450) ___ @@ -258,7 +258,7 @@ Xrm.Controls.GridControl.getName #### Defined in -[XrmEx.ts:1444](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1444) +[XrmEx.ts:1444](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1444) ___ @@ -276,7 +276,7 @@ Xrm.Controls.GridControl.getParent #### Defined in -[XrmEx.ts:1447](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1447) +[XrmEx.ts:1447](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1447) ___ @@ -294,7 +294,7 @@ Xrm.Controls.GridControl.getRelationship #### Defined in -[XrmEx.ts:1420](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1420) +[XrmEx.ts:1420](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1420) ___ @@ -318,7 +318,7 @@ Xrm.Controls.GridControl.getUrl #### Defined in -[XrmEx.ts:1423](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1423) +[XrmEx.ts:1423](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1423) ___ @@ -336,7 +336,7 @@ Xrm.Controls.GridControl.getViewSelector #### Defined in -[XrmEx.ts:1426](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1426) +[XrmEx.ts:1426](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1426) ___ @@ -354,7 +354,7 @@ Xrm.Controls.GridControl.getVisible #### Defined in -[XrmEx.ts:1456](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1456) +[XrmEx.ts:1456](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1456) ___ @@ -372,7 +372,7 @@ Xrm.Controls.GridControl.openRelatedGrid #### Defined in -[XrmEx.ts:1429](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1429) +[XrmEx.ts:1429](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1429) ___ @@ -390,7 +390,7 @@ Xrm.Controls.GridControl.refresh #### Defined in -[XrmEx.ts:1432](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1432) +[XrmEx.ts:1432](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1432) ___ @@ -408,7 +408,7 @@ Xrm.Controls.GridControl.refreshRibbon #### Defined in -[XrmEx.ts:1435](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1435) +[XrmEx.ts:1435](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1435) ___ @@ -432,7 +432,7 @@ Xrm.Controls.GridControl.removeOnLoad #### Defined in -[XrmEx.ts:1438](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1438) +[XrmEx.ts:1438](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1438) ___ @@ -456,7 +456,7 @@ Xrm.Controls.GridControl.setLabel #### Defined in -[XrmEx.ts:1453](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1453) +[XrmEx.ts:1453](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1453) ___ @@ -480,4 +480,4 @@ Xrm.Controls.GridControl.setVisible #### Defined in -[XrmEx.ts:1459](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1459) +[XrmEx.ts:1459](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1459) diff --git a/docs/classes/XrmEx.LookupField.md b/docs/classes/XrmEx.LookupField.md index f9c773c..7ae4103 100644 --- a/docs/classes/XrmEx.LookupField.md +++ b/docs/classes/XrmEx.LookupField.md @@ -87,7 +87,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:999](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L999) +[XrmEx.ts:999](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L999) ## Properties @@ -101,7 +101,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -115,7 +115,7 @@ ___ #### Defined in -[XrmEx.ts:997](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L997) +[XrmEx.ts:997](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L997) ___ @@ -125,7 +125,7 @@ ___ #### Defined in -[XrmEx.ts:998](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L998) +[XrmEx.ts:998](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L998) ___ @@ -139,7 +139,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -157,7 +157,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:1005](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1005) +[XrmEx.ts:1005](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1005) ___ @@ -173,7 +173,7 @@ Gets the entityType of the first lookup value #### Defined in -[XrmEx.ts:1020](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1020) +[XrmEx.ts:1020](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1020) ___ @@ -189,7 +189,7 @@ Gets the formatted value of the first lookup value #### Defined in -[XrmEx.ts:1026](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1026) +[XrmEx.ts:1026](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1026) ___ @@ -205,7 +205,7 @@ Gets the id of the first lookup value #### Defined in -[XrmEx.ts:1014](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1014) +[XrmEx.ts:1014](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1014) ___ @@ -227,7 +227,7 @@ Field.Value #### Defined in -[XrmEx.ts:1029](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1029) +[XrmEx.ts:1029](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1029) • `set` **Value**(`value`): `void` @@ -247,7 +247,7 @@ Field.Value #### Defined in -[XrmEx.ts:1032](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1032) +[XrmEx.ts:1032](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1032) ___ @@ -269,7 +269,7 @@ Field.controls #### Defined in -[XrmEx.ts:1010](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1010) +[XrmEx.ts:1010](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1010) ## Methods @@ -298,7 +298,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -328,7 +328,7 @@ Xrm.Attributes.LookupAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -364,7 +364,7 @@ Example filter: #### Defined in -[XrmEx.ts:1105](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1105) +[XrmEx.ts:1105](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1105) ___ @@ -405,7 +405,7 @@ Example fetchXml: #### Defined in -[XrmEx.ts:1138](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1138) +[XrmEx.ts:1138](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1138) ___ @@ -421,7 +421,7 @@ Removes all filters set on the current lookup attribute by using addPreFilterToL #### Defined in -[XrmEx.ts:1173](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1173) +[XrmEx.ts:1173](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1173) ___ @@ -445,7 +445,7 @@ Xrm.Attributes.LookupAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -467,7 +467,7 @@ Xrm.Attributes.LookupAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -489,7 +489,7 @@ Xrm.Attributes.LookupAttribute.getFormat #### Defined in -[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L603) +[XrmEx.ts:603](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L603) ___ @@ -511,7 +511,7 @@ Xrm.Attributes.LookupAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -529,7 +529,7 @@ Xrm.Attributes.LookupAttribute.getIsPartyList #### Defined in -[XrmEx.ts:1002](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1002) +[XrmEx.ts:1002](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1002) ___ @@ -551,7 +551,7 @@ Xrm.Attributes.LookupAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -573,7 +573,7 @@ Xrm.Attributes.LookupAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -595,7 +595,7 @@ Xrm.Attributes.LookupAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -617,7 +617,7 @@ Xrm.Attributes.LookupAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -639,7 +639,7 @@ Xrm.Attributes.LookupAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -661,7 +661,7 @@ Xrm.Attributes.LookupAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -693,7 +693,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -721,7 +721,7 @@ Xrm.Attributes.LookupAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -756,7 +756,7 @@ On success, returns a promise containing a JSON object with the retrieved attrib #### Defined in -[XrmEx.ts:1082](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1082) +[XrmEx.ts:1082](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1082) ___ @@ -782,7 +782,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -811,7 +811,7 @@ Xrm.Attributes.LookupAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -836,7 +836,7 @@ Sets the value of a lookup #### Defined in -[XrmEx.ts:1042](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1042) +[XrmEx.ts:1042](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1042) ___ @@ -870,7 +870,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -896,7 +896,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -926,7 +926,7 @@ Xrm.Attributes.LookupAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -954,7 +954,7 @@ Xrm.Attributes.LookupAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -982,7 +982,7 @@ Xrm.Attributes.LookupAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -1008,4 +1008,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.MultiSelectOptionSetField.md b/docs/classes/XrmEx.MultiSelectOptionSetField.md index a556be3..56c4893 100644 --- a/docs/classes/XrmEx.MultiSelectOptionSetField.md +++ b/docs/classes/XrmEx.MultiSelectOptionSetField.md @@ -96,7 +96,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:945](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L945) +[XrmEx.ts:945](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L945) ## Properties @@ -110,7 +110,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -120,7 +120,7 @@ ___ #### Defined in -[XrmEx.ts:944](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L944) +[XrmEx.ts:944](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L944) ___ @@ -134,7 +134,7 @@ ___ #### Defined in -[XrmEx.ts:943](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L943) +[XrmEx.ts:943](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L943) ___ @@ -148,7 +148,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -166,7 +166,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:971](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L971) +[XrmEx.ts:971](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L971) ___ @@ -188,7 +188,7 @@ Field.Value #### Defined in -[XrmEx.ts:979](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L979) +[XrmEx.ts:979](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L979) • `set` **Value**(`value`): `void` @@ -208,7 +208,7 @@ Field.Value #### Defined in -[XrmEx.ts:982](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L982) +[XrmEx.ts:982](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L982) ___ @@ -230,7 +230,7 @@ Field.controls #### Defined in -[XrmEx.ts:976](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L976) +[XrmEx.ts:976](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L976) ## Methods @@ -259,7 +259,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -289,7 +289,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -313,7 +313,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -335,7 +335,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -357,7 +357,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getFormat #### Defined in -[XrmEx.ts:949](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L949) +[XrmEx.ts:949](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L949) ___ @@ -375,7 +375,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getInitialValue #### Defined in -[XrmEx.ts:968](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L968) +[XrmEx.ts:968](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L968) ___ @@ -397,7 +397,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -419,7 +419,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -443,7 +443,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getOption #### Defined in -[XrmEx.ts:952](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L952) +[XrmEx.ts:952](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L952) ___ @@ -461,7 +461,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getOptions #### Defined in -[XrmEx.ts:959](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L959) +[XrmEx.ts:959](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L959) ___ @@ -483,7 +483,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -505,7 +505,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -523,7 +523,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getSelectedOption #### Defined in -[XrmEx.ts:962](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L962) +[XrmEx.ts:962](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L962) ___ @@ -545,7 +545,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -563,7 +563,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getText #### Defined in -[XrmEx.ts:965](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L965) +[XrmEx.ts:965](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L965) ___ @@ -585,7 +585,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -607,7 +607,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -639,7 +639,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -667,7 +667,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -693,7 +693,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -722,7 +722,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -756,7 +756,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -782,7 +782,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -812,7 +812,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -840,7 +840,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -868,7 +868,7 @@ Xrm.Attributes.MultiSelectOptionSetAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -894,4 +894,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.NumberField.md b/docs/classes/XrmEx.NumberField.md index 405d029..1555897 100644 --- a/docs/classes/XrmEx.NumberField.md +++ b/docs/classes/XrmEx.NumberField.md @@ -81,7 +81,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:854](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L854) +[XrmEx.ts:854](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L854) ## Properties @@ -95,7 +95,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -109,7 +109,7 @@ ___ #### Defined in -[XrmEx.ts:853](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L853) +[XrmEx.ts:853](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L853) ___ @@ -123,7 +123,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -141,7 +141,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:872](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L872) +[XrmEx.ts:872](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L872) ___ @@ -163,7 +163,7 @@ Field.Value #### Defined in -[XrmEx.ts:880](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L880) +[XrmEx.ts:880](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L880) • `set` **Value**(`value`): `void` @@ -183,7 +183,7 @@ Field.Value #### Defined in -[XrmEx.ts:883](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L883) +[XrmEx.ts:883](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L883) ___ @@ -205,7 +205,7 @@ Field.controls #### Defined in -[XrmEx.ts:877](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L877) +[XrmEx.ts:877](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L877) ## Methods @@ -234,7 +234,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -264,7 +264,7 @@ Xrm.Attributes.NumberAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -288,7 +288,7 @@ Xrm.Attributes.NumberAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -310,7 +310,7 @@ Xrm.Attributes.NumberAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -332,7 +332,7 @@ Xrm.Attributes.NumberAttribute.getFormat #### Defined in -[XrmEx.ts:857](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L857) +[XrmEx.ts:857](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L857) ___ @@ -354,7 +354,7 @@ Xrm.Attributes.NumberAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -372,7 +372,7 @@ Xrm.Attributes.NumberAttribute.getMax #### Defined in -[XrmEx.ts:860](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L860) +[XrmEx.ts:860](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L860) ___ @@ -390,7 +390,7 @@ Xrm.Attributes.NumberAttribute.getMin #### Defined in -[XrmEx.ts:863](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L863) +[XrmEx.ts:863](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L863) ___ @@ -412,7 +412,7 @@ Xrm.Attributes.NumberAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -434,7 +434,7 @@ Xrm.Attributes.NumberAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -452,7 +452,7 @@ Xrm.Attributes.NumberAttribute.getPrecision #### Defined in -[XrmEx.ts:866](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L866) +[XrmEx.ts:866](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L866) ___ @@ -474,7 +474,7 @@ Xrm.Attributes.NumberAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -496,7 +496,7 @@ Xrm.Attributes.NumberAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -518,7 +518,7 @@ Xrm.Attributes.NumberAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -540,7 +540,7 @@ Xrm.Attributes.NumberAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -572,7 +572,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -600,7 +600,7 @@ Xrm.Attributes.NumberAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -626,7 +626,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -655,7 +655,7 @@ Xrm.Attributes.NumberAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -689,7 +689,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -713,7 +713,7 @@ Xrm.Attributes.NumberAttribute.setPrecision #### Defined in -[XrmEx.ts:869](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L869) +[XrmEx.ts:869](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L869) ___ @@ -739,7 +739,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -769,7 +769,7 @@ Xrm.Attributes.NumberAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -797,7 +797,7 @@ Xrm.Attributes.NumberAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -825,7 +825,7 @@ Xrm.Attributes.NumberAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -851,4 +851,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.OptionsetField.md b/docs/classes/XrmEx.OptionsetField.md index 7f49a42..9f9cf0e 100644 --- a/docs/classes/XrmEx.OptionsetField.md +++ b/docs/classes/XrmEx.OptionsetField.md @@ -101,7 +101,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:1198](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1198) +[XrmEx.ts:1198](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1198) ## Properties @@ -115,7 +115,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -125,7 +125,7 @@ ___ #### Defined in -[XrmEx.ts:1197](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1197) +[XrmEx.ts:1197](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1197) ___ @@ -139,7 +139,7 @@ ___ #### Defined in -[XrmEx.ts:1195](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1195) +[XrmEx.ts:1195](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1195) ___ @@ -149,7 +149,7 @@ ___ #### Defined in -[XrmEx.ts:1196](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1196) +[XrmEx.ts:1196](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1196) ___ @@ -163,7 +163,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -181,7 +181,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:1224](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1224) +[XrmEx.ts:1224](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1224) ___ @@ -203,7 +203,7 @@ Field.Value #### Defined in -[XrmEx.ts:1237](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1237) +[XrmEx.ts:1237](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1237) • `set` **Value**(`value`): `void` @@ -223,7 +223,7 @@ Field.Value #### Defined in -[XrmEx.ts:1240](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1240) +[XrmEx.ts:1240](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1240) ___ @@ -237,7 +237,7 @@ ___ #### Defined in -[XrmEx.ts:1232](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1232) +[XrmEx.ts:1232](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1232) ___ @@ -259,7 +259,7 @@ Field.controls #### Defined in -[XrmEx.ts:1229](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1229) +[XrmEx.ts:1229](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1229) ## Methods @@ -288,7 +288,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -318,7 +318,7 @@ Xrm.Attributes.OptionSetAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -346,7 +346,7 @@ This method does not check that the values within the options you add are valid. #### Defined in -[XrmEx.ts:1253](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1253) +[XrmEx.ts:1253](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1253) ___ @@ -362,7 +362,7 @@ Clears all options. #### Defined in -[XrmEx.ts:1291](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1291) +[XrmEx.ts:1291](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1291) ___ @@ -386,7 +386,7 @@ Xrm.Attributes.OptionSetAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -408,7 +408,7 @@ Xrm.Attributes.OptionSetAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -430,7 +430,7 @@ Xrm.Attributes.OptionSetAttribute.getFormat #### Defined in -[XrmEx.ts:1202](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1202) +[XrmEx.ts:1202](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1202) ___ @@ -448,7 +448,7 @@ Xrm.Attributes.OptionSetAttribute.getInitialValue #### Defined in -[XrmEx.ts:1221](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1221) +[XrmEx.ts:1221](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1221) ___ @@ -470,7 +470,7 @@ Xrm.Attributes.OptionSetAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -492,7 +492,7 @@ Xrm.Attributes.OptionSetAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -516,7 +516,7 @@ Xrm.Attributes.OptionSetAttribute.getOption #### Defined in -[XrmEx.ts:1205](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1205) +[XrmEx.ts:1205](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1205) ___ @@ -534,7 +534,7 @@ Xrm.Attributes.OptionSetAttribute.getOptions #### Defined in -[XrmEx.ts:1212](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1212) +[XrmEx.ts:1212](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1212) ___ @@ -556,7 +556,7 @@ Xrm.Attributes.OptionSetAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -578,7 +578,7 @@ Xrm.Attributes.OptionSetAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -596,7 +596,7 @@ Xrm.Attributes.OptionSetAttribute.getSelectedOption #### Defined in -[XrmEx.ts:1215](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1215) +[XrmEx.ts:1215](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1215) ___ @@ -618,7 +618,7 @@ Xrm.Attributes.OptionSetAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -636,7 +636,7 @@ Xrm.Attributes.OptionSetAttribute.getText #### Defined in -[XrmEx.ts:1218](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1218) +[XrmEx.ts:1218](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1218) ___ @@ -658,7 +658,7 @@ Xrm.Attributes.OptionSetAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -680,7 +680,7 @@ Xrm.Attributes.OptionSetAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -712,7 +712,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -740,7 +740,7 @@ Xrm.Attributes.OptionSetAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -762,7 +762,7 @@ Removes the option matching the value. #### Defined in -[XrmEx.ts:1273](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1273) +[XrmEx.ts:1273](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1273) ___ @@ -788,7 +788,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -817,7 +817,7 @@ Xrm.Attributes.OptionSetAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -851,7 +851,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -877,7 +877,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -907,7 +907,7 @@ Xrm.Attributes.OptionSetAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -935,7 +935,7 @@ Xrm.Attributes.OptionSetAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -963,7 +963,7 @@ Xrm.Attributes.OptionSetAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -989,4 +989,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/classes/XrmEx.Section.md b/docs/classes/XrmEx.Section.md index 891ca76..c7c8557 100644 --- a/docs/classes/XrmEx.Section.md +++ b/docs/classes/XrmEx.Section.md @@ -48,7 +48,7 @@ #### Defined in -[XrmEx.ts:1304](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1304) +[XrmEx.ts:1304](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1304) ## Properties @@ -58,7 +58,7 @@ #### Defined in -[XrmEx.ts:1301](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1301) +[XrmEx.ts:1301](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1301) ___ @@ -68,7 +68,7 @@ ___ #### Defined in -[XrmEx.ts:1302](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1302) +[XrmEx.ts:1302](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1302) ___ @@ -82,7 +82,7 @@ Xrm.Controls.Section.controls #### Defined in -[XrmEx.ts:1320](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1320) +[XrmEx.ts:1320](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1320) ___ @@ -92,7 +92,7 @@ ___ #### Defined in -[XrmEx.ts:1303](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1303) +[XrmEx.ts:1303](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1303) ## Accessors @@ -106,7 +106,7 @@ ___ #### Defined in -[XrmEx.ts:1307](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1307) +[XrmEx.ts:1307](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1307) ## Methods @@ -124,7 +124,7 @@ Xrm.Controls.Section.getLabel #### Defined in -[XrmEx.ts:1327](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1327) +[XrmEx.ts:1327](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1327) ___ @@ -142,7 +142,7 @@ Xrm.Controls.Section.getName #### Defined in -[XrmEx.ts:1314](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1314) +[XrmEx.ts:1314](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1314) ___ @@ -160,7 +160,7 @@ Xrm.Controls.Section.getParent #### Defined in -[XrmEx.ts:1317](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1317) +[XrmEx.ts:1317](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1317) ___ @@ -178,7 +178,7 @@ Xrm.Controls.Section.getVisible #### Defined in -[XrmEx.ts:1324](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1324) +[XrmEx.ts:1324](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1324) ___ @@ -202,7 +202,7 @@ Xrm.Controls.Section.setLabel #### Defined in -[XrmEx.ts:1330](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1330) +[XrmEx.ts:1330](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1330) ___ @@ -226,4 +226,4 @@ Xrm.Controls.Section.setVisible #### Defined in -[XrmEx.ts:1321](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1321) +[XrmEx.ts:1321](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1321) diff --git a/docs/classes/XrmEx.Tab.md b/docs/classes/XrmEx.Tab.md index cf399a0..a95d685 100644 --- a/docs/classes/XrmEx.Tab.md +++ b/docs/classes/XrmEx.Tab.md @@ -66,7 +66,7 @@ #### Defined in -[XrmEx.ts:1341](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1341) +[XrmEx.ts:1341](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1341) ## Properties @@ -76,7 +76,7 @@ #### Defined in -[XrmEx.ts:1338](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1338) +[XrmEx.ts:1338](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1338) ___ @@ -86,7 +86,7 @@ ___ #### Defined in -[XrmEx.ts:1340](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1340) +[XrmEx.ts:1340](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1340) ___ @@ -96,7 +96,7 @@ ___ #### Defined in -[XrmEx.ts:1339](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1339) +[XrmEx.ts:1339](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1339) ___ @@ -110,7 +110,7 @@ Xrm.Controls.Tab.sections #### Defined in -[XrmEx.ts:1348](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1348) +[XrmEx.ts:1348](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1348) ## Accessors @@ -124,7 +124,7 @@ Xrm.Controls.Tab.sections #### Defined in -[XrmEx.ts:1350](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1350) +[XrmEx.ts:1350](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1350) ## Methods @@ -148,7 +148,7 @@ Xrm.Controls.Tab.addTabStateChange #### Defined in -[XrmEx.ts:1355](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1355) +[XrmEx.ts:1355](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1355) ___ @@ -166,7 +166,7 @@ Xrm.Controls.Tab.getDisplayState #### Defined in -[XrmEx.ts:1358](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1358) +[XrmEx.ts:1358](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1358) ___ @@ -184,7 +184,7 @@ Xrm.Controls.Tab.getLabel #### Defined in -[XrmEx.ts:1379](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1379) +[XrmEx.ts:1379](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1379) ___ @@ -202,7 +202,7 @@ Xrm.Controls.Tab.getName #### Defined in -[XrmEx.ts:1361](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1361) +[XrmEx.ts:1361](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1361) ___ @@ -220,7 +220,7 @@ Xrm.Controls.Tab.getParent #### Defined in -[XrmEx.ts:1364](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1364) +[XrmEx.ts:1364](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1364) ___ @@ -238,7 +238,7 @@ Xrm.Controls.Tab.getVisible #### Defined in -[XrmEx.ts:1376](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1376) +[XrmEx.ts:1376](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1376) ___ @@ -262,7 +262,7 @@ Xrm.Controls.Tab.removeTabStateChange #### Defined in -[XrmEx.ts:1367](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1367) +[XrmEx.ts:1367](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1367) ___ @@ -286,7 +286,7 @@ Xrm.Controls.Tab.setDisplayState #### Defined in -[XrmEx.ts:1370](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1370) +[XrmEx.ts:1370](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1370) ___ @@ -304,7 +304,7 @@ Xrm.Controls.Tab.setFocus #### Defined in -[XrmEx.ts:1385](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1385) +[XrmEx.ts:1385](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1385) ___ @@ -328,7 +328,7 @@ Xrm.Controls.Tab.setLabel #### Defined in -[XrmEx.ts:1382](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1382) +[XrmEx.ts:1382](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1382) ___ @@ -352,4 +352,4 @@ Xrm.Controls.Tab.setVisible #### Defined in -[XrmEx.ts:1373](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L1373) +[XrmEx.ts:1373](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L1373) diff --git a/docs/classes/XrmEx.TextField.md b/docs/classes/XrmEx.TextField.md index 19c3ae4..a8a7826 100644 --- a/docs/classes/XrmEx.TextField.md +++ b/docs/classes/XrmEx.TextField.md @@ -78,7 +78,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:825](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L825) +[XrmEx.ts:825](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L825) ## Properties @@ -92,7 +92,7 @@ Used to execute methods related to a single Attribute #### Defined in -[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L584) +[XrmEx.ts:584](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L584) ___ @@ -106,7 +106,7 @@ ___ #### Defined in -[XrmEx.ts:824](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L824) +[XrmEx.ts:824](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L824) ___ @@ -120,7 +120,7 @@ ___ #### Defined in -[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L582) +[XrmEx.ts:582](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L582) ## Accessors @@ -138,7 +138,7 @@ Field.Attribute #### Defined in -[XrmEx.ts:834](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L834) +[XrmEx.ts:834](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L834) ___ @@ -160,7 +160,7 @@ Field.Value #### Defined in -[XrmEx.ts:842](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L842) +[XrmEx.ts:842](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L842) • `set` **Value**(`value`): `void` @@ -180,7 +180,7 @@ Field.Value #### Defined in -[XrmEx.ts:845](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L845) +[XrmEx.ts:845](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L845) ___ @@ -202,7 +202,7 @@ Field.controls #### Defined in -[XrmEx.ts:839](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L839) +[XrmEx.ts:839](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L839) ## Methods @@ -231,7 +231,7 @@ Displays an error or recommendation notification for a control, and lets you spe #### Defined in -[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L778) +[XrmEx.ts:778](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L778) ___ @@ -261,7 +261,7 @@ Xrm.Attributes.StringAttribute.addOnChange #### Defined in -[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L750) +[XrmEx.ts:750](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L750) ___ @@ -285,7 +285,7 @@ Xrm.Attributes.StringAttribute.fireOnChange #### Defined in -[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L737) +[XrmEx.ts:737](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L737) ___ @@ -307,7 +307,7 @@ Xrm.Attributes.StringAttribute.getAttributeType #### Defined in -[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L600) +[XrmEx.ts:600](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L600) ___ @@ -329,7 +329,7 @@ Xrm.Attributes.StringAttribute.getFormat #### Defined in -[XrmEx.ts:831](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L831) +[XrmEx.ts:831](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L831) ___ @@ -351,7 +351,7 @@ Xrm.Attributes.StringAttribute.getIsDirty #### Defined in -[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L606) +[XrmEx.ts:606](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L606) ___ @@ -369,7 +369,7 @@ Xrm.Attributes.StringAttribute.getMaxLength #### Defined in -[XrmEx.ts:828](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L828) +[XrmEx.ts:828](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L828) ___ @@ -391,7 +391,7 @@ Xrm.Attributes.StringAttribute.getName #### Defined in -[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L609) +[XrmEx.ts:609](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L609) ___ @@ -413,7 +413,7 @@ Xrm.Attributes.StringAttribute.getParent #### Defined in -[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L612) +[XrmEx.ts:612](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L612) ___ @@ -435,7 +435,7 @@ Xrm.Attributes.StringAttribute.getRequiredLevel #### Defined in -[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L615) +[XrmEx.ts:615](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L615) ___ @@ -457,7 +457,7 @@ Xrm.Attributes.StringAttribute.getSubmitMode #### Defined in -[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L618) +[XrmEx.ts:618](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L618) ___ @@ -479,7 +479,7 @@ Xrm.Attributes.StringAttribute.getUserPrivilege #### Defined in -[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L621) +[XrmEx.ts:621](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L621) ___ @@ -501,7 +501,7 @@ Xrm.Attributes.StringAttribute.getValue #### Defined in -[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L630) +[XrmEx.ts:630](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L630) ___ @@ -533,7 +533,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L809) +[XrmEx.ts:809](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L809) ___ @@ -561,7 +561,7 @@ Xrm.Attributes.StringAttribute.removeOnChange #### Defined in -[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L624) +[XrmEx.ts:624](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L624) ___ @@ -587,7 +587,7 @@ Sets the state of the control to either enabled, or disabled. #### Defined in -[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L699) +[XrmEx.ts:699](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L699) ___ @@ -616,7 +616,7 @@ Xrm.Attributes.StringAttribute.setIsValid #### Defined in -[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L633) +[XrmEx.ts:633](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L633) ___ @@ -650,7 +650,7 @@ true if it succeeds, false if it fails. #### Defined in -[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L669) +[XrmEx.ts:669](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L669) ___ @@ -676,7 +676,7 @@ Sets the required level. #### Defined in -[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L727) +[XrmEx.ts:727](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L727) ___ @@ -706,7 +706,7 @@ Xrm.Attributes.StringAttribute.setRequiredLevel #### Defined in -[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L712) +[XrmEx.ts:712](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L712) ___ @@ -734,7 +734,7 @@ Xrm.Attributes.StringAttribute.setSubmitMode #### Defined in -[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L627) +[XrmEx.ts:627](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L627) ___ @@ -762,7 +762,7 @@ Xrm.Attributes.StringAttribute.setValue #### Defined in -[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L597) +[XrmEx.ts:597](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L597) ___ @@ -788,4 +788,4 @@ Sets the visibility state. #### Defined in -[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L686) +[XrmEx.ts:686](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L686) diff --git a/docs/modules.md b/docs/modules.md index 8f345fc..def9aad 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -30,7 +30,7 @@ Represents a reference to an entity. #### Defined in -[XrmEx.ts:31](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L31) +[XrmEx.ts:31](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L31) ___ @@ -50,4 +50,4 @@ Represents a parameter for a request. #### Defined in -[XrmEx.ts:9](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L9) +[XrmEx.ts:9](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L9) diff --git a/docs/modules/XrmEx.md b/docs/modules/XrmEx.md index ae7236b..d36765b 100644 --- a/docs/modules/XrmEx.md +++ b/docs/modules/XrmEx.md @@ -56,7 +56,7 @@ Displays a notification for an app with the given message and level, and lets yo #### Defined in -[XrmEx.ts:70](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L70) +[XrmEx.ts:70](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L70) ___ @@ -82,7 +82,7 @@ Checks if the given request parameter is of a supported type and has a valid val #### Defined in -[XrmEx.ts:175](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L175) +[XrmEx.ts:175](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L175) ___ @@ -112,7 +112,7 @@ Executes an Action. #### Defined in -[XrmEx.ts:230](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L230) +[XrmEx.ts:230](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L230) ___ @@ -142,7 +142,7 @@ Executes a Function. #### Defined in -[XrmEx.ts:272](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L272) +[XrmEx.ts:272](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L272) ___ @@ -166,7 +166,7 @@ Retrieves the value of an environment variable by using its schema name as key. #### Defined in -[XrmEx.ts:113](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L113) +[XrmEx.ts:113](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L113) ___ @@ -184,7 +184,7 @@ Returns the name of the calling function. #### Defined in -[XrmEx.ts:48](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L48) +[XrmEx.ts:48](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L48) ___ @@ -208,7 +208,7 @@ Makes a GUID lowercase and removes brackets. #### Defined in -[XrmEx.ts:311](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L311) +[XrmEx.ts:311](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L311) ___ @@ -233,7 +233,7 @@ Opens a dialog with dynamic height and width based on text content. #### Defined in -[XrmEx.ts:322](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L322) +[XrmEx.ts:322](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L322) ___ @@ -257,7 +257,7 @@ Clears a notification in the app with the given unique ID. #### Defined in -[XrmEx.ts:99](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L99) +[XrmEx.ts:99](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L99) ___ @@ -283,4 +283,4 @@ Throws an error with the given error message. #### Defined in -[XrmEx.ts:41](https://github.com/AhashSritharan/Xrm-Ex/blob/301a447/src/XrmEx.ts#L41) +[XrmEx.ts:41](https://github.com/AhashSritharan/Xrm-Ex/blob/b300141/src/XrmEx.ts#L41) diff --git a/package.json b/package.json index 173045d..d66718c 100644 --- a/package.json +++ b/package.json @@ -35,13 +35,11 @@ "scripts": { "build": "npm run clean && npm run type:dts && npm run build:main && npm run format && npm run docs && npm run copy && npm run postbuild && npm run zip", "build:main": "tsc --build", - "clean": "rimraf build/dist coverage nyc_output", + "clean": "rimraf build/src coverage nyc_output", "docs": "npx typedoc --plugin typedoc-plugin-markdown --out docs src/XrmEx.ts", - "copy": "npm run copyPackage && npm run copyReadme && npm run copyEslint", - "copyPackage": "node -e \"require('fs').cpSync('./package.json', './build/package.json');\"", + "copy": "npm run copyReadme", "copyReadme": "node -e \"require('fs').cpSync('./README.md', './build/README.md');\"", - "copyEslint": "node -e \"require('fs').cpSync('./.eslintrc.cjs', './build/.eslintrc.cjs');\"", - "postbuild": "rimraf build/dist/tests", + "postbuild": "rimraf build/tests", "zip": "npm-build-zip --destination=release/ --name=xrm-ex --name_only=true", "type:dts": "tsc --emitDeclarationOnly --project tsconfig.build.json", "type:check": "tsc --noEmit", diff --git a/release/xrm-ex.zip b/release/xrm-ex.zip index 51d7d06088ce8145390452dfd738c39f856b9c76..721068dcf9efc651a4d5a825f3f05f0015358166 100644 GIT binary patch delta 31090 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 z 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 delta 46391 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 bzfJeg`(A6@ApJMvU%Z36vh<(Rf35!mEbX8P diff --git a/src/TemplateFunctions.ts b/src/TemplateFunctions.ts deleted file mode 100644 index 6ecc31d..0000000 --- a/src/TemplateFunctions.ts +++ /dev/null @@ -1,303 +0,0 @@ -/// - -// eslint-disable-next-line no-unused-vars -namespace Theia { - export namespace TemplateFunctions { - var formContext: Xrm.FormContext; - class Fields { - Firstname = new XrmEx.TextField("firstname"); - Lastname = new XrmEx.TextField("lastname"); - JobTitle = new XrmEx.TextField("jobtitle"); - PreferredContactMethod = new XrmEx.OptionsetField( - "preferredcontactmethodcode", - { - Any: 1, - Email: 2, - Phone: 3, - Fax: 4, - Mail: 5, - } - ); - Customer = new XrmEx.LookupField("parentcustomerid"); - BusinessPhone = new XrmEx.TextField("telephone1"); - Gender = new XrmEx.OptionsetField("gendercode"); - Email = new XrmEx.TextField("emailaddress1"); - MobilePhone = new XrmEx.TextField("mobilephone"); - Owner = new XrmEx.LookupField("ownerid"); - DoNotEmail = new XrmEx.BooleanField("donotemail"); - MaritalStatus = new XrmEx.OptionsetField("familystatuscode"); - SpousePartnerName = new XrmEx.TextField("spousesname"); - Birthday = new XrmEx.DateField("birthdate"); - } - class Tabs { - General = new XrmEx.Tab("tab1", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - Details = new XrmEx.Tab("tab2", { - Section1: new XrmEx.Section("section1"), - Section2: new XrmEx.Section("section2"), - }); - } - class Grids { - ContactSubgrid = new XrmEx.GridControl("Test"); - } - var fields: Fields; - var tabs: Tabs; - var grids: Grids; - export async function Init( - executionContext: Xrm.FormContext | Xrm.Events.EventContext - ) { - if (!XrmEx) { - let errorMessage = - "XrmEx is not loaded. Please make sure you have XrmEx.js loaded in your form."; - console.error(errorMessage); - await Xrm.Navigation.openAlertDialog({ - title: "Error", - text: errorMessage, - }); - return; - } - XrmEx.Form.formContext = executionContext; - fields = new Fields(); - tabs = new Tabs(); - grids = new Grids(); - } - - export async function OnLoad( - executionContext: Xrm.FormContext | Xrm.Events.EventContext - ) { - await Init(executionContext); //Ensures XrmEx is only accessed after the OnLoad Event - try { - parent.window.XrmEx = XrmEx; - formContext = XrmEx.Form.formContext; - - await sample(); - //Register one or more Functions to execute OnSave - formContext.data.entity.addOnSave(sample); - //BETTER WAY - XrmEx.Form.addOnSaveEventHandler([sample]); - //Register one or more Functions to execute OnChange of multiple fields and execute it immediately - let firstname = formContext.getAttribute("firstname"); - let lastname = formContext.getAttribute("lastname"); - firstname.addOnChange(sample); - firstname.fireOnChange(); - lastname.fireOnChange(); - //BETTER WAY - XrmEx.Form.addOnChangeEventHandler( - [fields.Firstname, fields.Lastname], - [sample], - true - ); - } catch (error) { - console.error(error); - await XrmEx.openAlertDialog( - "Error", - `Error in Theia.TemplateFunctions.${XrmEx.getMethodName()}\n` + - error.message - ); - } - /** - * This Framework empowers developers to DO MORE by writing LESS CODE 👈(゚ヮ゚👈) - */ - async function sample() { - try { - //Continue only on Update Form - if (formContext.ui.getFormType() != 2) return; - //BETTER WAY - if (XrmEx.Form.IsNotUpdate) return; - - //If Firstname is empty, make it required and shows notification on the field - let firstname = formContext.getAttribute("firstname"); - if (!firstname.getValue()) { - firstname.setRequiredLevel("required"); - firstname.controls.forEach((c) => - c.setNotification("This property is required", "uniqueId") - ); - } - //BETTER WAY - if (!fields.Lastname.Value) - fields.Firstname.setRequired(true).setNotification( - "This property is required", - "uniqueId" - ); - - //If Owner has Value and Lastname does not, retrieve it's lastname and set it to Lastname - let ownerid = formContext.getAttribute("ownerid"); - let lastname = formContext.getAttribute("lastname"); - if (ownerid.getValue() && !lastname.getValue()) { - let user = await Xrm.WebApi.retrieveRecord( - ownerid.getValue()[0].entityType, - ownerid.getValue()[0].id, - "?$select=lastname" - ); - lastname.setValue(user.lastname); - } - //BETTER WAY - if (fields.Owner.Value && !fields.Lastname.Value) { - let user = await fields.Owner.retrieve("?$select=lastname"); - fields.Lastname.Value = user.lastname; - fields.Lastname.setValue(user.lastname); - } - //Set Optionset PreferredContactMethod to Email - fields.PreferredContactMethod.Value = - fields.PreferredContactMethod.Option.Email; - - //Add Lookup Filter to Customer and remove it later - let filterFunction = function filterFunction( - executionContext: Xrm.Events.EventContext - ) { - let formContext = executionContext.getFormContext(); - let customer: Xrm.Attributes.LookupAttribute = - formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => { - c.addCustomFilter( - ` - - ` - ); - }); - }; - let customer: Xrm.Attributes.LookupAttribute = - formContext.getAttribute("parentcustomerid"); - customer.controls.forEach((c) => c.addPreSearch(filterFunction)); - customer.controls.forEach((c) => c.removePreSearch(filterFunction)); - //BETTER WAY - fields.Customer.addPreFilterToLookup( - ` - - ` - ); - fields.Customer.clearPreFilterFromLookup(); - - fields.Lastname.setVisible(false) - .setDisabled(true) - .setRequired(false) - .setNotification("This property is required", "uniqueId"); - - //SPECIAL WAY (Go to Definition to see how to achieve this) - //Add Advanced Lookup Filter - await fields.Customer.addPreFilterToLookupAdvanced( - "contact", - "contactid", - ` - - - - - - ` - ); - - //Execute bound Action - class TestActionContactRequest { - Amount: number; - Account: any; - getMetadata() { - return { - boundParameter: "entity", - operationType: 0, - operationName: "theia_TestActionContact", - parameterTypes: { - Amount: { - typeName: "Edm.Int32", - structuralProperty: 1, - }, - Account: { - typeName: "mscrm.account", - structuralProperty: 5, - }, - entity: { - typeName: "mscrm.contact", - structuralProperty: 5, - }, - }, - }; - } - } - let testActionContactRequest = new TestActionContactRequest(); - testActionContactRequest.Amount = 5; - testActionContactRequest.Account = customer.getValue()[0]; - testActionContactRequest["entity"] = - formContext.data.entity.getEntityReference(); - let response = await Xrm.WebApi.online - .execute(testActionContactRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(response); - - //BETTER WAY - let response2 = await XrmEx.executeAction( - "theia_TestActionContact", - [ - { Name: "Amount", Type: "Integer", Value: 5 }, - { - Name: "Account", - Type: "EntityReference", - Value: fields.Customer.Value[0], - }, - ], - XrmEx.Form.entityReference - ); - console.log(response2); - - //Retrieve EnvironmentVariableValue - class EnvironmentVariableRequest { - DefinitionSchemaName: string; - constructor(definitionSchemaName: string) { - this.DefinitionSchemaName = definitionSchemaName; - } - getMetadata() { - return { - boundParameter: null, - operationType: 1, - operationName: "RetrieveEnvironmentVariableValue", - parameterTypes: { - DefinitionSchemaName: { - typeName: "Edm.String", - structuralProperty: 1, - }, - }, - }; - } - } - let environmentVariableRequest = new EnvironmentVariableRequest( - "theia_Test" - ); - let value = await Xrm.WebApi.online - .execute(environmentVariableRequest) - .then(function (response) { - if (response.ok) { - return response.json().catch(() => { - return response; - }); - } - }) - .then((responseBody) => responseBody); - console.log(value); - //BETTER WAY - let value2 = await XrmEx.getEnvironmentVariableValue("theia_Test"); - console.log(value2); - - /** - * How to access Propoerties described in Microsofts Documentation - */ - /** You can access all Form Context Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/clientapi-form-context*/ - XrmEx.Form.formContext.data.isValid(); - - /** You can access all Column Functions here: @see https://docs.microsoft.com/en-us/power-apps/developer/model-driven-apps/clientapi/reference/attributes*/ - fields.Birthday.Attribute.getIsDirty(); - } catch (error) { - console.error(error); - throw new Error(`.${XrmEx.getMethodName()}:\n${error.message}`); - } - } - } - } -} diff --git a/tsconfig.json b/tsconfig.json index 87a0826..14daca8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,7 @@ "target": "es2022", "moduleResolution": "Node", "rootDir": "./", - "outDir": "build/dist", + "outDir": "build", "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true,