@tiba-spark/client-shared-lib 26.2.0-342 → 26.2.0-347
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/libraries/components/field-validations/field-validations.component.mjs +3 -3
- package/esm2022/libraries/enums/localization.enum.mjs +2 -1
- package/esm2022/libraries/utils/custom-validator.util.mjs +20 -10
- package/fesm2022/tiba-spark-client-shared-lib.mjs +22 -11
- package/fesm2022/tiba-spark-client-shared-lib.mjs.map +1 -1
- package/libraries/enums/localization.enum.d.ts +2 -1
- package/libraries/enums/localization.enum.d.ts.map +1 -1
- package/libraries/utils/custom-validator.util.d.ts +2 -0
- package/libraries/utils/custom-validator.util.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -675,16 +675,26 @@ export class TibaValidators {
|
|
|
675
675
|
};
|
|
676
676
|
}
|
|
677
677
|
static carPlateSequentialRequired(carPlateField = 'carPlate') {
|
|
678
|
+
return TibaValidators.sequentialRequired(carPlateField, Localization.car_plate_sequential_required);
|
|
679
|
+
}
|
|
680
|
+
static cardSequentialRequired(cardField = 'badge') {
|
|
681
|
+
return TibaValidators.sequentialRequired(cardField, Localization.card_sequential_required);
|
|
682
|
+
}
|
|
683
|
+
static sequentialRequired(arrayField, errorKey) {
|
|
678
684
|
return (formGroup) => {
|
|
679
|
-
const
|
|
680
|
-
if (!
|
|
685
|
+
const controlArray = formGroup.get(arrayField);
|
|
686
|
+
if (!controlArray)
|
|
681
687
|
return null;
|
|
682
|
-
|
|
688
|
+
// Values may be numbers (e.g. badges patched from the DTO in edit mode) — coerce to string
|
|
689
|
+
const rawValues = controlArray.controls.map(c => {
|
|
690
|
+
const value = c.get('value')?.value;
|
|
691
|
+
return value === null || value === undefined ? '' : String(value);
|
|
692
|
+
});
|
|
683
693
|
const values = rawValues.map(v => v.trim());
|
|
684
694
|
const lastFilledIndex = values.reduce((last, v, i) => (v ? i : last), -1);
|
|
685
695
|
let hasError = false;
|
|
686
|
-
for (let i = 0; i <
|
|
687
|
-
const valueControl =
|
|
696
|
+
for (let i = 0; i < controlArray.length; i++) {
|
|
697
|
+
const valueControl = controlArray.at(i).get('value');
|
|
688
698
|
if (!valueControl)
|
|
689
699
|
continue;
|
|
690
700
|
const isGap = !values[i] && i < lastFilledIndex;
|
|
@@ -692,16 +702,16 @@ export class TibaValidators {
|
|
|
692
702
|
const isProblematic = isGap || isWhitespaceOnly;
|
|
693
703
|
if (isProblematic) {
|
|
694
704
|
hasError = true;
|
|
695
|
-
const errors = { ...(valueControl.errors ?? {}),
|
|
705
|
+
const errors = { ...(valueControl.errors ?? {}), [errorKey]: true };
|
|
696
706
|
valueControl.setErrors(errors);
|
|
697
707
|
}
|
|
698
|
-
else if (valueControl.hasError(
|
|
699
|
-
const {
|
|
708
|
+
else if (valueControl.hasError(errorKey)) {
|
|
709
|
+
const { [errorKey]: removed, ...rest } = valueControl.errors;
|
|
700
710
|
valueControl.setErrors(Object.keys(rest).length ? rest : null);
|
|
701
711
|
}
|
|
702
712
|
}
|
|
703
|
-
return hasError ? {
|
|
713
|
+
return hasError ? { [errorKey]: true } : null;
|
|
704
714
|
};
|
|
705
715
|
}
|
|
706
716
|
}
|
|
707
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXZhbGlkYXRvci51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXNoYXJlZC1saWIvc3JjL2xpYnJhcmllcy91dGlscy9jdXN0b20tdmFsaWRhdG9yLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFvQixZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0UsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHlDQUF5QyxDQUFDO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyx5SEFBeUgsQ0FBQztBQUN2SixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztBQUM1QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxVQUFVLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcseUJBQXlCLENBQUM7QUFDNUQsTUFBTSxDQUFDLE1BQU0sMEJB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LEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDO2dCQUNoRCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELE1BQU0sYUFBYSxHQUFHLEtBQUssSUFBSSxnQkFBZ0IsQ0FBQztnQkFDaEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDbEIsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDaEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDdkYsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsQ0FBQztxQkFBTSxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUMsRUFBRSxDQUFDO29CQUNsRSxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO29CQUN2RSxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRSxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLDZCQUE2QixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkUsQ0FBQyxDQUFDO0lBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZGVib3VuY2VUaW1lLCBkZWxheSwgbWFwLCBvZiwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJTlBVVF9TRUFSQ0hfREVCT1VOQ0VfVElNRSwgVkFMSURfVElNRV9NQVhfTEVOR1RIIH0gZnJvbSAnLi4vY29uc3RhbnRzL2dsb2JhbC1jb25zdGFudHMnO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uIH0gZnJvbSAnLi4vZW51bXMvbG9jYWxpemF0aW9uLmVudW0nO1xuaW1wb3J0IHsgQ2xvdWQsIFJwYyB9IGZyb20gJy4uL3NlcnZpY2UtcHJveHknO1xuaW1wb3J0IHsgaGFzVW5zYWZlSHRtbFZhbHVlIH0gZnJvbSAnLi4vc2VydmljZXMvaHRtbC1zYW5pdGl6ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBNaWRkYXlQZXJpb2QsIFRpbWUgYXMgVGliYVRpbWUsIHRpbWVUb01vbWVudCB9IGZyb20gJy4vZGF0ZS51dGlsJztcblxuY29uc3QgTUlOX0FMTE9XRURfQkFMQU5DRSA9IDA7XG5jb25zdCBNQVhfQUxMT1dFRF9CQUxBTkNFID0gMjU1O1xuZXhwb3J0IGNvbnN0IG5vRW1vamlSZWdleCA9IC9bXmEtekEtWjAtOVxcdTAwQzAtXFx1MDE3RlxcdTA1REVcXHUwNUU2IF0vZztcbmV4cG9ydCBjb25zdCBwYXNzd29yZFJlZ2V4ID0gL14oPz0uKlthLXpdKSg/PS4qW0EtWl0pKD89LipcXGQpKD89LipbIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxdXl9ge3x9fl0pW0EtWmEtelxcZCFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX5dezQsfSQvZztcbmV4cG9ydCBjb25zdCBhbHBoYW51bWVyaWNSZWdleCA9IC9eW2EtekEtWjAtOV0rJC87XG5leHBvcnQgY29uc3QgbW9iaWxlUmVnZXggPSAvXlswLTldKyQvO1xuZXhwb3J0IGNvbnN0IGludGVnZXJOdW1iZXJSZWdleCA9IC9eLT9cXGQrJC87XG5leHBvcnQgY29uc3QgaW50ZWdlclBvc2l0aXZlTnVtYmVyUmVnZXggPSAvXlswLTldKyQvO1xuZXhwb3J0IGNvbnN0IGRlY2ltYWxOdW1iZXJSZWdleCA9IC9eWy1dPyhcXGQrKShcXC5cXGR7MSwyfSk/JC87XG5leHBvcnQgY29uc3QgZGVjaW1hbFBvc2l0aXZlTnVtYmVyUmVnZXggPSAvXihcXGQrKShcXC5cXGR7MSwyfSk/JC87XG5leHBvcnQgY29uc3QgcmVnZXhFeHAgPSAvXlswLTlhLWZBLUZdezh9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezEyfSQvO1xuZXhwb3J0IGNvbnN0IHBlcmNlbnRhZ2VSZWdleCA9IC9eKDEwMHxbMS05XT9bMC05XSkkLztcbmV4cG9ydCBjb25zdCBkZWNpbWFsUGVyY2VudGFnZVJlZ2V4ID0gL14oMTAwKD86XFwuMHsxLDJ9KT98WzAtOV17MSwyfSg/OlxcLlswLTldezEsMn0pPykkLztcbi8vIEVhY2ggb2N0ZXQgbXVzdCBiZSAwLTI1NSB3aXRoIG5vIGxlYWRpbmcgemVyb3MgKGUuZy4gXCIxOTIuMTY4LjMuMlwiIGlzIHZhbGlkLCBcIjE5Mi4xNjguMDMuMDJcIiBpcyBub3QpLlxuZXhwb3J0IGNvbnN0IGlwdjRSZWdleCA9IC9eKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldP1swLTldKShcXC4oMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV0/WzAtOV0pKXszfSQvO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxPckVtcHR5KHZhbDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBudWxsIHx8IHZhbCA9PT0gJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEFtUG1UbzI0SG91cnModGltZTogVGliYVRpbWUsIGVuYWJsZUZ1bGxEYXk6IGJvb2xlYW4pOiBUaWJhVGltZSB7XG4gIGxldCBfdGltZTogVGliYVRpbWUgPSBudWxsO1xuICBpZiAodGltZSkge1xuICAgIF90aW1lID0geyAuLi50aW1lIH07IC8vIFNwcmVhZCBvcGVyYXRvciBmb3IgaW1tdXRhYmlsaXR5XG5cbiAgICBpZiAodGltZS5taWRkYXlQZXJpb2QgPT09IE1pZGRheVBlcmlvZC5QTSAmJiArdGltZS5ob3VycyAhPT0gMTIpIHtcbiAgICAgIF90aW1lLmhvdXJzID0gK190aW1lLmhvdXJzICsgMTI7IC8vIENvbnZlcnQgUE0gaG91cnMgKGV4Y2VwdCAxMiBQTSkgdG8gMjQtaG91ciBmb3JtYXRcblxuICAgIH0gZWxzZSBpZiAodGltZS5taWRkYXlQZXJpb2QgPT09IE1pZGRheVBlcmlvZC5BTSAmJiArdGltZS5ob3VycyA9PT0gMTIpIHtcbiAgICAgIF90aW1lLmhvdXJzID0gZW5hYmxlRnVsbERheSA/IDI0IDogMDsgIC8vIE1pZG5pZ2h0IGNhc2UgKDEyIEFNIGlzIDAwOjAwIGluIDI0LWhvdXIgdGltZSBhbmQgMjQ6MDAgd2hlbiBmdWxsIGRheSBvcHRpb24gaXMgYWN0aXZlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfdGltZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnQyNEhvdXJzVG9BbVBNKHRpbWU6IFRpYmFUaW1lKTogVGliYVRpbWUge1xuICBsZXQgX3RpbWU6IFRpYmFUaW1lID0gbnVsbDtcbiAgaWYgKHRpbWUpIHtcbiAgICBfdGltZSA9IHsgLi4udGltZSB9OyAvLyBTcHJlYWQgb3BlcmF0b3IgZm9yIGltbXV0YWJpbGl0eVxuICAgIGNvbnN0IGhvdXJzID0gK3RpbWUuaG91cnM7XG4gICAgaWYgKGhvdXJzID49IDAgJiYgaG91cnMgPD0gMTEpIHtcbiAgICAgIF90aW1lLm1pZGRheVBlcmlvZCA9IE1pZGRheVBlcmlvZC5BTTtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyICYmIGhvdXJzIDw9IDIzKSB7XG4gICAgICBfdGltZS5taWRkYXlQZXJpb2QgPSBNaWRkYXlQZXJpb2QuUE07XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMjQpIHtcbiAgICAgIF90aW1lLm1pZGRheVBlcmlvZCA9IE1pZGRheVBlcmlvZC5BTTtcbiAgICB9XG5cbiAgICBpZiAoaG91cnMgPT09IDI0KSB7XG4gICAgICBfdGltZS5ob3VycyA9IDA7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgX3RpbWUuaG91cnMgPSArX3RpbWUuaG91cnMgLSAxMjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX3RpbWU7XG59XG5cbmV4cG9ydCBjbGFzcyBUaWJhVmFsaWRhdG9ycyB7XG5cbiAgc3RhdGljIHVuc2FmZUh0bWwoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiBoYXNVbnNhZmVIdG1sVmFsdWUoY29udHJvbC52YWx1ZSkgPyB7IGZvcm1fdmFsaWRhdGlvbl91bnNhZmVfaHRtbDogdHJ1ZSB9IDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBpcHY0VmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBpZiAoaXNOdWxsT3JFbXB0eShjb250cm9sLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGlzVmFsaWQgPSBpcHY0UmVnZXgudGVzdChjb250cm9sLnZhbHVlKTtcbiAgICByZXR1cm4gaXNWYWxpZCA/IG51bGwgOiB7IGlwdjRGb3JtYXQ6IHRydWUgfTtcbiAgfVxuXG4gIC8vIFJlamVjdHMgdGhlIGFsbC16ZXJvcyBhZGRyZXNzICgwLjAuMC4wKSDigJQgaXQgcGFzc2VzIHRoZSBJUHY0IGZvcm1hdCByZWdleCBidXQgaXMgbm90IGEgcmVhbCBob3N0LlxuICBzdGF0aWMgaXB2NE5vdFplcm9WYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiBjb250cm9sLnZhbHVlPy50cmltKCkgPT09ICcwLjAuMC4wJyA/IHsgaXB2NE5vdFplcm86IHRydWUgfSA6IG51bGw7XG4gIH1cblxuICAvLyBGb3JtQXJyYXktbGV2ZWwgdmFsaWRhdG9yOiBmbGFncyBldmVyeSB2YWx1ZSBjb250cm9sIHRoYXQgcmVwZWF0cyBhbm90aGVyIHJvdydzIElQLlxuICAvLyBTZXRzL2NsZWFycyBvbmx5IHRoZSBgZHVwbGljYXRlSVBgIGVycm9yIHNvIG90aGVyIGVycm9ycyBvbiB0aGUgY29udHJvbCBhcmUgcHJlc2VydmVkLlxuICBzdGF0aWMgbm9EdXBsaWNhdGVJUHNWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IGNvbnRyb2wgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBmb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKGdyb3VwLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycpLnRyaW0oKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBjb3VudHMuc2V0KHZhbHVlLCAoY291bnRzLmdldCh2YWx1ZSkgPz8gMCkgKyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGZvcm1BcnJheS5jb250cm9scykge1xuICAgICAgY29uc3QgdmFsdWVDb250cm9sID0gZ3JvdXAuZ2V0KCd2YWx1ZScpO1xuICAgICAgaWYgKCF2YWx1ZUNvbnRyb2wpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gKHZhbHVlQ29udHJvbC52YWx1ZSA/PyAnJykudHJpbSgpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFcnJvcnMgPSB2YWx1ZUNvbnRyb2wuZXJyb3JzIHx8IHt9O1xuICAgICAgZGVsZXRlIGV4aXN0aW5nRXJyb3JzWydkdXBsaWNhdGVJUCddO1xuXG4gICAgICBpZiAodmFsdWUgJiYgY291bnRzLmdldCh2YWx1ZSkgPiAxKSB7XG4gICAgICAgIGV4aXN0aW5nRXJyb3JzWydkdXBsaWNhdGVJUCddID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWVDb250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhleGlzdGluZ0Vycm9ycykubGVuZ3RoID8gZXhpc3RpbmdFcnJvcnMgOiBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIE5vIGVtb2ppIHZhbGlkYXRpb25cbiAgc3RhdGljIG5vRW1vamkoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiB2YWwudG9TdHJpbmcoKS5tYXRjaChub0Vtb2ppUmVnZXgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub0Vtb2ppOiB7XG4gICAgICAgICAgdmFsdWU6IGAgJyR7dmFsfSdgLFxuICAgICAgICAgIHBhdHRlcm46IG5vRW1vamlSZWdleFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHBlcmNlbnRhZ2UoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiAhdmFsLnRvU3RyaW5nKCkubWF0Y2gocGVyY2VudGFnZVJlZ2V4KSkge1xuICAgICAgcmV0dXJuIHsgZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfcGVyY2VudGFnZTogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGRlY2ltYWxQZXJjZW50YWdlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWwgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCFpc051bGxPckVtcHR5KHZhbCkgJiYgIXZhbC50b1N0cmluZygpLm1hdGNoKGRlY2ltYWxQZXJjZW50YWdlUmVnZXgpKSB7XG4gICAgICByZXR1cm4geyBmb3JtX3ZhbGlkYXRpb25faW52YWxpZF9kZWNpbWFsX3BlcmNlbnRhZ2U6IHRydWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIE1vYmlsZSBvbmx5IHZhbGlkYXRpb25cbiAgc3RhdGljIG1vYmlsZU51bWJlcnMoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiAhdmFsLnRvU3RyaW5nKCkubWF0Y2gobW9iaWxlUmVnZXgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2JpbGVOdW1iZXJzOiB7XG4gICAgICAgICAgdmFsdWU6IGAgJyR7dmFsfSdgLFxuICAgICAgICAgIHBhdHRlcm46IG1vYmlsZVJlZ2V4XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgaG90ZWxSb29uTnVtYmVycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICghaXNOdWxsT3JFbXB0eSh2YWwpICYmICF2YWwudG9TdHJpbmcoKS5tYXRjaChhbHBoYW51bWVyaWNSZWdleCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFscGhhbnVtZXJpY1JlZ2V4OiB7XG4gICAgICAgICAgdmFsdWU6IGAgJyR7dmFsfSdgLFxuICAgICAgICAgIHBhdHRlcm46IGFscGhhbnVtZXJpY1JlZ2V4XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVQb3NpdGl2ZUludGVnZXJJbmNsdWRlWmVybyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgcmV0dXJuIFRpYmFWYWxpZGF0b3JzLnZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyKGNvbnRyb2wsIDApO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyV2l0aG91dFplcm8oY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiBUaWJhVmFsaWRhdG9ycy52YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcihjb250cm9sLCAxKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG1pblZhbHVlOiBudW1iZXIpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIWlzTnVsbE9yRW1wdHkoY29udHJvbC52YWx1ZSkgJiZcbiAgICAgICEoY29udHJvbC52YWx1ZS50b1N0cmluZygpLm1hdGNoKGludGVnZXJOdW1iZXJSZWdleCkgJiYgK2NvbnRyb2wudmFsdWUgPj0gbWluVmFsdWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcjoge1xuICAgICAgICAgIHZhbHVlOiBgICcke2NvbnRyb2wudmFsdWV9J2BcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEludGVnZXI6IC0xMjMsIDEyM1xuICBzdGF0aWMgaW50ZWdlck51bWJlcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICghaXNOdWxsT3JFbXB0eSh2YWwpICYmICF2YWwudG9TdHJpbmcoKS5tYXRjaChpbnRlZ2VyTnVtYmVyUmVnZXgpKSByZXR1cm4ge1xuICAgICAgaW50ZWdlck51bWJlcjoge1xuICAgICAgICB2YWx1ZTogYCAnJHt2YWx9J2AsXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gSW50ZWdlciBQb3NpdGl2ZSAtPiAxMjNcbiAgc3RhdGljIGludGVnZXJQb3NpdGl2ZU51bWJlcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiAhdmFsLnRvU3RyaW5nKCkubWF0Y2goaW50ZWdlclBvc2l0aXZlTnVtYmVyUmVnZXgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnRlZ2VyUG9zaXRpdmVOdW1iZXI6IHtcbiAgICAgICAgICB2YWx1ZTogYCAnJHt2YWx9J2BcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBEZWNpbWFsOiAtMS4yMywgMS4yM1xuICBzdGF0aWMgZGVjaW1hbE51bWJlcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICghaXNOdWxsT3JFbXB0eSh2YWwpICYmICF2YWwudG9TdHJpbmcoKS5tYXRjaChkZWNpbWFsTnVtYmVyUmVnZXgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWNpbWFsTnVtYmVyOiB7XG4gICAgICAgICAgdmFsdWU6IGAgJyR7dmFsfSdgLFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gRGVjaW1hbCBQb3NpdGl2ZTogMS4yM1xuICBzdGF0aWMgZGVjaW1hbFBvc2l0aXZlTnVtYmVyKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWwgPSBjb250cm9sLnZhbHVlO1xuICAgIGlmICghaXNOdWxsT3JFbXB0eSh2YWwpICYmICF2YWwudG9TdHJpbmcoKS5tYXRjaChkZWNpbWFsUG9zaXRpdmVOdW1iZXJSZWdleCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlY2ltYWxQb3NpdGl2ZU51bWJlcjoge1xuICAgICAgICAgIHZhbHVlOiBgICcke3ZhbH0nYCxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBOdW1iZXIgbGVuZ3RoXG4gIHN0YXRpYyBudW1lcmljTGVuZ3RoKGxlbmd0aDogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZTtcblxuICAgICAgaWYgKCFpc051bGxPckVtcHR5KHZhbCkgJiYgdmFsLnRvU3RyaW5nKCkubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpbnZhbGlkTnVtYmVyTGVuZ3RoOiB7XG4gICAgICAgICAgICBhY3R1YWxMZW5ndGg6IHZhbCxcbiAgICAgICAgICAgIHJlcXVpcmVkTGVuZ3RoOiBsZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgUGFzc3dvcmRWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGlmICghY29udHJvbC52YWx1ZT8ubWF0Y2gocGFzc3dvcmRSZWdleCkpIHtcbiAgICAgIHJldHVybiB7IHBhc3N3b3JkUG9saWN5UmVxdWlyZW1lbnRzOiB0cnVlIH07XG4gICAgfVxuICAgIGlmIChjb250cm9sLnZhbHVlLmxlbmd0aCA8IDgpIHtcbiAgICAgIHJldHVybiB7IG1pbmxlbmd0aDogeyByZXF1aXJlZExlbmd0aDogOCB9IH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIEd1aWRWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGlmICghcmVnZXhFeHAudGVzdChjb250cm9sLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgZ3VpZElzVmFsaWQ6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgUGFzc3dvcmRGb3JtTWF0Y2hWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXNzd29yZCA9IGNvbnRyb2wuZ2V0KCdwYXNzd29yZCcpO1xuICAgIGNvbnN0IGN1cnJlbnRQYXNzd29yZCA9IGNvbnRyb2wuZ2V0KCdjdXJyZW50UGFzc3dvcmQnKTtcbiAgICBpZiAobmV3UGFzc3dvcmQgJiYgY3VycmVudFBhc3N3b3JkICYmIG5ld1Bhc3N3b3JkLnZhbGlkICYmIGN1cnJlbnRQYXNzd29yZC52YWxpZCAmJiBuZXdQYXNzd29yZC52YWx1ZSA9PT0gY3VycmVudFBhc3N3b3JkLnZhbHVlKSB7XG4gICAgICByZXR1cm4geyBwYXNzd29yZE1hdGNoOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7IC8vIFBhc3N3b3JkcyBtYXRjaCBvciBmb3JtIGZpZWxkcyBoYXMgaXRzIG93biBlcnJvcnNcbiAgfVxuXG4gIHN0YXRpYyBQYXNzd29yZEZvcm1Ob3RNYXRjaFZhbGlkYXRvcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1Bhc3N3b3JkID0gY29udHJvbC5nZXQoJ3Bhc3N3b3JkJyk7XG4gICAgY29uc3QgY29uZmlybVBhc3N3b3JkID0gY29udHJvbC5nZXQoJ2NvbmZpcm1QYXNzd29yZCcpO1xuICAgIGlmICgobmV3UGFzc3dvcmQuZXJyb3JzIHx8IGNvbmZpcm1QYXNzd29yZC5lcnJvcnMpIHx8XG4gICAgICBuZXdQYXNzd29yZC52YWx1ZSA9PT0gY29uZmlybVBhc3N3b3JkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gUGFzc3dvcmRzIG1hdGNoIG9yIGZvcm0gZmllbGRzIGhhcyBpdHMgb3duIGVycm9yc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyBwYXNzd29yZE5vdE1hdGNoOiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb21Ub051bWJlclZhbGlkYXRvcihmcm9tQ29udHJvbE5hbWU6IHN0cmluZywgdG9Db250cm9sTmFtZTogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBmcm9tQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZnJvbUNvbnRyb2xOYW1lKTtcbiAgICAgIGNvbnN0IHRvQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQodG9Db250cm9sTmFtZSk7XG5cbiAgICAgIC8vIEtlZXAgZXhpc3RpbmcgZXJyb3JzXG4gICAgICBjb25zdCBleGlzdGluZ0Zyb21FcnJvcnMgPSBmcm9tQ29udHJvbC5lcnJvcnMgfHwge307XG4gICAgICBjb25zdCBleGlzdGluZ1RvRXJyb3JzID0gdG9Db250cm9sLmVycm9ycyB8fCB7fTtcblxuICAgICAgLy8gUmVtb3ZlIG9ubHkgb3VyIGN1c3RvbSBlcnJvcnNcbiAgICAgIGRlbGV0ZSBleGlzdGluZ0Zyb21FcnJvcnNbTG9jYWxpemF0aW9uLmZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX251bWJlcl9yYW5nZV07XG4gICAgICBkZWxldGUgZXhpc3RpbmdUb0Vycm9yc1tMb2NhbGl6YXRpb24uZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfbnVtYmVyX3JhbmdlXTtcblxuICAgICAgaWYgKHRoaXMuaXNWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbFRvKGZyb21Db250cm9sLCB0b0NvbnRyb2wpKSB7XG4gICAgICAgIGV4aXN0aW5nRnJvbUVycm9yc1tMb2NhbGl6YXRpb24uZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfbnVtYmVyX3JhbmdlXSA9IHRydWU7XG4gICAgICAgIGV4aXN0aW5nVG9FcnJvcnNbTG9jYWxpemF0aW9uLmZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX251bWJlcl9yYW5nZV0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBiYWNrIGVycm9ycyBvciBudWxsIGlmIG5vbmVcbiAgICAgIGZyb21Db250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhleGlzdGluZ0Zyb21FcnJvcnMpLmxlbmd0aCA/IGV4aXN0aW5nRnJvbUVycm9ycyA6IG51bGwpO1xuICAgICAgdG9Db250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhleGlzdGluZ1RvRXJyb3JzKS5sZW5ndGggPyBleGlzdGluZ1RvRXJyb3JzIDogbnVsbCk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjYWxjdWxhdGVCYWxhbmNlID0gKHVuaXRzVmFsdWUsIGJhbGFuY2VWYWx1ZSkgPT4geyByZXR1cm4gdW5pdHNWYWx1ZSArIGJhbGFuY2VWYWx1ZTsgfTtcblxuICBzdGF0aWMgdW5pdHNCYWxhbmNlVmFsaWRhdG9yKHVuaXRzQ29udHJvbE5hbWU6IHN0cmluZywgYmFsYW5jZUNvbnRyb2xOYW1lOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSBudWxsOyAvLyBSZXR1cm4gbnVsbCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgICAgaWYgKGNvbnRyb2wucGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IGNvbnRyb2wucGFyZW50IGFzIEZvcm1Hcm91cDtcbiAgICAgICAgY29uc3QgdW5pdHNDb250cm9sID0gZm9ybUdyb3VwLmdldCh1bml0c0NvbnRyb2xOYW1lKTtcbiAgICAgICAgY29uc3QgYmFsYW5jZUNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGJhbGFuY2VDb250cm9sTmFtZSk7XG4gICAgICAgIGNvbnN0IHVuaXRzVmFsdWUgPSBwYXJzZUludCh1bml0c0NvbnRyb2wudmFsdWUpO1xuICAgICAgICBjb25zdCBiYWxhbmNlVmFsdWUgPSBiYWxhbmNlQ29udHJvbC52YWx1ZTtcbiAgICAgICAgY29uc3QgYmFsYW5jZUNhbGN1bGF0ZWQgPSB0aGlzLmNhbGN1bGF0ZUJhbGFuY2UodW5pdHNWYWx1ZSwgYmFsYW5jZVZhbHVlKTtcbiAgICAgICAgaWYgKGJhbGFuY2VDYWxjdWxhdGVkID4gTUFYX0FMTE9XRURfQkFMQU5DRSkge1xuICAgICAgICAgIHJlc3BvbnNlID0geyBmb3JtX3ZhbGlkYXRpb25fdW5pdHNfYmFsYW5jZV9tYXhpbXVtOiB0cnVlIH07XG4gICAgICAgIH0gZWxzZSBpZiAoYmFsYW5jZUNhbGN1bGF0ZWQgPCBNSU5fQUxMT1dFRF9CQUxBTkNFKSB7XG4gICAgICAgICAgcmVzcG9uc2UgPSB7IGZvcm1fdmFsaWRhdGlvbl91bml0c19iYWxhbmNlX21pbmltdW06IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgbWluRGF0ZVRpbWUoY29udHJvbE5hbWU6IHN0cmluZywgbWluRGF0ZVRpbWVWYWx1ZTogRGF0ZSk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2xHcm91cDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgbGV0IHJlc3BvbnNlID0gbnVsbDsgLy8gUmV0dXJuIG51bGwgaWYgdmFsaWRhdGlvbiBwYXNzZXNcblxuICAgICAgaWYgKGNvbnRyb2xHcm91cC5wYXJlbnQpIHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gY29udHJvbEdyb3VwLnBhcmVudCBhcyBGb3JtR3JvdXA7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKTtcbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlOiBEYXRlID0gY29udHJvbC52YWx1ZTtcblxuICAgICAgICBpZiAoY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbERhdGUgPSBuZXcgRGF0ZShjb250cm9sVmFsdWUpLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICAgIGNvbnN0IG1pbkRhdGUgPSBuZXcgRGF0ZShtaW5EYXRlVGltZVZhbHVlKS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgICAgICAgIGlmIChjb250cm9sRGF0ZSA8IG1pbkRhdGUpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geyBmb3JtX3ZhbGlkYXRpb25faW52YWxpZF9mcm9tX3RpbWU6IHRydWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbVRvRGF0ZShmcm9tRGF0ZUZpZWxkOiBzdHJpbmcsIHRvRGF0ZUZpZWxkOiBzdHJpbmcsIGZyb21UaW1lRmllbGQ6IHN0cmluZyA9IG51bGwsXG4gICAgdG9UaW1lRmllbGQ6IHN0cmluZyA9IG51bGwsIGVycm9yTmFtZTogc3RyaW5nID0gJ2Zyb21Ub0RhdGUnKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW47IH0gfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGZyb21EYXRlOiBEYXRlID0gZm9ybUdyb3VwLmdldChmcm9tRGF0ZUZpZWxkKT8udmFsdWU7XG4gICAgICBjb25zdCB0b0RhdGU6IERhdGUgPSBmb3JtR3JvdXAuZ2V0KHRvRGF0ZUZpZWxkKT8udmFsdWU7XG4gICAgICBjb25zdCBmcm9tVGltZTogVGliYVRpbWUgPSBmb3JtR3JvdXAuZ2V0KGZyb21UaW1lRmllbGQpPy52YWx1ZTtcbiAgICAgIGNvbnN0IHRvVGltZTogVGliYVRpbWUgPSBmb3JtR3JvdXAuZ2V0KHRvVGltZUZpZWxkKT8udmFsdWU7XG4gICAgICBpZiAoZnJvbVRpbWUpIHtcbiAgICAgICAgZnJvbURhdGUuc2V0SG91cnMoZnJvbVRpbWUuaG91cnMpO1xuICAgICAgICBmcm9tRGF0ZS5zZXRNaW51dGVzKGZyb21UaW1lLm1pbnV0ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHRvVGltZSkge1xuICAgICAgICB0b0RhdGUuc2V0SG91cnModG9UaW1lLmhvdXJzKTtcbiAgICAgICAgdG9EYXRlLnNldE1pbnV0ZXModG9UaW1lLm1pbnV0ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKChmcm9tRGF0ZSAhPT0gbnVsbCAmJiB0b0RhdGUgIT09IG51bGwpICYmIGZyb21EYXRlID4gdG9EYXRlKSB7XG4gICAgICAgIHJldHVybiB7IFtlcnJvck5hbWVdOiB0cnVlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZyb21Ub1RpbWVSYW5nZShmcm9tVGltZUZpZWxkOiBzdHJpbmcsIHRvVGltZUZpZWxkOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChmb3JtR3JvdXA6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHRvQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQodG9UaW1lRmllbGQpO1xuICAgICAgY29uc3QgZnJvbUNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZyb21UaW1lRmllbGQpO1xuXG4gICAgICAvLyBLZWVwIGV4aXN0aW5nIGVycm9yc1xuICAgICAgY29uc3QgZXhpc3RpbmdGcm9tRXJyb3JzID0gZnJvbUNvbnRyb2wuZXJyb3JzIHx8IHt9O1xuICAgICAgY29uc3QgZXhpc3RpbmdUb0Vycm9ycyA9IHRvQ29udHJvbC5lcnJvcnMgfHwge307XG5cbiAgICAgIC8vIFJlbW92ZSBvbmx5IG91ciBjdXN0b20gZXJyb3JzXG4gICAgICBkZWxldGUgZXhpc3RpbmdGcm9tRXJyb3JzW0xvY2FsaXphdGlvbi5mb3JtX3ZhbGlkYXRpb25faW52YWxpZF90aW1lX3JhbmdlXTtcbiAgICAgIGRlbGV0ZSBleGlzdGluZ1RvRXJyb3JzW0xvY2FsaXphdGlvbi5mb3JtX3ZhbGlkYXRpb25faW52YWxpZF90aW1lX3JhbmdlXTtcblxuICAgICAgaWYgKHRoaXMuaXNWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbFRvKGZyb21Db250cm9sLCB0b0NvbnRyb2wpICYmIHRoaXMuaXNWYWx1ZUxlbmd0aFZhbGlkKGZyb21Db250cm9sLCB0b0NvbnRyb2wpKSB7XG4gICAgICAgIGV4aXN0aW5nRnJvbUVycm9yc1tMb2NhbGl6YXRpb24uZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfdGltZV9yYW5nZV0gPSB0cnVlO1xuICAgICAgICBleGlzdGluZ1RvRXJyb3JzW0xvY2FsaXphdGlvbi5mb3JtX3ZhbGlkYXRpb25faW52YWxpZF90aW1lX3JhbmdlXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGJhY2sgZXJyb3JzIG9yIG51bGwgaWYgbm9uZVxuICAgICAgZnJvbUNvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGV4aXN0aW5nRnJvbUVycm9ycykubGVuZ3RoID8gZXhpc3RpbmdGcm9tRXJyb3JzIDogbnVsbCk7XG4gICAgICB0b0NvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGV4aXN0aW5nVG9FcnJvcnMpLmxlbmd0aCA/IGV4aXN0aW5nVG9FcnJvcnMgOiBudWxsKTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVG9UaW1lKGZyb21UaW1lRmllbGQ6IHN0cmluZywgdG9UaW1lRmllbGQ6IHN0cmluZywgYWxsb3dTYW1lRGF0ZVJhbmdlQm91bmRzOiBib29sZWFuID0gdHJ1ZSk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuOyB9IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBmcm9tVGltZTogVGliYVRpbWUgPSBmb3JtR3JvdXAuZ2V0KGZyb21UaW1lRmllbGQpLnZhbHVlO1xuICAgICAgY29uc3QgdG9UaW1lOiBUaWJhVGltZSA9IGZvcm1Hcm91cC5nZXQodG9UaW1lRmllbGQpLnZhbHVlO1xuXG4gICAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgZWl0aGVyIHZhbHVlIGlzIG1pc3NpbmdcbiAgICAgIGlmICh0aGlzLmlzVGltZU51bGwoZnJvbVRpbWUpIHx8IHRoaXMuaXNUaW1lTnVsbCh0b1RpbWUpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmcm9tVG90YWxNaW51dGVzID0gZnJvbVRpbWUuaG91cnMgKiA2MCArIGZyb21UaW1lLm1pbnV0ZXM7XG4gICAgICBjb25zdCB0b1RvdGFsTWludXRlcyA9IHRvVGltZS5ob3VycyAqIDYwICsgdG9UaW1lLm1pbnV0ZXM7XG5cbiAgICAgIGlmICgoZnJvbVRvdGFsTWludXRlcyA+IHRvVG90YWxNaW51dGVzKSB8fCAoIWFsbG93U2FtZURhdGVSYW5nZUJvdW5kcyAmJiBmcm9tVG90YWxNaW51dGVzID09PSB0b1RvdGFsTWludXRlcykpIHtcbiAgICAgICAgcmV0dXJuIHsgZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfdGltZV9yYW5nZTogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNUaW1lTnVsbCA9ICh0aW1lOiBUaWJhVGltZSkgPT4gdGltZSA9PT0gbnVsbCB8fFxuICAgICh0aW1lLmhvdXJzID09PSBudWxsICYmIHRpbWUubWludXRlcyA9PT0gbnVsbCAmJiB0aW1lLnNlY29uZHMgPT09IG51bGwpO1xuXG4gIHN0YXRpYyBub1doaXRlc3BhY2VWYWxpZGF0b3IgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyA9PlxuICAgICFpc051bGxPckVtcHR5KGNvbnRyb2wudmFsdWUpICYmIGlzTnVsbE9yRW1wdHkoY29udHJvbD8udmFsdWU/LnRyaW0oKSkgPyB7IHJlcXVpcmVkOiB0cnVlIH0gOiBudWxsO1xuXG4gIHN0YXRpYyBub1doaXRlc3BhY2VXaXRoaW5TZW50ZW5jZVZhbGlkYXRvciA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzID0+XG4gICAgIShjb250cm9sPy52YWx1ZT8uc3BsaXQoXCIgXCIpLmxlbmd0aCA9PT0gMSkgPyB7IG5vV2hpdGVzcGFjZVdpdGhpblNlbnRlbmNlOiB0cnVlIH0gOiBudWxsO1xuXG4gIHN0YXRpYyBub0RvdFdpdGhpblNlbnRlbmNlVmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgPT5cbiAgICBjb250cm9sPy52YWx1ZT8uaW5jbHVkZXMoXCIuXCIpID8geyBub0RvdFdpdGhpblNlbnRlbmNlOiB0cnVlIH0gOiBudWxsO1xuXG4gIHN0YXRpYyB0ZXJtc1BvbGljeUNoZWNrYm94KCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBpbnZhbGlkVGVybXM6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVEZWZhdWx0QWNjZXNzUHJvZmlsZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkoY29udHJvbC52YWx1ZSkgJiYgIWNvbnRyb2wudmFsdWU/LmRlZmF1bHRBY2Nlc3NQcm9maWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub0RlZmF1bHRBY2Nlc3NQcm9maWxlOiB7XG4gICAgICAgICAgY29tcGFueU5hbWU6IGNvbnRyb2wudmFsdWUubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHpSYW5nZSh0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLCBmcm9tWkZpZWxkOiBzdHJpbmcsIHRvWkZpZWxkOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChmb3JtR3JvdXA6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBmcm9tWkNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZyb21aRmllbGQpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICBjb25zdCB0b1pDb250cm9sID0gZm9ybUdyb3VwLmdldCh0b1pGaWVsZCkgYXMgVW50eXBlZEZvcm1BcnJheTtcblxuICAgICAgaWYgKGZyb21aQ29udHJvbC52YWx1ZT8uaWQgPiB0b1pDb250cm9sLnZhbHVlPy5pZCkge1xuICAgICAgICByZXR1cm4geyB6UmFuZ2U6IHRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChMb2NhbGl6YXRpb24uaW52YWxpZF9maWVsZHMpIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgcmFuZ2VEZWx0YVZhbGlkYXRvcihmcm9tRmllbGQ6IHN0cmluZywgdG9GaWVsZDogc3RyaW5nLCBtYXhEZWx0YTogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgbGV0IHJlc3BvbnNlID0gbnVsbDsgLy8gUmV0dXJuIG51bGwgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICAgIGNvbnN0IHRvQ29udHJvbCA9IGNvbnRyb2wuZ2V0KHRvRmllbGQpO1xuICAgICAgY29uc3QgZnJvbUNvbnRyb2wgPSBjb250cm9sLmdldChmcm9tRmllbGQpO1xuXG4gICAgICBpZiAoZnJvbUNvbnRyb2wgJiYgdG9Db250cm9sKSB7XG4gICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb21Db250cm9sLnZhbHVlO1xuICAgICAgICBjb25zdCB0b1ZhbHVlID0gdG9Db250cm9sLnZhbHVlO1xuXG4gICAgICAgIC8vIE9ubHkgdmFsaWRhdGUgaWYgYm90aCB2YWx1ZXMgYXJlIHByZXNlbnQgYW5kIG5vdCBlbXB0eVxuICAgICAgICBpZiAoZnJvbVZhbHVlICE9IG51bGwgJiYgdG9WYWx1ZSAhPSBudWxsICYmIGZyb21WYWx1ZSAhPT0gJycgJiYgdG9WYWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICBjb25zdCBkZWx0YSA9IHRvVmFsdWUgLSBmcm9tVmFsdWU7XG5cbiAgICAgICAgICBpZiAoZGVsdGEgPiBtYXhEZWx0YSkge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICAgIHJhbmdlRGVsdGFFeGNlZWRlZDoge1xuICAgICAgICAgICAgICAgIGFjdHVhbERlbHRhOiBkZWx0YSxcbiAgICAgICAgICAgICAgICBtYXhEZWx0YTogbWF4RGVsdGEsXG4gICAgICAgICAgICAgICAgZnJvbTogZnJvbVZhbHVlLFxuICAgICAgICAgICAgICAgIHRvOiB0b1ZhbHVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHJlcXVpcmVkQ3JlZGVudGlhbHModHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSwgY2FyUGxhdGVGaWVsZDogc3RyaW5nID0gJ2NhclBsYXRlJywgbW9iaWxlRmllbGQ6IHN0cmluZyA9ICdtb2JpbGUnLCBiYWRnZUZpZWxkOiBzdHJpbmcgPSAnYmFkZ2UnLFxuICAgIGVtYWlsRmllbGQ6IHN0cmluZyA9ICdlbWFpbCcsIHNlbmRFbWFpbEZpZWxkOiBzdHJpbmcgPSAnc2VuZEVtYWlsJyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsID0+IHtcbiAgICAgIGxldCBjYXJQbGF0ZXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICBsZXQgYmFkZ2VzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgbGV0IGludGVycG9sYXRlZENyZWRlbnRpYWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAvLyBDYXJkc1xuICAgICAgY29uc3QgYmFkZ2VzRm9ybUFycmF5ID0gZm9ybUdyb3VwLmdldChiYWRnZUZpZWxkKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgaWYgKGJhZGdlc0Zvcm1BcnJheSkge1xuICAgICAgICBpbnRlcnBvbGF0ZWRDcmVkZW50aWFscy5wdXNoKHRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChMb2NhbGl6YXRpb24uY2FyZCkpO1xuICAgICAgICBiYWRnZXNJbnZhbGlkID0gdGhpcy5pc0Zvcm1Db250cm9sTGlzdEludmFsaWQoYmFkZ2VzRm9ybUFycmF5LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzQ2FyZHNJbnZhbGlkID0gYmFkZ2VzSW52YWxpZCB8fCAhYmFkZ2VzRm9ybUFycmF5O1xuXG4gICAgICAvL0NhciBwbGF0ZXNcbiAgICAgIGNvbnN0IGNhclBsYXRlc0Zvcm1BcnJheSA9IGZvcm1Hcm91cC5nZXQoY2FyUGxhdGVGaWVsZCkgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgIGlmIChjYXJQbGF0ZXNGb3JtQXJyYXkpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVkQ3JlZGVudGlhbHMucHVzaCh0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoTG9jYWxpemF0aW9uLmNhcl9wbGF0ZSkpO1xuICAgICAgICBjYXJQbGF0ZXNJbnZhbGlkID0gdGhpcy5pc0Zvcm1Db250cm9sTGlzdEludmFsaWQoY2FyUGxhdGVzRm9ybUFycmF5LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzQ2FyUGxhdGVzSW52YWxpZCA9IGNhclBsYXRlc0ludmFsaWQgfHwgIWNhclBsYXRlc0Zvcm1BcnJheTtcblxuICAgICAgLy8gTW9iaWxlXG4gICAgICBjb25zdCBtb2JpbGVGb3JtQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQobW9iaWxlRmllbGQpO1xuICAgICAgaWYgKG1vYmlsZUZvcm1Db250cm9sKSB7XG4gICAgICAgIGludGVycG9sYXRlZENyZWRlbnRpYWxzLnB1c2godHJhbnNsYXRlU2VydmljZS5pbnN0YW50KExvY2FsaXphdGlvbi5tb2JpbGUpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzTW9iaWxlSW52YWxpZCA9ICFtb2JpbGVGb3JtQ29udHJvbD8udmFsdWU7XG5cbiAgICAgIC8vIEVtYWlsXG4gICAgICBjb25zdCBlbWFpbEZvcm1Db250cm9sID0gZm9ybUdyb3VwLmdldChlbWFpbEZpZWxkKTtcbiAgICAgIGNvbnN0IHNlbmRFbWFpbEZvcm1Db250cm9sID0gZm9ybUdyb3VwLmdldChzZW5kRW1haWxGaWVsZCk7XG4gICAgICBpZiAoZW1haWxGb3JtQ29udHJvbCAmJiBzZW5kRW1haWxGb3JtQ29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVkQ3JlZGVudGlhbHMucHVzaCh0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoTG9jYWxpemF0aW9uLmVtYWlsKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpc0VtYWlsSW52YWxpZCA9ICEoc2VuZEVtYWlsRm9ybUNvbnRyb2w/LnZhbHVlICYmIGVtYWlsRm9ybUNvbnRyb2w/LnZhbHVlKTtcblxuICAgICAgY29uc3QgaXNSZXF1aXJlZENyZWRlbnRpYWxzID0gaXNDYXJQbGF0ZXNJbnZhbGlkICYmIGlzQ2FyZHNJbnZhbGlkICYmIGlzTW9iaWxlSW52YWxpZCAmJiBpc0VtYWlsSW52YWxpZDtcblxuICAgICAgaWYgKGlzUmVxdWlyZWRDcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCBsYXN0Q3JlZGVudGlhbCA9IGludGVycG9sYXRlZENyZWRlbnRpYWxzLnBvcCgpO1xuICAgICAgICBsZXQgaW50ZXJwb2xhdGVQYXJhbXMgPSBgJHtpbnRlcnBvbGF0ZWRDcmVkZW50aWFscy5qb2luKCcsICcpfSAke3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChMb2NhbGl6YXRpb24ub3IpfSAke2xhc3RDcmVkZW50aWFsfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWRDcmVkZW50aWFsczogdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KExvY2FsaXphdGlvbi5yZXF1aXJlZF9jcmVkZW50aWFsc19tZXNzYWdlLCB7IGNyZWRlbnRpYWxzOiBpbnRlcnBvbGF0ZVBhcmFtcyB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzRm9ybUNvbnRyb2xMaXN0SW52YWxpZChsaXN0OiBVbnR5cGVkRm9ybUNvbnRyb2xbXSkge1xuICAgIGxldCBpc0ludmFsaWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgbGlzdCkge1xuICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgIGlzSW52YWxpZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc0ludmFsaWQ7XG4gIH1cblxuICBzdGF0aWMgcmVxdWlyZWREYXlzKHNwZWNpYWxEYXlzRmllbGQ6IHN0cmluZywgd2Vla0RheXNGaWVsZDogc3RyaW5nLCBlcnJvck5hbWU6IHN0cmluZyA9ICdyZXF1aXJlZERheXMnKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW47IH0gfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHNwZWNpYWxEYXlzOiBudW1iZXIgPSBmb3JtR3JvdXAuZ2V0KHNwZWNpYWxEYXlzRmllbGQpLnZhbHVlO1xuICAgICAgY29uc3Qgd2Vla0RheXM6IG51bWJlciA9IGZvcm1Hcm91cC5nZXQod2Vla0RheXNGaWVsZCkudmFsdWU7XG4gICAgICBpZiAoc3BlY2lhbERheXMgPiAwIHx8IHdlZWtEYXlzID4gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgW2Vycm9yTmFtZV06IHRydWUgfTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGlzUm9sZU5hbWVFeGlzdHMocm9sZUNsb3VkU2VydmljZVByb3h5OiBDbG91ZC5Sb2xlQ2xvdWRTZXJ2aWNlUHJveHksIHJvbGVJZDogbnVtYmVyKTogQXN5bmNWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnM+ID0+IHtcbiAgICAgIHJldHVybiBvZihjb250cm9sLnZhbHVlKS5waXBlKFxuICAgICAgICBkZWxheSg1MDApLFxuICAgICAgICBkZWJvdW5jZVRpbWUoSU5QVVRfU0VBUkNIX0RFQk9VTkNFX1RJTUUpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gcm9sZUNsb3VkU2VydmljZVByb3h5LmlzRXhpc3RzKGNvbnRyb2wudmFsdWUsIHJvbGVJZCA/PyB1bmRlZmluZWQpLnBpcGUoXG4gICAgICAgICAgbWFwKHJlcyA9PiByZXMuZGF0YSA9PT0gdHJ1ZSB8fCAhcmVzLmlzU3VjY2VzcyA/IHsgcm9sZU5hbWVBbHJlYWR5RXhpc3RzOiB0cnVlIH0gOiBudWxsKSkpKTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGlzQWNjZXNzUHJvZmlsZU51bWJlckF2YWlsYWJsZShhY2Nlc3NQcm9maWxlUnBjU2VydmljZVByb3h5OiBScGMuQWNjZXNzUHJvZmlsZVJwY1NlcnZpY2VQcm94eSwgZ3VpZDogc3RyaW5nLCBmYWNpbGl0eUlkOiBudW1iZXIsIGN1cnJlbnRWYWx1ZTogbnVtYmVyKTogQXN5bmNWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnM+ID0+IHtcbiAgICAgIHJldHVybiBvZihjb250cm9sLnZhbHVlKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAodmFsdWUgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIC8vIENhbGwgc2VydmljZSB0byBjaGVjayBpZiB0aGUgbnVtYmVyIGlzIGF2YWlsYWJsZVxuICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1Byb2ZpbGVScGNTZXJ2aWNlUHJveHkuZ2V0QXZhaWxhYmxlTnVtYmVyKGd1aWQsIGZhY2lsaXR5SWQsIHZhbHVlKS5waXBlKFxuICAgICAgICAgICAgICBtYXAocmVzID0+ICFyZXMuZGF0YT8uaXNBdmFpbGFibGUgfHwgIXJlcy5pc1N1Y2Nlc3MgPyB7IGFjY2Vzc1Byb2ZpbGVOdW1iZXJUYWtlbjogdHJ1ZSB9IDogbnVsbCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZSBjdXJyZW50IHZhbHVlIGlzIGF2YWlsYWJsZVxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgdGliYVRpbWVWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbDogVGliYVRpbWUgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgY29uc3QgaGFzSW52YWxpZFRpbWUgPVxuICAgICAgdmFsICYmXG4gICAgICAoKHZhbC5ob3VycyAhPSBudWxsICYmIHZhbC5taW51dGVzID09IG51bGwpIHx8XG4gICAgICAgICh2YWwuaG91cnMgPT0gbnVsbCAmJiB2YWwubWludXRlcyAhPSBudWxsKSk7XG5cbiAgICByZXR1cm4gaGFzSW52YWxpZFRpbWUgPyB7IGludmFsaWRUaW1lOiB0cnVlIH0gOiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlVGliYVRpbWVJblJhbmdlVmFsaWRhdG9yKG1pblRpbWU6IFRpYmFUaW1lLCBtYXhUaW1lOiBUaWJhVGltZSk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVGliYVRpbWVJblJhbmdlKGNvbnRyb2wudmFsdWUsIG1pblRpbWUsIG1heFRpbWUpO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZW50cnlFeGl0UmVxdWlyZWRWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGVudHJ5ID0gY29udHJvbC5nZXQoJ2VudHJ5Jyk/LnZhbHVlO1xuICAgIGNvbnN0IGV4aXQgPSBjb250cm9sLmdldCgnZXhpdCcpPy52YWx1ZTtcblxuICAgIGNvbnN0IGJvdGhFbXB0eSA9ICFlbnRyeSAmJiAhZXhpdDtcblxuICAgIHJldHVybiBib3RoRW1wdHkgPyB7IHJlcXVpcmVkOiB0cnVlIH0gOiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlU3RyaW5nSEhNTUluUmFuZ2VWYWxpZGF0b3IobWluVGltZTogVGliYVRpbWUsIG1heFRpbWU6IFRpYmFUaW1lKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgaWYgKCEhY29udHJvbC52YWx1ZSkge1xuICAgICAgICBpZiAoY29udHJvbC52YWx1ZS5sZW5ndGggIT09IDQpIHsgLy8gQXNzdW1pbmcgdGltZSBmb3JtYXQgaXMgJ0hITU0nXG4gICAgICAgICAgcmV0dXJuIHsgZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfdGltZV9mb3JtYXQ6IHRydWUgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBob3VyczogbnVtYmVyID0gcGFyc2VJbnQoY29udHJvbC52YWx1ZS5zbGljZSgwLCAyKSk7XG4gICAgICAgICAgY29uc3QgbWludXRlczogbnVtYmVyID0gcGFyc2VJbnQoY29udHJvbC52YWx1ZS5zbGljZSgyKSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRpbWU6IFRpYmFUaW1lID0geyBob3VycywgbWludXRlcyB9O1xuICAgICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVGliYVRpbWVJblJhbmdlKGN1cnJlbnRUaW1lLCBtaW5UaW1lLCBtYXhUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyB0aW1lUmFuZ2VBcnJheU92ZXJsYXBWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgaWYgKGNvbnRyb2wudmFsaWQgJiYgY29udHJvbC5lbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSBmb3JtQXJyYXlbaV07XG4gICAgICAgICAgY29uc3QgY3VycmVudEZyb20gPSB0aW1lVG9Nb21lbnQoY3VycmVudFJhbmdlLmZyb20pO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUbyA9IHRpbWVUb01vbWVudChjdXJyZW50UmFuZ2UudG8pO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRGcm9tICYmIGN1cnJlbnRUbykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgZm9ybUFycmF5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVSYW5nZSA9IGZvcm1BcnJheVtqXTtcbiAgICAgICAgICAgICAgY29uc3QgY29tcGFyZUZyb20gPSB0aW1lVG9Nb21lbnQoY29tcGFyZVJhbmdlLmZyb20pO1xuICAgICAgICAgICAgICBjb25zdCBjb21wYXJlVG8gPSB0aW1lVG9Nb21lbnQoY29tcGFyZVJhbmdlLnRvKTtcblxuICAgICAgICAgICAgICBpZiAoY29tcGFyZUZyb20gJiYgY29tcGFyZVRvKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJsYXBcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZXNPdmVybGFwID0gY3VycmVudEZyb20uaXNCZWZvcmUoY29tcGFyZVRvKSAmJiBjdXJyZW50VG8uaXNBZnRlcihjb21wYXJlRnJvbSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmFuZ2VzT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZm9ybV92YWxpZGF0aW9uX3RpbWVfcmFuZ2Vfb3ZlcmxhcDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHJldmVydEF0Q29tcGFyaXNvblZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBjb21wYXJpc29uVHlwZSA9IGZvcm1Db250cm9sLmdldCgnY29tcGFyaXNvblR5cGUnKT8udmFsdWU7XG4gICAgY29uc3Qgb2NjdXBhbmN5VmFsdWVDdHJsID0gZm9ybUNvbnRyb2wuZ2V0KCdvY2N1cGFuY3lWYWx1ZScpO1xuICAgIGNvbnN0IHJldmVydEF0VmFsdWVDdHJsID0gZm9ybUNvbnRyb2wuZ2V0KCdyZXZlcnRBdFZhbHVlJyk7XG5cbiAgICBpZiAoIW9jY3VwYW5jeVZhbHVlQ3RybCB8fCAhcmV2ZXJ0QXRWYWx1ZUN0cmwpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgb2NjdXBhbmN5VmFsdWUgPSArb2NjdXBhbmN5VmFsdWVDdHJsLnZhbHVlO1xuICAgIGNvbnN0IHJldmVydEF0VmFsdWUgPSArcmV2ZXJ0QXRWYWx1ZUN0cmwudmFsdWU7XG5cbiAgICAvLyBLZWVwIGV4aXN0aW5nIGVycm9yc1xuICAgIGNvbnN0IGV4aXN0aW5nRXJyb3JzID0gcmV2ZXJ0QXRWYWx1ZUN0cmwuZXJyb3JzIHx8IHt9O1xuXG4gICAgLy8gUmVtb3ZlIG9ubHkgb3VyIGN1c3RvbSBlcnJvcnNcbiAgICBkZWxldGUgZXhpc3RpbmdFcnJvcnNbJ3JldmVydF9hdF9tdXN0X2JlX2xlc3NfdGhhbl9vY2N1cGFuY3knXTtcbiAgICBkZWxldGUgZXhpc3RpbmdFcnJvcnNbJ3JldmVydF9hdF9tdXN0X2JlX21vcmVfdGhhbl9vY2N1cGFuY3knXTtcblxuICAgIGlmIChjb21wYXJpc29uVHlwZSA9PT0gQ2xvdWQuRHluYW1pY1ByaWNpbmdDb21wYXJpc29uVHlwZS5Nb3JlVGhhbikge1xuICAgICAgaWYgKHJldmVydEF0VmFsdWUgPj0gb2NjdXBhbmN5VmFsdWUpIHtcbiAgICAgICAgZXhpc3RpbmdFcnJvcnNbJ3JldmVydF9hdF9tdXN0X2JlX2xlc3NfdGhhbl9vY2N1cGFuY3knXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbXBhcmlzb25UeXBlID09PSBDbG91ZC5EeW5hbWljUHJpY2luZ0NvbXBhcmlzb25UeXBlLkxlc3NUaGFuKSB7XG4gICAgICBpZiAocmV2ZXJ0QXRWYWx1ZSA8PSBvY2N1cGFuY3lWYWx1ZSkge1xuICAgICAgICBleGlzdGluZ0Vycm9yc1sncmV2ZXJ0X2F0X211c3RfYmVfbW9yZV90aGFuX29jY3VwYW5jeSddID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBiYWNrIGVycm9ycyBvciBudWxsIGlmIG5vbmVcbiAgICByZXZlcnRBdFZhbHVlQ3RybC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXhpc3RpbmdFcnJvcnMpLmxlbmd0aCA/IGV4aXN0aW5nRXJyb3JzIDogbnVsbCk7XG5cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICogVmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGEgbnVtYmVyIGlzIGEgbXVsdGlwbGUgb2YgYSBzcGVjaWZpZWQgc3RlcC5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciB2YWxpZGF0aW5nIGlucHV0cyBsaWtlIGN1cnJlbmN5IGFtb3VudHMgb3Igb3RoZXIgdmFsdWVzIHRoYXQgc2hvdWxkXG4gKiBmb2xsb3cgYSBzcGVjaWZpYyBpbmNyZW1lbnQgcGF0dGVybi5cbiAqXG4gKiBAcGFyYW0gc3RlcCAtIFRoZSBzdGVwIHNpemUgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgKGUuZy4sIDAuMDUgZm9yIGN1cnJlbmN5KS5cbiAqIEByZXR1cm5zIEEgVmFsaWRhdG9yRm4gdGhhdCBjaGVja3MgaWYgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGlzIGEgbXVsdGlwbGUgb2YgdGhlIHN0ZXAuXG4gKlxuICogVXNhZ2U6XG4gKiBjb25zdCBzdGVwVmFsaWRhdG9yID0gTXlDbGFzcy5hbW91bnRTdGVwVmFsaWRhdG9yKDAuMDUpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgdmFsdWUgaXMgMC4xMCBhbmQgdGhlIHN0ZXAgaXMgMC4wNSwgdGhlIHZhbGlkYXRvciB3aWxsIHBhc3MuXG4gKiAvLyBJZiB0aGUgdmFsdWUgaXMgMC4xMiBhbmQgdGhlIHN0ZXAgaXMgMC4wNSwgdGhlIHZhbGlkYXRvciB3aWxsIGZhaWwuXG4gKi9cbiAgc3RhdGljIGFtb3VudFN0ZXBWYWxpZGF0b3Ioc3RlcDogbnVtYmVyKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSArY29udHJvbC52YWx1ZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgbnVtYmVyIGFuZCBpZiBpdCBpcyBhIG11bHRpcGxlIG9mIHRoZSBzdGVwXG4gICAgICBpZiAoaXNOYU4odmFsdWUpIHx8ICsoTWF0aC5yb3VuZCh2YWx1ZSAvIHN0ZXApICogc3RlcCkudG9GaXhlZCgyKSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7ICAvLyB2YWxpZCB2YWx1ZVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLCByZXR1cm4gYW4gZXJyb3Igd2l0aCB0aGUgc3RlcCB2YWx1ZVxuICAgICAgcmV0dXJuIHsgaW52YWxpZFN0ZXA6IHN0ZXAudG9GaXhlZCgyKSB9O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1ZhbHVlR3JlYXRlclRoYW5PckVxdWFsVG8oZnJvbUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgdG9Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBjb25zdCBmcm9tVGltZUluTnVtYmVyOiBudW1iZXIgPSBmcm9tQ29udHJvbC52YWx1ZTtcbiAgICBjb25zdCB0b1RpbWVJbk51bWJlcjogbnVtYmVyID0gdG9Db250cm9sLnZhbHVlO1xuICAgIHJldHVybiBmcm9tVGltZUluTnVtYmVyICE9PSBudWxsICYmIHRvVGltZUluTnVtYmVyICE9PSBudWxsICYmICtmcm9tVGltZUluTnVtYmVyID4gK3RvVGltZUluTnVtYmVyO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGlzVmFsdWVMZW5ndGhWYWxpZChmcm9tQ29udHJvbDogQWJzdHJhY3RDb250cm9sLCB0b0NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZyb21UaW1lSW5OdW1iZXI6IG51bWJlciA9IGZyb21Db250cm9sLnZhbHVlO1xuICAgIGNvbnN0IHRvVGltZUluTnVtYmVyOiBudW1iZXIgPSB0b0NvbnRyb2wudmFsdWU7XG4gICAgcmV0dXJuIGZyb21UaW1lSW5OdW1iZXIudG9TdHJpbmcoKS5sZW5ndGggPT09IFZBTElEX1RJTUVfTUFYX0xFTkdUSCAmJlxuICAgICAgdG9UaW1lSW5OdW1iZXIudG9TdHJpbmcoKS5sZW5ndGggPT09IFZBTElEX1RJTUVfTUFYX0xFTkdUSDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlVGliYVRpbWVJblJhbmdlKGN1cnJlbnRUaW1lOiBUaWJhVGltZSwgbWluVGltZTogVGliYVRpbWUsIG1heFRpbWU6IFRpYmFUaW1lKTogeyBmb3JtX3ZhbGlkYXRpb25faW52YWxpZF90aW1lOiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZzsgfTsgfSB8IG51bGwge1xuICAgIC8vIElmIHRpbWUgaXMgdW5kZWZpbmVkLCByZXR1cm4gbnVsbCAobm8gZXJyb3IpXG4gICAgaWYgKCFjdXJyZW50VGltZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0VGltZSA9ICh0aW1lOiBUaWJhVGltZSk6IHN0cmluZyA9PlxuICAgICAgYCR7dGltZS5ob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7dGltZS5taW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuXG4gICAgY29uc3QgaG91cnM6IG51bWJlciA9ICtjdXJyZW50VGltZS5ob3VycztcbiAgICBjb25zdCBtaW51dGVzOiBudW1iZXIgPSArY3VycmVudFRpbWUubWludXRlcztcblxuICAgIGNvbnN0IGlzVmFsaWRUaW1lID1cbiAgICAgIChob3VycyA+IG1pblRpbWUuaG91cnMgfHwgKGhvdXJzID09PSBtaW5UaW1lLmhvdXJzICYmIG1pbnV0ZXMgPj0gbWluVGltZS5taW51dGVzKSkgJiZcbiAgICAgIChob3VycyA8IG1heFRpbWUuaG91cnMgfHwgKGhvdXJzID09PSBtYXhUaW1lLmhvdXJzICYmIG1pbnV0ZXMgPD0gbWF4VGltZS5taW51dGVzKSk7XG5cbiAgICAvLyBJZiB0aW1lIGlzIHZhbGlkLCByZXR1cm4gbnVsbCAobm8gZXJyb3IpXG4gICAgaWYgKGlzVmFsaWRUaW1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgdmFsaWRhdGlvbiBlcnJvciB3aXRoIGZvcm1hdHRlZCB0aW1lIHJhbmdlXG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX3RpbWU6IHtcbiAgICAgICAgZnJvbTogZm9ybWF0VGltZShtaW5UaW1lKSxcbiAgICAgICAgdG86IGZvcm1hdFRpbWUobWF4VGltZSksXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBjYXJQbGF0ZVNlcXVlbnRpYWxSZXF1aXJlZChjYXJQbGF0ZUZpZWxkOiBzdHJpbmcgPSAnY2FyUGxhdGUnKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBjYXJQbGF0ZUFycmF5ID0gZm9ybUdyb3VwLmdldChjYXJQbGF0ZUZpZWxkKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgaWYgKCFjYXJQbGF0ZUFycmF5KSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgcmF3VmFsdWVzID0gY2FyUGxhdGVBcnJheS5jb250cm9scy5tYXAoYyA9PiBjLmdldCgndmFsdWUnKT8udmFsdWUgPz8gJycpO1xuICAgICAgY29uc3QgdmFsdWVzID0gcmF3VmFsdWVzLm1hcCh2ID0+IHYudHJpbSgpKTtcbiAgICAgIGNvbnN0IGxhc3RGaWxsZWRJbmRleCA9IHZhbHVlcy5yZWR1Y2UoKGxhc3QsIHYsIGkpID0+ICh2ID8gaSA6IGxhc3QpLCAtMSk7XG5cbiAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYXJQbGF0ZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQ29udHJvbCA9IGNhclBsYXRlQXJyYXkuYXQoaSkuZ2V0KCd2YWx1ZScpO1xuICAgICAgICBpZiAoIXZhbHVlQ29udHJvbCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaXNHYXAgPSAhdmFsdWVzW2ldICYmIGkgPCBsYXN0RmlsbGVkSW5kZXg7XG4gICAgICAgIGNvbnN0IGlzV2hpdGVzcGFjZU9ubHkgPSByYXdWYWx1ZXNbaV0gIT09ICcnICYmICF2YWx1ZXNbaV07XG4gICAgICAgIGNvbnN0IGlzUHJvYmxlbWF0aWMgPSBpc0dhcCB8fCBpc1doaXRlc3BhY2VPbmx5O1xuICAgICAgICBpZiAoaXNQcm9ibGVtYXRpYykge1xuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSB7IC4uLih2YWx1ZUNvbnRyb2wuZXJyb3JzID8/IHt9KSwgY2FyX3BsYXRlX3NlcXVlbnRpYWxfcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgICAgICB2YWx1ZUNvbnRyb2wuc2V0RXJyb3JzKGVycm9ycyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDb250cm9sLmhhc0Vycm9yKCdjYXJfcGxhdGVfc2VxdWVudGlhbF9yZXF1aXJlZCcpKSB7XG4gICAgICAgICAgY29uc3QgeyBjYXJfcGxhdGVfc2VxdWVudGlhbF9yZXF1aXJlZCwgLi4ucmVzdCB9ID0gdmFsdWVDb250cm9sLmVycm9ycztcbiAgICAgICAgICB2YWx1ZUNvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA/IHJlc3QgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFzRXJyb3IgPyB7IGNhcl9wbGF0ZV9zZXF1ZW50aWFsX3JlcXVpcmVkOiB0cnVlIH0gOiBudWxsO1xuICAgIH07XG4gIH1cblxufVxuIl19
|
|
717
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXZhbGlkYXRvci51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXNoYXJlZC1saWIvc3JjL2xpYnJhcmllcy91dGlscy9jdXN0b20tdmFsaWRhdG9yLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFvQixZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFM0UsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHlDQUF5QyxDQUFDO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyx5SEFBeUgsQ0FBQztBQUN2SixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztBQUM1QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxVQUFVLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcseUJBQXlCLENBQUM7QUFDNUQsTUFBTSxDQUFDLE1BQU0sMEJB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QUksRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQzdELFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pFLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hELENBQUMsQ0FBQztJQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEFzeW5jVmFsaWRhdG9yRm4sIEZvcm1Hcm91cCwgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGRlYm91bmNlVGltZSwgZGVsYXksIG1hcCwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSU5QVVRfU0VBUkNIX0RFQk9VTkNFX1RJTUUsIFZBTElEX1RJTUVfTUFYX0xFTkdUSCB9IGZyb20gJy4uL2NvbnN0YW50cy9nbG9iYWwtY29uc3RhbnRzJztcbmltcG9ydCB7IExvY2FsaXphdGlvbiB9IGZyb20gJy4uL2VudW1zL2xvY2FsaXphdGlvbi5lbnVtJztcbmltcG9ydCB7IENsb3VkLCBScGMgfSBmcm9tICcuLi9zZXJ2aWNlLXByb3h5JztcbmltcG9ydCB7IGhhc1Vuc2FmZUh0bWxWYWx1ZSB9IGZyb20gJy4uL3NlcnZpY2VzL2h0bWwtc2FuaXRpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWlkZGF5UGVyaW9kLCBUaW1lIGFzIFRpYmFUaW1lLCB0aW1lVG9Nb21lbnQgfSBmcm9tICcuL2RhdGUudXRpbCc7XG5cbmNvbnN0IE1JTl9BTExPV0VEX0JBTEFOQ0UgPSAwO1xuY29uc3QgTUFYX0FMTE9XRURfQkFMQU5DRSA9IDI1NTtcbmV4cG9ydCBjb25zdCBub0Vtb2ppUmVnZXggPSAvW15hLXpBLVowLTlcXHUwMEMwLVxcdTAxN0ZcXHUwNURFXFx1MDVFNiBdL2c7XG5leHBvcnQgY29uc3QgcGFzc3dvcmRSZWdleCA9IC9eKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qXFxkKSg/PS4qWyFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX5dKVtBLVphLXpcXGQhXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXF1eX2B7fH1+XXs0LH0kL2c7XG5leHBvcnQgY29uc3QgYWxwaGFudW1lcmljUmVnZXggPSAvXlthLXpBLVowLTldKyQvO1xuZXhwb3J0IGNvbnN0IG1vYmlsZVJlZ2V4ID0gL15bMC05XSskLztcbmV4cG9ydCBjb25zdCBpbnRlZ2VyTnVtYmVyUmVnZXggPSAvXi0/XFxkKyQvO1xuZXhwb3J0IGNvbnN0IGludGVnZXJQb3NpdGl2ZU51bWJlclJlZ2V4ID0gL15bMC05XSskLztcbmV4cG9ydCBjb25zdCBkZWNpbWFsTnVtYmVyUmVnZXggPSAvXlstXT8oXFxkKykoXFwuXFxkezEsMn0pPyQvO1xuZXhwb3J0IGNvbnN0IGRlY2ltYWxQb3NpdGl2ZU51bWJlclJlZ2V4ID0gL14oXFxkKykoXFwuXFxkezEsMn0pPyQvO1xuZXhwb3J0IGNvbnN0IHJlZ2V4RXhwID0gL15bMC05YS1mQS1GXXs4fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXsxMn0kLztcbmV4cG9ydCBjb25zdCBwZXJjZW50YWdlUmVnZXggPSAvXigxMDB8WzEtOV0/WzAtOV0pJC87XG5leHBvcnQgY29uc3QgZGVjaW1hbFBlcmNlbnRhZ2VSZWdleCA9IC9eKDEwMCg/OlxcLjB7MSwyfSk/fFswLTldezEsMn0oPzpcXC5bMC05XXsxLDJ9KT8pJC87XG4vLyBFYWNoIG9jdGV0IG11c3QgYmUgMC0yNTUgd2l0aCBubyBsZWFkaW5nIHplcm9zIChlLmcuIFwiMTkyLjE2OC4zLjJcIiBpcyB2YWxpZCwgXCIxOTIuMTY4LjAzLjAyXCIgaXMgbm90KS5cbmV4cG9ydCBjb25zdCBpcHY0UmVnZXggPSAvXigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XT9bMC05XSkoXFwuKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldP1swLTldKSl7M30kLztcblxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JFbXB0eSh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09ICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBbVBtVG8yNEhvdXJzKHRpbWU6IFRpYmFUaW1lLCBlbmFibGVGdWxsRGF5OiBib29sZWFuKTogVGliYVRpbWUge1xuICBsZXQgX3RpbWU6IFRpYmFUaW1lID0gbnVsbDtcbiAgaWYgKHRpbWUpIHtcbiAgICBfdGltZSA9IHsgLi4udGltZSB9OyAvLyBTcHJlYWQgb3BlcmF0b3IgZm9yIGltbXV0YWJpbGl0eVxuXG4gICAgaWYgKHRpbWUubWlkZGF5UGVyaW9kID09PSBNaWRkYXlQZXJpb2QuUE0gJiYgK3RpbWUuaG91cnMgIT09IDEyKSB7XG4gICAgICBfdGltZS5ob3VycyA9ICtfdGltZS5ob3VycyArIDEyOyAvLyBDb252ZXJ0IFBNIGhvdXJzIChleGNlcHQgMTIgUE0pIHRvIDI0LWhvdXIgZm9ybWF0XG5cbiAgICB9IGVsc2UgaWYgKHRpbWUubWlkZGF5UGVyaW9kID09PSBNaWRkYXlQZXJpb2QuQU0gJiYgK3RpbWUuaG91cnMgPT09IDEyKSB7XG4gICAgICBfdGltZS5ob3VycyA9IGVuYWJsZUZ1bGxEYXkgPyAyNCA6IDA7ICAvLyBNaWRuaWdodCBjYXNlICgxMiBBTSBpcyAwMDowMCBpbiAyNC1ob3VyIHRpbWUgYW5kIDI0OjAwIHdoZW4gZnVsbCBkYXkgb3B0aW9uIGlzIGFjdGl2ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX3RpbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0MjRIb3Vyc1RvQW1QTSh0aW1lOiBUaWJhVGltZSk6IFRpYmFUaW1lIHtcbiAgbGV0IF90aW1lOiBUaWJhVGltZSA9IG51bGw7XG4gIGlmICh0aW1lKSB7XG4gICAgX3RpbWUgPSB7IC4uLnRpbWUgfTsgLy8gU3ByZWFkIG9wZXJhdG9yIGZvciBpbW11dGFiaWxpdHlcbiAgICBjb25zdCBob3VycyA9ICt0aW1lLmhvdXJzO1xuICAgIGlmIChob3VycyA+PSAwICYmIGhvdXJzIDw9IDExKSB7XG4gICAgICBfdGltZS5taWRkYXlQZXJpb2QgPSBNaWRkYXlQZXJpb2QuQU07XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMiAmJiBob3VycyA8PSAyMykge1xuICAgICAgX3RpbWUubWlkZGF5UGVyaW9kID0gTWlkZGF5UGVyaW9kLlBNO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDI0KSB7XG4gICAgICBfdGltZS5taWRkYXlQZXJpb2QgPSBNaWRkYXlQZXJpb2QuQU07XG4gICAgfVxuXG4gICAgaWYgKGhvdXJzID09PSAyNCkge1xuICAgICAgX3RpbWUuaG91cnMgPSAwO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPj0gMTIpIHtcbiAgICAgIF90aW1lLmhvdXJzID0gK190aW1lLmhvdXJzIC0gMTI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF90aW1lO1xufVxuXG5leHBvcnQgY2xhc3MgVGliYVZhbGlkYXRvcnMge1xuXG4gIHN0YXRpYyB1bnNhZmVIdG1sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gaGFzVW5zYWZlSHRtbFZhbHVlKGNvbnRyb2wudmFsdWUpID8geyBmb3JtX3ZhbGlkYXRpb25fdW5zYWZlX2h0bWw6IHRydWUgfSA6IG51bGw7XG4gIH1cblxuICBzdGF0aWMgaXB2NFZhbGlkYXRvcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKGlzTnVsbE9yRW1wdHkoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBpc1ZhbGlkID0gaXB2NFJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSk7XG4gICAgcmV0dXJuIGlzVmFsaWQgPyBudWxsIDogeyBpcHY0Rm9ybWF0OiB0cnVlIH07XG4gIH1cblxuICAvLyBSZWplY3RzIHRoZSBhbGwtemVyb3MgYWRkcmVzcyAoMC4wLjAuMCkg4oCUIGl0IHBhc3NlcyB0aGUgSVB2NCBmb3JtYXQgcmVnZXggYnV0IGlzIG5vdCBhIHJlYWwgaG9zdC5cbiAgc3RhdGljIGlwdjROb3RaZXJvVmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gY29udHJvbC52YWx1ZT8udHJpbSgpID09PSAnMC4wLjAuMCcgPyB7IGlwdjROb3RaZXJvOiB0cnVlIH0gOiBudWxsO1xuICB9XG5cbiAgLy8gRm9ybUFycmF5LWxldmVsIHZhbGlkYXRvcjogZmxhZ3MgZXZlcnkgdmFsdWUgY29udHJvbCB0aGF0IHJlcGVhdHMgYW5vdGhlciByb3cncyBJUC5cbiAgLy8gU2V0cy9jbGVhcnMgb25seSB0aGUgYGR1cGxpY2F0ZUlQYCBlcnJvciBzbyBvdGhlciBlcnJvcnMgb24gdGhlIGNvbnRyb2wgYXJlIHByZXNlcnZlZC5cbiAgc3RhdGljIG5vRHVwbGljYXRlSVBzVmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSBjb250cm9sIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgY29uc3QgY291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZm9ybUFycmF5LmNvbnRyb2xzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChncm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY291bnRzLnNldCh2YWx1ZSwgKGNvdW50cy5nZXQodmFsdWUpID8/IDApICsgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiBmb3JtQXJyYXkuY29udHJvbHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlQ29udHJvbCA9IGdyb3VwLmdldCgndmFsdWUnKTtcbiAgICAgIGlmICghdmFsdWVDb250cm9sKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9ICh2YWx1ZUNvbnRyb2wudmFsdWUgPz8gJycpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRXJyb3JzID0gdmFsdWVDb250cm9sLmVycm9ycyB8fCB7fTtcbiAgICAgIGRlbGV0ZSBleGlzdGluZ0Vycm9yc1snZHVwbGljYXRlSVAnXTtcblxuICAgICAgaWYgKHZhbHVlICYmIGNvdW50cy5nZXQodmFsdWUpID4gMSkge1xuICAgICAgICBleGlzdGluZ0Vycm9yc1snZHVwbGljYXRlSVAnXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlQ29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXhpc3RpbmdFcnJvcnMpLmxlbmd0aCA/IGV4aXN0aW5nRXJyb3JzIDogbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBObyBlbW9qaSB2YWxpZGF0aW9uXG4gIHN0YXRpYyBub0Vtb2ppKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWwgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCFpc051bGxPckVtcHR5KHZhbCkgJiYgdmFsLnRvU3RyaW5nKCkubWF0Y2gobm9FbW9qaVJlZ2V4KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9FbW9qaToge1xuICAgICAgICAgIHZhbHVlOiBgICcke3ZhbH0nYCxcbiAgICAgICAgICBwYXR0ZXJuOiBub0Vtb2ppUmVnZXhcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBwZXJjZW50YWdlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWwgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCFpc051bGxPckVtcHR5KHZhbCkgJiYgIXZhbC50b1N0cmluZygpLm1hdGNoKHBlcmNlbnRhZ2VSZWdleCkpIHtcbiAgICAgIHJldHVybiB7IGZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX3BlcmNlbnRhZ2U6IHRydWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBkZWNpbWFsUGVyY2VudGFnZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZTtcblxuICAgIGlmICghaXNOdWxsT3JFbXB0eSh2YWwpICYmICF2YWwudG9TdHJpbmcoKS5tYXRjaChkZWNpbWFsUGVyY2VudGFnZVJlZ2V4KSkge1xuICAgICAgcmV0dXJuIHsgZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfZGVjaW1hbF9wZXJjZW50YWdlOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBNb2JpbGUgb25seSB2YWxpZGF0aW9uXG4gIHN0YXRpYyBtb2JpbGVOdW1iZXJzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWwgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCFpc051bGxPckVtcHR5KHZhbCkgJiYgIXZhbC50b1N0cmluZygpLm1hdGNoKG1vYmlsZVJlZ2V4KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9iaWxlTnVtYmVyczoge1xuICAgICAgICAgIHZhbHVlOiBgICcke3ZhbH0nYCxcbiAgICAgICAgICBwYXR0ZXJuOiBtb2JpbGVSZWdleFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGhvdGVsUm9vbk51bWJlcnMoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiAhdmFsLnRvU3RyaW5nKCkubWF0Y2goYWxwaGFudW1lcmljUmVnZXgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbHBoYW51bWVyaWNSZWdleDoge1xuICAgICAgICAgIHZhbHVlOiBgICcke3ZhbH0nYCxcbiAgICAgICAgICBwYXR0ZXJuOiBhbHBoYW51bWVyaWNSZWdleFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VySW5jbHVkZVplcm8oY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiBUaWJhVmFsaWRhdG9ycy52YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcihjb250cm9sLCAwKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcldpdGhvdXRaZXJvKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gVGliYVZhbGlkYXRvcnMudmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoY29udHJvbCwgMSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBtaW5WYWx1ZTogbnVtYmVyKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICFpc051bGxPckVtcHR5KGNvbnRyb2wudmFsdWUpICYmXG4gICAgICAhKGNvbnRyb2wudmFsdWUudG9TdHJpbmcoKS5tYXRjaChpbnRlZ2VyTnVtYmVyUmVnZXgpICYmICtjb250cm9sLnZhbHVlID49IG1pblZhbHVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdGVQb3NpdGl2ZUludGVnZXI6IHtcbiAgICAgICAgICB2YWx1ZTogYCAnJHtjb250cm9sLnZhbHVlfSdgXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJbnRlZ2VyOiAtMTIzLCAxMjNcbiAgc3RhdGljIGludGVnZXJOdW1iZXIoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiAhdmFsLnRvU3RyaW5nKCkubWF0Y2goaW50ZWdlck51bWJlclJlZ2V4KSkgcmV0dXJuIHtcbiAgICAgIGludGVnZXJOdW1iZXI6IHtcbiAgICAgICAgdmFsdWU6IGAgJyR7dmFsfSdgLFxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEludGVnZXIgUG9zaXRpdmUgLT4gMTIzXG4gIHN0YXRpYyBpbnRlZ2VyUG9zaXRpdmVOdW1iZXIoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCFpc051bGxPckVtcHR5KHZhbCkgJiYgIXZhbC50b1N0cmluZygpLm1hdGNoKGludGVnZXJQb3NpdGl2ZU51bWJlclJlZ2V4KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW50ZWdlclBvc2l0aXZlTnVtYmVyOiB7XG4gICAgICAgICAgdmFsdWU6IGAgJyR7dmFsfSdgXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gRGVjaW1hbDogLTEuMjMsIDEuMjNcbiAgc3RhdGljIGRlY2ltYWxOdW1iZXIoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiAhdmFsLnRvU3RyaW5nKCkubWF0Y2goZGVjaW1hbE51bWJlclJlZ2V4KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVjaW1hbE51bWJlcjoge1xuICAgICAgICAgIHZhbHVlOiBgICcke3ZhbH0nYCxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIERlY2ltYWwgUG9zaXRpdmU6IDEuMjNcbiAgc3RhdGljIGRlY2ltYWxQb3NpdGl2ZU51bWJlcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAoIWlzTnVsbE9yRW1wdHkodmFsKSAmJiAhdmFsLnRvU3RyaW5nKCkubWF0Y2goZGVjaW1hbFBvc2l0aXZlTnVtYmVyUmVnZXgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWNpbWFsUG9zaXRpdmVOdW1iZXI6IHtcbiAgICAgICAgICB2YWx1ZTogYCAnJHt2YWx9J2AsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gTnVtYmVyIGxlbmd0aFxuICBzdGF0aWMgbnVtZXJpY0xlbmd0aChsZW5ndGg6IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICAgIGlmICghaXNOdWxsT3JFbXB0eSh2YWwpICYmIHZhbC50b1N0cmluZygpLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW52YWxpZE51bWJlckxlbmd0aDoge1xuICAgICAgICAgICAgYWN0dWFsTGVuZ3RoOiB2YWwsXG4gICAgICAgICAgICByZXF1aXJlZExlbmd0aDogbGVuZ3RoXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIFBhc3N3b3JkVmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBpZiAoIWNvbnRyb2wudmFsdWU/Lm1hdGNoKHBhc3N3b3JkUmVnZXgpKSB7XG4gICAgICByZXR1cm4geyBwYXNzd29yZFBvbGljeVJlcXVpcmVtZW50czogdHJ1ZSB9O1xuICAgIH1cbiAgICBpZiAoY29udHJvbC52YWx1ZS5sZW5ndGggPCA4KSB7XG4gICAgICByZXR1cm4geyBtaW5sZW5ndGg6IHsgcmVxdWlyZWRMZW5ndGg6IDggfSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBHdWlkVmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBpZiAoIXJlZ2V4RXhwLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGd1aWRJc1ZhbGlkOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIFBhc3N3b3JkRm9ybU1hdGNoVmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkge1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGFzc3dvcmQgPSBjb250cm9sLmdldCgncGFzc3dvcmQnKTtcbiAgICBjb25zdCBjdXJyZW50UGFzc3dvcmQgPSBjb250cm9sLmdldCgnY3VycmVudFBhc3N3b3JkJyk7XG4gICAgaWYgKG5ld1Bhc3N3b3JkICYmIGN1cnJlbnRQYXNzd29yZCAmJiBuZXdQYXNzd29yZC52YWxpZCAmJiBjdXJyZW50UGFzc3dvcmQudmFsaWQgJiYgbmV3UGFzc3dvcmQudmFsdWUgPT09IGN1cnJlbnRQYXNzd29yZC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgcGFzc3dvcmRNYXRjaDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsOyAvLyBQYXNzd29yZHMgbWF0Y2ggb3IgZm9ybSBmaWVsZHMgaGFzIGl0cyBvd24gZXJyb3JzXG4gIH1cblxuICBzdGF0aWMgUGFzc3dvcmRGb3JtTm90TWF0Y2hWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXNzd29yZCA9IGNvbnRyb2wuZ2V0KCdwYXNzd29yZCcpO1xuICAgIGNvbnN0IGNvbmZpcm1QYXNzd29yZCA9IGNvbnRyb2wuZ2V0KCdjb25maXJtUGFzc3dvcmQnKTtcbiAgICBpZiAoKG5ld1Bhc3N3b3JkLmVycm9ycyB8fCBjb25maXJtUGFzc3dvcmQuZXJyb3JzKSB8fFxuICAgICAgbmV3UGFzc3dvcmQudmFsdWUgPT09IGNvbmZpcm1QYXNzd29yZC52YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7IC8vIFBhc3N3b3JkcyBtYXRjaCBvciBmb3JtIGZpZWxkcyBoYXMgaXRzIG93biBlcnJvcnNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgcGFzc3dvcmROb3RNYXRjaDogdHJ1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBmcm9tVG9OdW1iZXJWYWxpZGF0b3IoZnJvbUNvbnRyb2xOYW1lOiBzdHJpbmcsIHRvQ29udHJvbE5hbWU6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZnJvbUNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZyb21Db250cm9sTmFtZSk7XG4gICAgICBjb25zdCB0b0NvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KHRvQ29udHJvbE5hbWUpO1xuXG4gICAgICAvLyBLZWVwIGV4aXN0aW5nIGVycm9yc1xuICAgICAgY29uc3QgZXhpc3RpbmdGcm9tRXJyb3JzID0gZnJvbUNvbnRyb2wuZXJyb3JzIHx8IHt9O1xuICAgICAgY29uc3QgZXhpc3RpbmdUb0Vycm9ycyA9IHRvQ29udHJvbC5lcnJvcnMgfHwge307XG5cbiAgICAgIC8vIFJlbW92ZSBvbmx5IG91ciBjdXN0b20gZXJyb3JzXG4gICAgICBkZWxldGUgZXhpc3RpbmdGcm9tRXJyb3JzW0xvY2FsaXphdGlvbi5mb3JtX3ZhbGlkYXRpb25faW52YWxpZF9udW1iZXJfcmFuZ2VdO1xuICAgICAgZGVsZXRlIGV4aXN0aW5nVG9FcnJvcnNbTG9jYWxpemF0aW9uLmZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX251bWJlcl9yYW5nZV07XG5cbiAgICAgIGlmICh0aGlzLmlzVmFsdWVHcmVhdGVyVGhhbk9yRXF1YWxUbyhmcm9tQ29udHJvbCwgdG9Db250cm9sKSkge1xuICAgICAgICBleGlzdGluZ0Zyb21FcnJvcnNbTG9jYWxpemF0aW9uLmZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX251bWJlcl9yYW5nZV0gPSB0cnVlO1xuICAgICAgICBleGlzdGluZ1RvRXJyb3JzW0xvY2FsaXphdGlvbi5mb3JtX3ZhbGlkYXRpb25faW52YWxpZF9udW1iZXJfcmFuZ2VdID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgYmFjayBlcnJvcnMgb3IgbnVsbCBpZiBub25lXG4gICAgICBmcm9tQ29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXhpc3RpbmdGcm9tRXJyb3JzKS5sZW5ndGggPyBleGlzdGluZ0Zyb21FcnJvcnMgOiBudWxsKTtcbiAgICAgIHRvQ29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXhpc3RpbmdUb0Vycm9ycykubGVuZ3RoID8gZXhpc3RpbmdUb0Vycm9ycyA6IG51bGwpO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2FsY3VsYXRlQmFsYW5jZSA9ICh1bml0c1ZhbHVlLCBiYWxhbmNlVmFsdWUpID0+IHsgcmV0dXJuIHVuaXRzVmFsdWUgKyBiYWxhbmNlVmFsdWU7IH07XG5cbiAgc3RhdGljIHVuaXRzQmFsYW5jZVZhbGlkYXRvcih1bml0c0NvbnRyb2xOYW1lOiBzdHJpbmcsIGJhbGFuY2VDb250cm9sTmFtZTogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgbGV0IHJlc3BvbnNlID0gbnVsbDsgLy8gUmV0dXJuIG51bGwgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICAgIGlmIChjb250cm9sLnBhcmVudCkge1xuICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sLnBhcmVudCBhcyBGb3JtR3JvdXA7XG4gICAgICAgIGNvbnN0IHVuaXRzQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQodW5pdHNDb250cm9sTmFtZSk7XG4gICAgICAgIGNvbnN0IGJhbGFuY2VDb250cm9sID0gZm9ybUdyb3VwLmdldChiYWxhbmNlQ29udHJvbE5hbWUpO1xuICAgICAgICBjb25zdCB1bml0c1ZhbHVlID0gcGFyc2VJbnQodW5pdHNDb250cm9sLnZhbHVlKTtcbiAgICAgICAgY29uc3QgYmFsYW5jZVZhbHVlID0gYmFsYW5jZUNvbnRyb2wudmFsdWU7XG4gICAgICAgIGNvbnN0IGJhbGFuY2VDYWxjdWxhdGVkID0gdGhpcy5jYWxjdWxhdGVCYWxhbmNlKHVuaXRzVmFsdWUsIGJhbGFuY2VWYWx1ZSk7XG4gICAgICAgIGlmIChiYWxhbmNlQ2FsY3VsYXRlZCA+IE1BWF9BTExPV0VEX0JBTEFOQ0UpIHtcbiAgICAgICAgICByZXNwb25zZSA9IHsgZm9ybV92YWxpZGF0aW9uX3VuaXRzX2JhbGFuY2VfbWF4aW11bTogdHJ1ZSB9O1xuICAgICAgICB9IGVsc2UgaWYgKGJhbGFuY2VDYWxjdWxhdGVkIDwgTUlOX0FMTE9XRURfQkFMQU5DRSkge1xuICAgICAgICAgIHJlc3BvbnNlID0geyBmb3JtX3ZhbGlkYXRpb25fdW5pdHNfYmFsYW5jZV9taW5pbXVtOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG1pbkRhdGVUaW1lKGNvbnRyb2xOYW1lOiBzdHJpbmcsIG1pbkRhdGVUaW1lVmFsdWU6IERhdGUpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sR3JvdXA6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IG51bGw7IC8vIFJldHVybiBudWxsIGlmIHZhbGlkYXRpb24gcGFzc2VzXG5cbiAgICAgIGlmIChjb250cm9sR3JvdXAucGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IGNvbnRyb2xHcm91cC5wYXJlbnQgYXMgRm9ybUdyb3VwO1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChjb250cm9sTmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZTogRGF0ZSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2xEYXRlID0gbmV3IERhdGUoY29udHJvbFZhbHVlKS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgICBjb25zdCBtaW5EYXRlID0gbmV3IERhdGUobWluRGF0ZVRpbWVWYWx1ZSkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgICBpZiAoY29udHJvbERhdGUgPCBtaW5EYXRlKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHsgZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfZnJvbV90aW1lOiB0cnVlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZyb21Ub0RhdGUoZnJvbURhdGVGaWVsZDogc3RyaW5nLCB0b0RhdGVGaWVsZDogc3RyaW5nLCBmcm9tVGltZUZpZWxkOiBzdHJpbmcgPSBudWxsLFxuICAgIHRvVGltZUZpZWxkOiBzdHJpbmcgPSBudWxsLCBlcnJvck5hbWU6IHN0cmluZyA9ICdmcm9tVG9EYXRlJyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuOyB9IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBmcm9tRGF0ZTogRGF0ZSA9IGZvcm1Hcm91cC5nZXQoZnJvbURhdGVGaWVsZCk/LnZhbHVlO1xuICAgICAgY29uc3QgdG9EYXRlOiBEYXRlID0gZm9ybUdyb3VwLmdldCh0b0RhdGVGaWVsZCk/LnZhbHVlO1xuICAgICAgY29uc3QgZnJvbVRpbWU6IFRpYmFUaW1lID0gZm9ybUdyb3VwLmdldChmcm9tVGltZUZpZWxkKT8udmFsdWU7XG4gICAgICBjb25zdCB0b1RpbWU6IFRpYmFUaW1lID0gZm9ybUdyb3VwLmdldCh0b1RpbWVGaWVsZCk/LnZhbHVlO1xuICAgICAgaWYgKGZyb21UaW1lKSB7XG4gICAgICAgIGZyb21EYXRlLnNldEhvdXJzKGZyb21UaW1lLmhvdXJzKTtcbiAgICAgICAgZnJvbURhdGUuc2V0TWludXRlcyhmcm9tVGltZS5taW51dGVzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b1RpbWUpIHtcbiAgICAgICAgdG9EYXRlLnNldEhvdXJzKHRvVGltZS5ob3Vycyk7XG4gICAgICAgIHRvRGF0ZS5zZXRNaW51dGVzKHRvVGltZS5taW51dGVzKTtcbiAgICAgIH1cbiAgICAgIGlmICgoZnJvbURhdGUgIT09IG51bGwgJiYgdG9EYXRlICE9PSBudWxsKSAmJiBmcm9tRGF0ZSA+IHRvRGF0ZSkge1xuICAgICAgICByZXR1cm4geyBbZXJyb3JOYW1lXTogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVG9UaW1lUmFuZ2UoZnJvbVRpbWVGaWVsZDogc3RyaW5nLCB0b1RpbWVGaWVsZDogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCB0b0NvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KHRvVGltZUZpZWxkKTtcbiAgICAgIGNvbnN0IGZyb21Db250cm9sID0gZm9ybUdyb3VwLmdldChmcm9tVGltZUZpZWxkKTtcblxuICAgICAgLy8gS2VlcCBleGlzdGluZyBlcnJvcnNcbiAgICAgIGNvbnN0IGV4aXN0aW5nRnJvbUVycm9ycyA9IGZyb21Db250cm9sLmVycm9ycyB8fCB7fTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVG9FcnJvcnMgPSB0b0NvbnRyb2wuZXJyb3JzIHx8IHt9O1xuXG4gICAgICAvLyBSZW1vdmUgb25seSBvdXIgY3VzdG9tIGVycm9yc1xuICAgICAgZGVsZXRlIGV4aXN0aW5nRnJvbUVycm9yc1tMb2NhbGl6YXRpb24uZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfdGltZV9yYW5nZV07XG4gICAgICBkZWxldGUgZXhpc3RpbmdUb0Vycm9yc1tMb2NhbGl6YXRpb24uZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfdGltZV9yYW5nZV07XG5cbiAgICAgIGlmICh0aGlzLmlzVmFsdWVHcmVhdGVyVGhhbk9yRXF1YWxUbyhmcm9tQ29udHJvbCwgdG9Db250cm9sKSAmJiB0aGlzLmlzVmFsdWVMZW5ndGhWYWxpZChmcm9tQ29udHJvbCwgdG9Db250cm9sKSkge1xuICAgICAgICBleGlzdGluZ0Zyb21FcnJvcnNbTG9jYWxpemF0aW9uLmZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX3RpbWVfcmFuZ2VdID0gdHJ1ZTtcbiAgICAgICAgZXhpc3RpbmdUb0Vycm9yc1tMb2NhbGl6YXRpb24uZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfdGltZV9yYW5nZV0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBiYWNrIGVycm9ycyBvciBudWxsIGlmIG5vbmVcbiAgICAgIGZyb21Db250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhleGlzdGluZ0Zyb21FcnJvcnMpLmxlbmd0aCA/IGV4aXN0aW5nRnJvbUVycm9ycyA6IG51bGwpO1xuICAgICAgdG9Db250cm9sLnNldEVycm9ycyhPYmplY3Qua2V5cyhleGlzdGluZ1RvRXJyb3JzKS5sZW5ndGggPyBleGlzdGluZ1RvRXJyb3JzIDogbnVsbCk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbVRvVGltZShmcm9tVGltZUZpZWxkOiBzdHJpbmcsIHRvVGltZUZpZWxkOiBzdHJpbmcsIGFsbG93U2FtZURhdGVSYW5nZUJvdW5kczogYm9vbGVhbiA9IHRydWUpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChmb3JtR3JvdXA6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbjsgfSB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZnJvbVRpbWU6IFRpYmFUaW1lID0gZm9ybUdyb3VwLmdldChmcm9tVGltZUZpZWxkKS52YWx1ZTtcbiAgICAgIGNvbnN0IHRvVGltZTogVGliYVRpbWUgPSBmb3JtR3JvdXAuZ2V0KHRvVGltZUZpZWxkKS52YWx1ZTtcblxuICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIGVpdGhlciB2YWx1ZSBpcyBtaXNzaW5nXG4gICAgICBpZiAodGhpcy5pc1RpbWVOdWxsKGZyb21UaW1lKSB8fCB0aGlzLmlzVGltZU51bGwodG9UaW1lKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbVRvdGFsTWludXRlcyA9IGZyb21UaW1lLmhvdXJzICogNjAgKyBmcm9tVGltZS5taW51dGVzO1xuICAgICAgY29uc3QgdG9Ub3RhbE1pbnV0ZXMgPSB0b1RpbWUuaG91cnMgKiA2MCArIHRvVGltZS5taW51dGVzO1xuXG4gICAgICBpZiAoKGZyb21Ub3RhbE1pbnV0ZXMgPiB0b1RvdGFsTWludXRlcykgfHwgKCFhbGxvd1NhbWVEYXRlUmFuZ2VCb3VuZHMgJiYgZnJvbVRvdGFsTWludXRlcyA9PT0gdG9Ub3RhbE1pbnV0ZXMpKSB7XG4gICAgICAgIHJldHVybiB7IGZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX3RpbWVfcmFuZ2U6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzVGltZU51bGwgPSAodGltZTogVGliYVRpbWUpID0+IHRpbWUgPT09IG51bGwgfHxcbiAgICAodGltZS5ob3VycyA9PT0gbnVsbCAmJiB0aW1lLm1pbnV0ZXMgPT09IG51bGwgJiYgdGltZS5zZWNvbmRzID09PSBudWxsKTtcblxuICBzdGF0aWMgbm9XaGl0ZXNwYWNlVmFsaWRhdG9yID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgPT5cbiAgICAhaXNOdWxsT3JFbXB0eShjb250cm9sLnZhbHVlKSAmJiBpc051bGxPckVtcHR5KGNvbnRyb2w/LnZhbHVlPy50cmltKCkpID8geyByZXF1aXJlZDogdHJ1ZSB9IDogbnVsbDtcblxuICBzdGF0aWMgbm9XaGl0ZXNwYWNlV2l0aGluU2VudGVuY2VWYWxpZGF0b3IgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyA9PlxuICAgICEoY29udHJvbD8udmFsdWU/LnNwbGl0KFwiIFwiKS5sZW5ndGggPT09IDEpID8geyBub1doaXRlc3BhY2VXaXRoaW5TZW50ZW5jZTogdHJ1ZSB9IDogbnVsbDtcblxuICBzdGF0aWMgbm9Eb3RXaXRoaW5TZW50ZW5jZVZhbGlkYXRvciA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzID0+XG4gICAgY29udHJvbD8udmFsdWU/LmluY2x1ZGVzKFwiLlwiKSA/IHsgbm9Eb3RXaXRoaW5TZW50ZW5jZTogdHJ1ZSB9IDogbnVsbDtcblxuICBzdGF0aWMgdGVybXNQb2xpY3lDaGVja2JveCgpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgaW52YWxpZFRlcm1zOiB0cnVlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlRGVmYXVsdEFjY2Vzc1Byb2ZpbGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgaWYgKCFpc051bGxPckVtcHR5KGNvbnRyb2wudmFsdWUpICYmICFjb250cm9sLnZhbHVlPy5kZWZhdWx0QWNjZXNzUHJvZmlsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9EZWZhdWx0QWNjZXNzUHJvZmlsZToge1xuICAgICAgICAgIGNvbXBhbnlOYW1lOiBjb250cm9sLnZhbHVlLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB6UmFuZ2UodHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSwgZnJvbVpGaWVsZDogc3RyaW5nLCB0b1pGaWVsZDogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoZm9ybUdyb3VwOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZnJvbVpDb250cm9sID0gZm9ybUdyb3VwLmdldChmcm9tWkZpZWxkKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgY29uc3QgdG9aQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQodG9aRmllbGQpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG5cbiAgICAgIGlmIChmcm9tWkNvbnRyb2wudmFsdWU/LmlkID4gdG9aQ29udHJvbC52YWx1ZT8uaWQpIHtcbiAgICAgICAgcmV0dXJuIHsgelJhbmdlOiB0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoTG9jYWxpemF0aW9uLmludmFsaWRfZmllbGRzKSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHJhbmdlRGVsdGFWYWxpZGF0b3IoZnJvbUZpZWxkOiBzdHJpbmcsIHRvRmllbGQ6IHN0cmluZywgbWF4RGVsdGE6IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IG51bGw7IC8vIFJldHVybiBudWxsIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAgICBjb25zdCB0b0NvbnRyb2wgPSBjb250cm9sLmdldCh0b0ZpZWxkKTtcbiAgICAgIGNvbnN0IGZyb21Db250cm9sID0gY29udHJvbC5nZXQoZnJvbUZpZWxkKTtcblxuICAgICAgaWYgKGZyb21Db250cm9sICYmIHRvQ29udHJvbCkge1xuICAgICAgICBjb25zdCBmcm9tVmFsdWUgPSBmcm9tQ29udHJvbC52YWx1ZTtcbiAgICAgICAgY29uc3QgdG9WYWx1ZSA9IHRvQ29udHJvbC52YWx1ZTtcblxuICAgICAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIGJvdGggdmFsdWVzIGFyZSBwcmVzZW50IGFuZCBub3QgZW1wdHlcbiAgICAgICAgaWYgKGZyb21WYWx1ZSAhPSBudWxsICYmIHRvVmFsdWUgIT0gbnVsbCAmJiBmcm9tVmFsdWUgIT09ICcnICYmIHRvVmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgY29uc3QgZGVsdGEgPSB0b1ZhbHVlIC0gZnJvbVZhbHVlO1xuXG4gICAgICAgICAgaWYgKGRlbHRhID4gbWF4RGVsdGEpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICByYW5nZURlbHRhRXhjZWVkZWQ6IHtcbiAgICAgICAgICAgICAgICBhY3R1YWxEZWx0YTogZGVsdGEsXG4gICAgICAgICAgICAgICAgbWF4RGVsdGE6IG1heERlbHRhLFxuICAgICAgICAgICAgICAgIGZyb206IGZyb21WYWx1ZSxcbiAgICAgICAgICAgICAgICB0bzogdG9WYWx1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyByZXF1aXJlZENyZWRlbnRpYWxzKHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsIGNhclBsYXRlRmllbGQ6IHN0cmluZyA9ICdjYXJQbGF0ZScsIG1vYmlsZUZpZWxkOiBzdHJpbmcgPSAnbW9iaWxlJywgYmFkZ2VGaWVsZDogc3RyaW5nID0gJ2JhZGdlJyxcbiAgICBlbWFpbEZpZWxkOiBzdHJpbmcgPSAnZW1haWwnLCBzZW5kRW1haWxGaWVsZDogc3RyaW5nID0gJ3NlbmRFbWFpbCcpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChmb3JtR3JvdXA6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbCA9PiB7XG4gICAgICBsZXQgY2FyUGxhdGVzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgbGV0IGJhZGdlc0ludmFsaWQgPSBmYWxzZTtcbiAgICAgIGxldCBpbnRlcnBvbGF0ZWRDcmVkZW50aWFsczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgLy8gQ2FyZHNcbiAgICAgIGNvbnN0IGJhZGdlc0Zvcm1BcnJheSA9IGZvcm1Hcm91cC5nZXQoYmFkZ2VGaWVsZCkgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgIGlmIChiYWRnZXNGb3JtQXJyYXkpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVkQ3JlZGVudGlhbHMucHVzaCh0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoTG9jYWxpemF0aW9uLmNhcmQpKTtcbiAgICAgICAgYmFkZ2VzSW52YWxpZCA9IHRoaXMuaXNGb3JtQ29udHJvbExpc3RJbnZhbGlkKGJhZGdlc0Zvcm1BcnJheS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpc0NhcmRzSW52YWxpZCA9IGJhZGdlc0ludmFsaWQgfHwgIWJhZGdlc0Zvcm1BcnJheTtcblxuICAgICAgLy9DYXIgcGxhdGVzXG4gICAgICBjb25zdCBjYXJQbGF0ZXNGb3JtQXJyYXkgPSBmb3JtR3JvdXAuZ2V0KGNhclBsYXRlRmllbGQpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICBpZiAoY2FyUGxhdGVzRm9ybUFycmF5KSB7XG4gICAgICAgIGludGVycG9sYXRlZENyZWRlbnRpYWxzLnB1c2godHJhbnNsYXRlU2VydmljZS5pbnN0YW50KExvY2FsaXphdGlvbi5jYXJfcGxhdGUpKTtcbiAgICAgICAgY2FyUGxhdGVzSW52YWxpZCA9IHRoaXMuaXNGb3JtQ29udHJvbExpc3RJbnZhbGlkKGNhclBsYXRlc0Zvcm1BcnJheS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpc0NhclBsYXRlc0ludmFsaWQgPSBjYXJQbGF0ZXNJbnZhbGlkIHx8ICFjYXJQbGF0ZXNGb3JtQXJyYXk7XG5cbiAgICAgIC8vIE1vYmlsZVxuICAgICAgY29uc3QgbW9iaWxlRm9ybUNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KG1vYmlsZUZpZWxkKTtcbiAgICAgIGlmIChtb2JpbGVGb3JtQ29udHJvbCkge1xuICAgICAgICBpbnRlcnBvbGF0ZWRDcmVkZW50aWFscy5wdXNoKHRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChMb2NhbGl6YXRpb24ubW9iaWxlKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBpc01vYmlsZUludmFsaWQgPSAhbW9iaWxlRm9ybUNvbnRyb2w/LnZhbHVlO1xuXG4gICAgICAvLyBFbWFpbFxuICAgICAgY29uc3QgZW1haWxGb3JtQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZW1haWxGaWVsZCk7XG4gICAgICBjb25zdCBzZW5kRW1haWxGb3JtQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoc2VuZEVtYWlsRmllbGQpO1xuICAgICAgaWYgKGVtYWlsRm9ybUNvbnRyb2wgJiYgc2VuZEVtYWlsRm9ybUNvbnRyb2w/LnZhbHVlKSB7XG4gICAgICAgIGludGVycG9sYXRlZENyZWRlbnRpYWxzLnB1c2godHJhbnNsYXRlU2VydmljZS5pbnN0YW50KExvY2FsaXphdGlvbi5lbWFpbCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNFbWFpbEludmFsaWQgPSAhKHNlbmRFbWFpbEZvcm1Db250cm9sPy52YWx1ZSAmJiBlbWFpbEZvcm1Db250cm9sPy52YWx1ZSk7XG5cbiAgICAgIGNvbnN0IGlzUmVxdWlyZWRDcmVkZW50aWFscyA9IGlzQ2FyUGxhdGVzSW52YWxpZCAmJiBpc0NhcmRzSW52YWxpZCAmJiBpc01vYmlsZUludmFsaWQgJiYgaXNFbWFpbEludmFsaWQ7XG5cbiAgICAgIGlmIChpc1JlcXVpcmVkQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3QgbGFzdENyZWRlbnRpYWwgPSBpbnRlcnBvbGF0ZWRDcmVkZW50aWFscy5wb3AoKTtcbiAgICAgICAgbGV0IGludGVycG9sYXRlUGFyYW1zID0gYCR7aW50ZXJwb2xhdGVkQ3JlZGVudGlhbHMuam9pbignLCAnKX0gJHt0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoTG9jYWxpemF0aW9uLm9yKX0gJHtsYXN0Q3JlZGVudGlhbH1gO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkQ3JlZGVudGlhbHM6IHRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChMb2NhbGl6YXRpb24ucmVxdWlyZWRfY3JlZGVudGlhbHNfbWVzc2FnZSwgeyBjcmVkZW50aWFsczogaW50ZXJwb2xhdGVQYXJhbXMgfSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc0Zvcm1Db250cm9sTGlzdEludmFsaWQobGlzdDogVW50eXBlZEZvcm1Db250cm9sW10pIHtcbiAgICBsZXQgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIGxpc3QpIHtcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xuICAgICAgICBpc0ludmFsaWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaXNJbnZhbGlkO1xuICB9XG5cbiAgc3RhdGljIHJlcXVpcmVkRGF5cyhzcGVjaWFsRGF5c0ZpZWxkOiBzdHJpbmcsIHdlZWtEYXlzRmllbGQ6IHN0cmluZywgZXJyb3JOYW1lOiBzdHJpbmcgPSAncmVxdWlyZWREYXlzJyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuOyB9IHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCBzcGVjaWFsRGF5czogbnVtYmVyID0gZm9ybUdyb3VwLmdldChzcGVjaWFsRGF5c0ZpZWxkKS52YWx1ZTtcbiAgICAgIGNvbnN0IHdlZWtEYXlzOiBudW1iZXIgPSBmb3JtR3JvdXAuZ2V0KHdlZWtEYXlzRmllbGQpLnZhbHVlO1xuICAgICAgaWYgKHNwZWNpYWxEYXlzID4gMCB8fCB3ZWVrRGF5cyA+IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IFtlcnJvck5hbWVdOiB0cnVlIH07XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBpc1JvbGVOYW1lRXhpc3RzKHJvbGVDbG91ZFNlcnZpY2VQcm94eTogQ2xvdWQuUm9sZUNsb3VkU2VydmljZVByb3h5LCByb2xlSWQ6IG51bWJlcik6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzPiA9PiB7XG4gICAgICByZXR1cm4gb2YoY29udHJvbC52YWx1ZSkucGlwZShcbiAgICAgICAgZGVsYXkoNTAwKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKElOUFVUX1NFQVJDSF9ERUJPVU5DRV9USU1FKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHJvbGVDbG91ZFNlcnZpY2VQcm94eS5pc0V4aXN0cyhjb250cm9sLnZhbHVlLCByb2xlSWQgPz8gdW5kZWZpbmVkKS5waXBlKFxuICAgICAgICAgIG1hcChyZXMgPT4gcmVzLmRhdGEgPT09IHRydWUgfHwgIXJlcy5pc1N1Y2Nlc3MgPyB7IHJvbGVOYW1lQWxyZWFkeUV4aXN0czogdHJ1ZSB9IDogbnVsbCkpKSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBpc0FjY2Vzc1Byb2ZpbGVOdW1iZXJBdmFpbGFibGUoYWNjZXNzUHJvZmlsZVJwY1NlcnZpY2VQcm94eTogUnBjLkFjY2Vzc1Byb2ZpbGVScGNTZXJ2aWNlUHJveHksIGd1aWQ6IHN0cmluZywgZmFjaWxpdHlJZDogbnVtYmVyLCBjdXJyZW50VmFsdWU6IG51bWJlcik6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzPiA9PiB7XG4gICAgICByZXR1cm4gb2YoY29udHJvbC52YWx1ZSkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHZhbHVlID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSAhPT0gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHNlcnZpY2UgdG8gY2hlY2sgaWYgdGhlIG51bWJlciBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgIHJldHVybiBhY2Nlc3NQcm9maWxlUnBjU2VydmljZVByb3h5LmdldEF2YWlsYWJsZU51bWJlcihndWlkLCBmYWNpbGl0eUlkLCB2YWx1ZSkucGlwZShcbiAgICAgICAgICAgICAgbWFwKHJlcyA9PiAhcmVzLmRhdGE/LmlzQXZhaWxhYmxlIHx8ICFyZXMuaXNTdWNjZXNzID8geyBhY2Nlc3NQcm9maWxlTnVtYmVyVGFrZW46IHRydWUgfSA6IG51bGwpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHRpYmFUaW1lVmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCB2YWw6IFRpYmFUaW1lID0gY29udHJvbC52YWx1ZTtcblxuICAgIGNvbnN0IGhhc0ludmFsaWRUaW1lID1cbiAgICAgIHZhbCAmJlxuICAgICAgKCh2YWwuaG91cnMgIT0gbnVsbCAmJiB2YWwubWludXRlcyA9PSBudWxsKSB8fFxuICAgICAgICAodmFsLmhvdXJzID09IG51bGwgJiYgdmFsLm1pbnV0ZXMgIT0gbnVsbCkpO1xuXG4gICAgcmV0dXJuIGhhc0ludmFsaWRUaW1lID8geyBpbnZhbGlkVGltZTogdHJ1ZSB9IDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVRpYmFUaW1lSW5SYW5nZVZhbGlkYXRvcihtaW5UaW1lOiBUaWJhVGltZSwgbWF4VGltZTogVGliYVRpbWUpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRpYmFUaW1lSW5SYW5nZShjb250cm9sLnZhbHVlLCBtaW5UaW1lLCBtYXhUaW1lKTtcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGVudHJ5RXhpdFJlcXVpcmVkVmFsaWRhdG9yKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCBlbnRyeSA9IGNvbnRyb2wuZ2V0KCdlbnRyeScpPy52YWx1ZTtcbiAgICBjb25zdCBleGl0ID0gY29udHJvbC5nZXQoJ2V4aXQnKT8udmFsdWU7XG5cbiAgICBjb25zdCBib3RoRW1wdHkgPSAhZW50cnkgJiYgIWV4aXQ7XG5cbiAgICByZXR1cm4gYm90aEVtcHR5ID8geyByZXF1aXJlZDogdHJ1ZSB9IDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVN0cmluZ0hITU1JblJhbmdlVmFsaWRhdG9yKG1pblRpbWU6IFRpYmFUaW1lLCBtYXhUaW1lOiBUaWJhVGltZSk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGlmICghIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUubGVuZ3RoICE9PSA0KSB7IC8vIEFzc3VtaW5nIHRpbWUgZm9ybWF0IGlzICdISE1NJ1xuICAgICAgICAgIHJldHVybiB7IGZvcm1fdmFsaWRhdGlvbl9pbnZhbGlkX3RpbWVfZm9ybWF0OiB0cnVlIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaG91cnM6IG51bWJlciA9IHBhcnNlSW50KGNvbnRyb2wudmFsdWUuc2xpY2UoMCwgMikpO1xuICAgICAgICAgIGNvbnN0IG1pbnV0ZXM6IG51bWJlciA9IHBhcnNlSW50KGNvbnRyb2wudmFsdWUuc2xpY2UoMikpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lOiBUaWJhVGltZSA9IHsgaG91cnMsIG1pbnV0ZXMgfTtcbiAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRpYmFUaW1lSW5SYW5nZShjdXJyZW50VGltZSwgbWluVGltZSwgbWF4VGltZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgdGltZVJhbmdlQXJyYXlPdmVybGFwVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGlmIChjb250cm9sLnZhbGlkICYmIGNvbnRyb2wuZW5hYmxlZCkge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBjb250cm9sLnZhbHVlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFJhbmdlID0gZm9ybUFycmF5W2ldO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRGcm9tID0gdGltZVRvTW9tZW50KGN1cnJlbnRSYW5nZS5mcm9tKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG8gPSB0aW1lVG9Nb21lbnQoY3VycmVudFJhbmdlLnRvKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50RnJvbSAmJiBjdXJyZW50VG8pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGZvcm1BcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBjb25zdCBjb21wYXJlUmFuZ2UgPSBmb3JtQXJyYXlbal07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVGcm9tID0gdGltZVRvTW9tZW50KGNvbXBhcmVSYW5nZS5mcm9tKTtcbiAgICAgICAgICAgICAgY29uc3QgY29tcGFyZVRvID0gdGltZVRvTW9tZW50KGNvbXBhcmVSYW5nZS50byk7XG5cbiAgICAgICAgICAgICAgaWYgKGNvbXBhcmVGcm9tICYmIGNvbXBhcmVUbykge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVybGFwXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2VzT3ZlcmxhcCA9IGN1cnJlbnRGcm9tLmlzQmVmb3JlKGNvbXBhcmVUbykgJiYgY3VycmVudFRvLmlzQWZ0ZXIoY29tcGFyZUZyb20pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlc092ZXJsYXApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IGZvcm1fdmFsaWRhdGlvbl90aW1lX3JhbmdlX292ZXJsYXA6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyByZXZlcnRBdENvbXBhcmlzb25WYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgY29tcGFyaXNvblR5cGUgPSBmb3JtQ29udHJvbC5nZXQoJ2NvbXBhcmlzb25UeXBlJyk/LnZhbHVlO1xuICAgIGNvbnN0IG9jY3VwYW5jeVZhbHVlQ3RybCA9IGZvcm1Db250cm9sLmdldCgnb2NjdXBhbmN5VmFsdWUnKTtcbiAgICBjb25zdCByZXZlcnRBdFZhbHVlQ3RybCA9IGZvcm1Db250cm9sLmdldCgncmV2ZXJ0QXRWYWx1ZScpO1xuXG4gICAgaWYgKCFvY2N1cGFuY3lWYWx1ZUN0cmwgfHwgIXJldmVydEF0VmFsdWVDdHJsKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IG9jY3VwYW5jeVZhbHVlID0gK29jY3VwYW5jeVZhbHVlQ3RybC52YWx1ZTtcbiAgICBjb25zdCByZXZlcnRBdFZhbHVlID0gK3JldmVydEF0VmFsdWVDdHJsLnZhbHVlO1xuXG4gICAgLy8gS2VlcCBleGlzdGluZyBlcnJvcnNcbiAgICBjb25zdCBleGlzdGluZ0Vycm9ycyA9IHJldmVydEF0VmFsdWVDdHJsLmVycm9ycyB8fCB7fTtcblxuICAgIC8vIFJlbW92ZSBvbmx5IG91ciBjdXN0b20gZXJyb3JzXG4gICAgZGVsZXRlIGV4aXN0aW5nRXJyb3JzWydyZXZlcnRfYXRfbXVzdF9iZV9sZXNzX3RoYW5fb2NjdXBhbmN5J107XG4gICAgZGVsZXRlIGV4aXN0aW5nRXJyb3JzWydyZXZlcnRfYXRfbXVzdF9iZV9tb3JlX3RoYW5fb2NjdXBhbmN5J107XG5cbiAgICBpZiAoY29tcGFyaXNvblR5cGUgPT09IENsb3VkLkR5bmFtaWNQcmljaW5nQ29tcGFyaXNvblR5cGUuTW9yZVRoYW4pIHtcbiAgICAgIGlmIChyZXZlcnRBdFZhbHVlID49IG9jY3VwYW5jeVZhbHVlKSB7XG4gICAgICAgIGV4aXN0aW5nRXJyb3JzWydyZXZlcnRfYXRfbXVzdF9iZV9sZXNzX3RoYW5fb2NjdXBhbmN5J10gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb21wYXJpc29uVHlwZSA9PT0gQ2xvdWQuRHluYW1pY1ByaWNpbmdDb21wYXJpc29uVHlwZS5MZXNzVGhhbikge1xuICAgICAgaWYgKHJldmVydEF0VmFsdWUgPD0gb2NjdXBhbmN5VmFsdWUpIHtcbiAgICAgICAgZXhpc3RpbmdFcnJvcnNbJ3JldmVydF9hdF9tdXN0X2JlX21vcmVfdGhhbl9vY2N1cGFuY3knXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgYmFjayBlcnJvcnMgb3IgbnVsbCBpZiBub25lXG4gICAgcmV2ZXJ0QXRWYWx1ZUN0cmwuc2V0RXJyb3JzKE9iamVjdC5rZXlzKGV4aXN0aW5nRXJyb3JzKS5sZW5ndGggPyBleGlzdGluZ0Vycm9ycyA6IG51bGwpO1xuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKipcbiAqIFZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiBhIG51bWJlciBpcyBhIG11bHRpcGxlIG9mIGEgc3BlY2lmaWVkIHN0ZXAuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdmFsaWRhdGluZyBpbnB1dHMgbGlrZSBjdXJyZW5jeSBhbW91bnRzIG9yIG90aGVyIHZhbHVlcyB0aGF0IHNob3VsZFxuICogZm9sbG93IGEgc3BlY2lmaWMgaW5jcmVtZW50IHBhdHRlcm4uXG4gKlxuICogQHBhcmFtIHN0ZXAgLSBUaGUgc3RlcCBzaXplIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIChlLmcuLCAwLjA1IGZvciBjdXJyZW5jeSkuXG4gKiBAcmV0dXJucyBBIFZhbGlkYXRvckZuIHRoYXQgY2hlY2tzIGlmIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBpcyBhIG11bHRpcGxlIG9mIHRoZSBzdGVwLlxuICpcbiAqIFVzYWdlOlxuICogY29uc3Qgc3RlcFZhbGlkYXRvciA9IE15Q2xhc3MuYW1vdW50U3RlcFZhbGlkYXRvcigwLjA1KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHZhbHVlIGlzIDAuMTAgYW5kIHRoZSBzdGVwIGlzIDAuMDUsIHRoZSB2YWxpZGF0b3Igd2lsbCBwYXNzLlxuICogLy8gSWYgdGhlIHZhbHVlIGlzIDAuMTIgYW5kIHRoZSBzdGVwIGlzIDAuMDUsIHRoZSB2YWxpZGF0b3Igd2lsbCBmYWlsLlxuICovXG4gIHN0YXRpYyBhbW91bnRTdGVwVmFsaWRhdG9yKHN0ZXA6IG51bWJlcik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gK2NvbnRyb2wudmFsdWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG51bWJlciBhbmQgaWYgaXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgc3RlcFxuICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCArKE1hdGgucm91bmQodmFsdWUgLyBzdGVwKSAqIHN0ZXApLnRvRml4ZWQoMikgPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBudWxsOyAgLy8gdmFsaWQgdmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCB2YWxpZCwgcmV0dXJuIGFuIGVycm9yIHdpdGggdGhlIHN0ZXAgdmFsdWVcbiAgICAgIHJldHVybiB7IGludmFsaWRTdGVwOiBzdGVwLnRvRml4ZWQoMikgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbFRvKGZyb21Db250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHRvQ29udHJvbDogQWJzdHJhY3RDb250cm9sKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZnJvbVRpbWVJbk51bWJlcjogbnVtYmVyID0gZnJvbUNvbnRyb2wudmFsdWU7XG4gICAgY29uc3QgdG9UaW1lSW5OdW1iZXI6IG51bWJlciA9IHRvQ29udHJvbC52YWx1ZTtcbiAgICByZXR1cm4gZnJvbVRpbWVJbk51bWJlciAhPT0gbnVsbCAmJiB0b1RpbWVJbk51bWJlciAhPT0gbnVsbCAmJiArZnJvbVRpbWVJbk51bWJlciA+ICt0b1RpbWVJbk51bWJlcjtcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBpc1ZhbHVlTGVuZ3RoVmFsaWQoZnJvbUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgdG9Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBjb25zdCBmcm9tVGltZUluTnVtYmVyOiBudW1iZXIgPSBmcm9tQ29udHJvbC52YWx1ZTtcbiAgICBjb25zdCB0b1RpbWVJbk51bWJlcjogbnVtYmVyID0gdG9Db250cm9sLnZhbHVlO1xuICAgIHJldHVybiBmcm9tVGltZUluTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoID09PSBWQUxJRF9USU1FX01BWF9MRU5HVEggJiZcbiAgICAgIHRvVGltZUluTnVtYmVyLnRvU3RyaW5nKCkubGVuZ3RoID09PSBWQUxJRF9USU1FX01BWF9MRU5HVEg7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVRpYmFUaW1lSW5SYW5nZShjdXJyZW50VGltZTogVGliYVRpbWUsIG1pblRpbWU6IFRpYmFUaW1lLCBtYXhUaW1lOiBUaWJhVGltZSk6IHsgZm9ybV92YWxpZGF0aW9uX2ludmFsaWRfdGltZTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmc7IH07IH0gfCBudWxsIHtcbiAgICAvLyBJZiB0aW1lIGlzIHVuZGVmaW5lZCwgcmV0dXJuIG51bGwgKG5vIGVycm9yKVxuICAgIGlmICghY3VycmVudFRpbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdFRpbWUgPSAodGltZTogVGliYVRpbWUpOiBzdHJpbmcgPT5cbiAgICAgIGAke3RpbWUuaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3RpbWUubWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcblxuICAgIGNvbnN0IGhvdXJzOiBudW1iZXIgPSArY3VycmVudFRpbWUuaG91cnM7XG4gICAgY29uc3QgbWludXRlczogbnVtYmVyID0gK2N1cnJlbnRUaW1lLm1pbnV0ZXM7XG5cbiAgICBjb25zdCBpc1ZhbGlkVGltZSA9XG4gICAgICAoaG91cnMgPiBtaW5UaW1lLmhvdXJzIHx8IChob3VycyA9PT0gbWluVGltZS5ob3VycyAmJiBtaW51dGVzID49IG1pblRpbWUubWludXRlcykpICYmXG4gICAgICAoaG91cnMgPCBtYXhUaW1lLmhvdXJzIHx8IChob3VycyA9PT0gbWF4VGltZS5ob3VycyAmJiBtaW51dGVzIDw9IG1heFRpbWUubWludXRlcykpO1xuXG4gICAgLy8gSWYgdGltZSBpcyB2YWxpZCwgcmV0dXJuIG51bGwgKG5vIGVycm9yKVxuICAgIGlmIChpc1ZhbGlkVGltZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbGlkYXRpb24gZXJyb3Igd2l0aCBmb3JtYXR0ZWQgdGltZSByYW5nZVxuICAgIHJldHVybiB7XG4gICAgICBmb3JtX3ZhbGlkYXRpb25faW52YWxpZF90aW1lOiB7XG4gICAgICAgIGZyb206IGZvcm1hdFRpbWUobWluVGltZSksXG4gICAgICAgIHRvOiBmb3JtYXRUaW1lKG1heFRpbWUpLFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgY2FyUGxhdGVTZXF1ZW50aWFsUmVxdWlyZWQoY2FyUGxhdGVGaWVsZDogc3RyaW5nID0gJ2NhclBsYXRlJyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gVGliYVZhbGlkYXRvcnMuc2VxdWVudGlhbFJlcXVpcmVkKGNhclBsYXRlRmllbGQsIExvY2FsaXphdGlvbi5jYXJfcGxhdGVfc2VxdWVudGlhbF9yZXF1aXJlZCk7XG4gIH1cblxuICBzdGF0aWMgY2FyZFNlcXVlbnRpYWxSZXF1aXJlZChjYXJkRmllbGQ6IHN0cmluZyA9ICdiYWRnZScpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIFRpYmFWYWxpZGF0b3JzLnNlcXVlbnRpYWxSZXF1aXJlZChjYXJkRmllbGQsIExvY2FsaXphdGlvbi5jYXJkX3NlcXVlbnRpYWxfcmVxdWlyZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2VxdWVudGlhbFJlcXVpcmVkKGFycmF5RmllbGQ6IHN0cmluZywgZXJyb3JLZXk6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGZvcm1Hcm91cDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgY29udHJvbEFycmF5ID0gZm9ybUdyb3VwLmdldChhcnJheUZpZWxkKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgaWYgKCFjb250cm9sQXJyYXkpIHJldHVybiBudWxsO1xuXG4gICAgICAvLyBWYWx1ZXMgbWF5IGJlIG51bWJlcnMgKGUuZy4gYmFkZ2VzIHBhdGNoZWQgZnJvbSB0aGUgRFRPIGluIGVkaXQgbW9kZSkg4oCUIGNvZXJjZSB0byBzdHJpbmdcbiAgICAgIGNvbnN0IHJhd1ZhbHVlcyA9IGNvbnRyb2xBcnJheS5jb250cm9scy5tYXAoYyA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYy5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdmFsdWVzID0gcmF3VmFsdWVzLm1hcCh2ID0+IHYudHJpbSgpKTtcbiAgICAgIGNvbnN0IGxhc3RGaWxsZWRJbmRleCA9IHZhbHVlcy5yZWR1Y2UoKGxhc3QsIHYsIGkpID0+ICh2ID8gaSA6IGxhc3QpLCAtMSk7XG5cbiAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWVDb250cm9sID0gY29udHJvbEFycmF5LmF0KGkpLmdldCgndmFsdWUnKTtcbiAgICAgICAgaWYgKCF2YWx1ZUNvbnRyb2wpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGlzR2FwID0gIXZhbHVlc1tpXSAmJiBpIDwgbGFzdEZpbGxlZEluZGV4O1xuICAgICAgICBjb25zdCBpc1doaXRlc3BhY2VPbmx5ID0gcmF3VmFsdWVzW2ldICE9PSAnJyAmJiAhdmFsdWVzW2ldO1xuICAgICAgICBjb25zdCBpc1Byb2JsZW1hdGljID0gaXNHYXAgfHwgaXNXaGl0ZXNwYWNlT25seTtcbiAgICAgICAgaWYgKGlzUHJvYmxlbWF0aWMpIHtcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc3QgZXJyb3JzID0geyAuLi4odmFsdWVDb250cm9sLmVycm9ycyA/PyB7fSksIFtlcnJvcktleV06IHRydWUgfTtcbiAgICAgICAgICB2YWx1ZUNvbnRyb2wuc2V0RXJyb3JzKGVycm9ycyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDb250cm9sLmhhc0Vycm9yKGVycm9yS2V5KSkge1xuICAgICAgICAgIGNvbnN0IHsgW2Vycm9yS2V5XTogcmVtb3ZlZCwgLi4ucmVzdCB9ID0gdmFsdWVDb250cm9sLmVycm9ycztcbiAgICAgICAgICB2YWx1ZUNvbnRyb2wuc2V0RXJyb3JzKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA/IHJlc3QgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFzRXJyb3IgPyB7IFtlcnJvcktleV06IHRydWUgfSA6IG51bGw7XG4gICAgfTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -71389,6 +71389,7 @@ var Localization;
|
|
|
71389
71389
|
Localization["toggle_hotel_posting_successfully_msg"] = "toggle_hotel_posting_successfully_msg";
|
|
71390
71390
|
Localization["toggle_hotel_posting_save_failure"] = "toggle_hotel_posting_save_failure";
|
|
71391
71391
|
Localization["toggle_hotel_posting_save_in_progress"] = "toggle_hotel_posting_save_in_progress";
|
|
71392
|
+
Localization["card_sequential_required"] = "card_sequential_required";
|
|
71392
71393
|
})(Localization || (Localization = {}));
|
|
71393
71394
|
|
|
71394
71395
|
//----------------------
|
|
@@ -109525,16 +109526,26 @@ class TibaValidators {
|
|
|
109525
109526
|
};
|
|
109526
109527
|
}
|
|
109527
109528
|
static carPlateSequentialRequired(carPlateField = 'carPlate') {
|
|
109529
|
+
return TibaValidators.sequentialRequired(carPlateField, Localization.car_plate_sequential_required);
|
|
109530
|
+
}
|
|
109531
|
+
static cardSequentialRequired(cardField = 'badge') {
|
|
109532
|
+
return TibaValidators.sequentialRequired(cardField, Localization.card_sequential_required);
|
|
109533
|
+
}
|
|
109534
|
+
static sequentialRequired(arrayField, errorKey) {
|
|
109528
109535
|
return (formGroup) => {
|
|
109529
|
-
const
|
|
109530
|
-
if (!
|
|
109536
|
+
const controlArray = formGroup.get(arrayField);
|
|
109537
|
+
if (!controlArray)
|
|
109531
109538
|
return null;
|
|
109532
|
-
|
|
109539
|
+
// Values may be numbers (e.g. badges patched from the DTO in edit mode) — coerce to string
|
|
109540
|
+
const rawValues = controlArray.controls.map(c => {
|
|
109541
|
+
const value = c.get('value')?.value;
|
|
109542
|
+
return value === null || value === undefined ? '' : String(value);
|
|
109543
|
+
});
|
|
109533
109544
|
const values = rawValues.map(v => v.trim());
|
|
109534
109545
|
const lastFilledIndex = values.reduce((last, v, i) => (v ? i : last), -1);
|
|
109535
109546
|
let hasError = false;
|
|
109536
|
-
for (let i = 0; i <
|
|
109537
|
-
const valueControl =
|
|
109547
|
+
for (let i = 0; i < controlArray.length; i++) {
|
|
109548
|
+
const valueControl = controlArray.at(i).get('value');
|
|
109538
109549
|
if (!valueControl)
|
|
109539
109550
|
continue;
|
|
109540
109551
|
const isGap = !values[i] && i < lastFilledIndex;
|
|
@@ -109542,15 +109553,15 @@ class TibaValidators {
|
|
|
109542
109553
|
const isProblematic = isGap || isWhitespaceOnly;
|
|
109543
109554
|
if (isProblematic) {
|
|
109544
109555
|
hasError = true;
|
|
109545
|
-
const errors = { ...(valueControl.errors ?? {}),
|
|
109556
|
+
const errors = { ...(valueControl.errors ?? {}), [errorKey]: true };
|
|
109546
109557
|
valueControl.setErrors(errors);
|
|
109547
109558
|
}
|
|
109548
|
-
else if (valueControl.hasError(
|
|
109549
|
-
const {
|
|
109559
|
+
else if (valueControl.hasError(errorKey)) {
|
|
109560
|
+
const { [errorKey]: removed, ...rest } = valueControl.errors;
|
|
109550
109561
|
valueControl.setErrors(Object.keys(rest).length ? rest : null);
|
|
109551
109562
|
}
|
|
109552
109563
|
}
|
|
109553
|
-
return hasError ? {
|
|
109564
|
+
return hasError ? { [errorKey]: true } : null;
|
|
109554
109565
|
};
|
|
109555
109566
|
}
|
|
109556
109567
|
}
|
|
@@ -110742,7 +110753,7 @@ class FieldValidationsComponent extends BaseComponent {
|
|
|
110742
110753
|
return errors;
|
|
110743
110754
|
}
|
|
110744
110755
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FieldValidationsComponent, deps: [{ token: i1.ControlContainer }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
110745
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FieldValidationsComponent, isStandalone: true, selector: "[tb-field-validations]", inputs: { controlName: "controlName", label: "label", errors: "errors", touched: "touched" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"touched || controlContainer.control.get(controlName)?.touched\">\n <ng-container *tbVar=\"getErrors | wrapFn: controlContainer.control.get(controlName)?.errors ?? errors as errors\">\n <div *ngIf=\"ObjectKeys(errors || {}).length > 1; then hasMultiErrors else hasOneError\"></div>\n <ng-template #hasMultiErrors>\n {{ L.invalid | translate: { controlName: label | translate} }}\n </ng-template>\n <ng-template #hasOneError>\n <div *ngIf=\"errors?.required\">\n {{ L.form_validation_required_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDate\">\n {{ L.form_validation_invalid_date_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDateRange\">\n {{ L.form_validation_invalid_date_range | translate }}</div>\n <div *ngIf=\"errors?.invalidTerms\">\n {{ L.form_validation_terms_policy | translate }}</div>\n <div *ngIf=\"errors?.min min\">\n {{ L.form_validation_min_message | translate: { controlName: label | translate, value: errors?.min.min || 0 } }}\n </div>\n <div *ngIf=\"errors?.max\">\n {{ L.form_validation_max_message | translate: { controlName: label | translate, value: errors?.max.max || 0 } }}\n </div>\n <div *ngIf=\"errors?.minlength\">\n {{ L.form_validation_min_length_message | translate: { controlName: label | translate, value: errors?.minlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.maxlength\">\n {{ L.form_validation_max_length_message | translate: { controlName: label | translate, value: errors?.maxlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.invalidNumberLength\">\n {{ L.form_validation_invalid_length_message | translate: { controlName: label | translate, value: errors?.invalidNumberLength.requiredLength\n || 0 } }}\n </div>\n <div *ngIf=\"errors?.integerNumber\">\n {{ L.form_validation_invalid_integer_number_message | translate: { controlName: label | translate, value: errors?.integerNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.integerPositiveNumber\">\n {{ L.form_validation_invalid_integer_positive_number_message | translate: { controlName: label | translate, value:\n errors?.integerPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.decimalNumber\">\n {{ L.form_validation_invalid_decimal_number_message | translate: { controlName: label | translate, value: errors?.decimalNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.decimalPositiveNumber\">\n {{ L.form_validation_invalid_decimal_positive_number_message | translate: { controlName: label | translate, value:\n errors?.decimalPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbers\">\n {{ L.form_validation_invalid_positive_number_message | translate: { controlName: label | translate, value: errors?.positiveNumbers.value || 0\n } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbersGreaterThanZero\">\n {{ L.form_validation_invalid_positive_number_greater_than_zero | translate: { controlName: label | translate, value:\n errors?.positiveNumbersGreaterThanZero.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.mobileNumbers\">\n {{ L.form_validation_invalid_mobile_number_message | translate: { controlName: label | translate, value: errors?.mobileNumbers.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.email\">\n {{ L.form_validation_email_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.pattern\">\n {{ L.form_validation_password_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordPolicyRequirements\">\n {{ L.form_validation_password_policy | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordNotMatch\">\n {{ L.form_validation_password_not_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordMatch\">\n {{ L.form_validation_password_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noWhitespaceWithinSentence\">\n {{ L.form_validation_no_white_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDotWithinSentence\">\n {{ L.form_validation_no_dot_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.guidIsValid\">\n {{ L.form_validation_invalid_uuid | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDefaultAccessProfile\">\n {{ L.no_access_default_profile | translate: { controlName: label | translate,\n companyName: errors?.noDefaultAccessProfile?.companyName } }}\n </div>\n <div *ngIf=\"errors?.noEmoji\">\n {{ L.form_validation_invalid_no_emoji_message | translate: { controlName: label | translate, value: errors?.noEmoji.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_unsafe_html\">\n {{ L.form_validation_unsafe_html | translate }}\n </div>\n <div *ngIf=\"errors?.ipv4Format\">\n {{ L.form_validation_invalid_ipv4_message | translate: { controlName: label | translate, value: errors?.ipv4Format.value } }}\n </div>\n <div *ngIf=\"errors?.ipv4NotZero\">\n {{ L.form_validation_ipv4_not_zero | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.duplicateIP\">\n {{ L.form_validation_duplicate_ip | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.alphanumericRegex\">\n {{ L.form_validation_alphanumeric_message | translate: { controlName: label | translate, value: errors?.alphanumericRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.validatePositiveInteger\">\n {{ L.form_validation_invalid_positive_integer_number_message | translate: { controlName: label | translate, value:\n errors?.validatePositiveInteger.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.roleNameAlreadyExists\">\n {{ L.role_name_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberAlreadyExists\">\n {{ L.rate_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.accessProfileNumberTaken\">\n {{ L.access_profile_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.cashierNumberTaken\">\n {{ L.cashier_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberIsZero\">\n {{ L.rate_number_is_zero | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time\">\n {{ L.form_validation_invalid_time | translate: { controlName: label ,from: '00:00',to:'00:00' } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time_format\">\n {{ L.form_validation_invalid_time_format | translate: { controlName: label } }}\n </div>\n <div *ngIf=\"errors?.positiveIntegerNumbersGreaterThanZeroRegex\">\n {{ L.form_validation_invalid_positive_integer_number_wo_zero_message | translate: { controlName: label | translate, value:\n errors?.positiveIntegerNumbersGreaterThanZeroRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_maximum\">\n {{ L.form_validation_units_balance_maximum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_minimum\">\n {{ L.form_validation_units_balance_minimum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_percentage\">\n {{ L.form_validation_invalid_percentage_message | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_decimal_percentage\">\n {{ L.form_validation_invalid_percentage_decimal_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_less_than_occupancy\">\n {{ L.revert_at_must_be_less_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_more_than_occupancy\">\n {{ L.revert_at_must_be_more_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.car_plate_sequential_required\">\n {{ L.car_plate_sequential_required | translate }}\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: WrapFnPipe, name: "wrapFn" }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$5.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: SharedDirectivesModule }, { kind: "directive", type: VarDirective, selector: "[tbVar]", inputs: ["tbVar"] }] }); }
|
|
110756
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FieldValidationsComponent, isStandalone: true, selector: "[tb-field-validations]", inputs: { controlName: "controlName", label: "label", errors: "errors", touched: "touched" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"touched || controlContainer.control.get(controlName)?.touched\">\n <ng-container *tbVar=\"getErrors | wrapFn: controlContainer.control.get(controlName)?.errors ?? errors as errors\">\n <div *ngIf=\"ObjectKeys(errors || {}).length > 1; then hasMultiErrors else hasOneError\"></div>\n <ng-template #hasMultiErrors>\n {{ L.invalid | translate: { controlName: label | translate} }}\n </ng-template>\n <ng-template #hasOneError>\n <div *ngIf=\"errors?.required\">\n {{ L.form_validation_required_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDate\">\n {{ L.form_validation_invalid_date_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDateRange\">\n {{ L.form_validation_invalid_date_range | translate }}</div>\n <div *ngIf=\"errors?.invalidTerms\">\n {{ L.form_validation_terms_policy | translate }}</div>\n <div *ngIf=\"errors?.min min\">\n {{ L.form_validation_min_message | translate: { controlName: label | translate, value: errors?.min.min || 0 } }}\n </div>\n <div *ngIf=\"errors?.max\">\n {{ L.form_validation_max_message | translate: { controlName: label | translate, value: errors?.max.max || 0 } }}\n </div>\n <div *ngIf=\"errors?.minlength\">\n {{ L.form_validation_min_length_message | translate: { controlName: label | translate, value: errors?.minlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.maxlength\">\n {{ L.form_validation_max_length_message | translate: { controlName: label | translate, value: errors?.maxlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.invalidNumberLength\">\n {{ L.form_validation_invalid_length_message | translate: { controlName: label | translate, value: errors?.invalidNumberLength.requiredLength\n || 0 } }}\n </div>\n <div *ngIf=\"errors?.integerNumber\">\n {{ L.form_validation_invalid_integer_number_message | translate: { controlName: label | translate, value: errors?.integerNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.integerPositiveNumber\">\n {{ L.form_validation_invalid_integer_positive_number_message | translate: { controlName: label | translate, value:\n errors?.integerPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.decimalNumber\">\n {{ L.form_validation_invalid_decimal_number_message | translate: { controlName: label | translate, value: errors?.decimalNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.decimalPositiveNumber\">\n {{ L.form_validation_invalid_decimal_positive_number_message | translate: { controlName: label | translate, value:\n errors?.decimalPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbers\">\n {{ L.form_validation_invalid_positive_number_message | translate: { controlName: label | translate, value: errors?.positiveNumbers.value || 0\n } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbersGreaterThanZero\">\n {{ L.form_validation_invalid_positive_number_greater_than_zero | translate: { controlName: label | translate, value:\n errors?.positiveNumbersGreaterThanZero.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.mobileNumbers\">\n {{ L.form_validation_invalid_mobile_number_message | translate: { controlName: label | translate, value: errors?.mobileNumbers.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.email\">\n {{ L.form_validation_email_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.pattern\">\n {{ L.form_validation_password_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordPolicyRequirements\">\n {{ L.form_validation_password_policy | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordNotMatch\">\n {{ L.form_validation_password_not_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordMatch\">\n {{ L.form_validation_password_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noWhitespaceWithinSentence\">\n {{ L.form_validation_no_white_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDotWithinSentence\">\n {{ L.form_validation_no_dot_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.guidIsValid\">\n {{ L.form_validation_invalid_uuid | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDefaultAccessProfile\">\n {{ L.no_access_default_profile | translate: { controlName: label | translate,\n companyName: errors?.noDefaultAccessProfile?.companyName } }}\n </div>\n <div *ngIf=\"errors?.noEmoji\">\n {{ L.form_validation_invalid_no_emoji_message | translate: { controlName: label | translate, value: errors?.noEmoji.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_unsafe_html\">\n {{ L.form_validation_unsafe_html | translate }}\n </div>\n <div *ngIf=\"errors?.ipv4Format\">\n {{ L.form_validation_invalid_ipv4_message | translate: { controlName: label | translate, value: errors?.ipv4Format.value } }}\n </div>\n <div *ngIf=\"errors?.ipv4NotZero\">\n {{ L.form_validation_ipv4_not_zero | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.duplicateIP\">\n {{ L.form_validation_duplicate_ip | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.alphanumericRegex\">\n {{ L.form_validation_alphanumeric_message | translate: { controlName: label | translate, value: errors?.alphanumericRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.validatePositiveInteger\">\n {{ L.form_validation_invalid_positive_integer_number_message | translate: { controlName: label | translate, value:\n errors?.validatePositiveInteger.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.roleNameAlreadyExists\">\n {{ L.role_name_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberAlreadyExists\">\n {{ L.rate_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.accessProfileNumberTaken\">\n {{ L.access_profile_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.cashierNumberTaken\">\n {{ L.cashier_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberIsZero\">\n {{ L.rate_number_is_zero | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time\">\n {{ L.form_validation_invalid_time | translate: { controlName: label ,from: '00:00',to:'00:00' } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time_format\">\n {{ L.form_validation_invalid_time_format | translate: { controlName: label } }}\n </div>\n <div *ngIf=\"errors?.positiveIntegerNumbersGreaterThanZeroRegex\">\n {{ L.form_validation_invalid_positive_integer_number_wo_zero_message | translate: { controlName: label | translate, value:\n errors?.positiveIntegerNumbersGreaterThanZeroRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_maximum\">\n {{ L.form_validation_units_balance_maximum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_minimum\">\n {{ L.form_validation_units_balance_minimum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_percentage\">\n {{ L.form_validation_invalid_percentage_message | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_decimal_percentage\">\n {{ L.form_validation_invalid_percentage_decimal_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_less_than_occupancy\">\n {{ L.revert_at_must_be_less_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_more_than_occupancy\">\n {{ L.revert_at_must_be_more_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.car_plate_sequential_required\">\n {{ L.car_plate_sequential_required | translate }}\n </div>\n <div *ngIf=\"errors?.card_sequential_required\">\n {{ L.card_sequential_required | translate }}\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: WrapFnPipe, name: "wrapFn" }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$5.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: SharedDirectivesModule }, { kind: "directive", type: VarDirective, selector: "[tbVar]", inputs: ["tbVar"] }] }); }
|
|
110746
110757
|
}
|
|
110747
110758
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FieldValidationsComponent, decorators: [{
|
|
110748
110759
|
type: Component,
|
|
@@ -110751,7 +110762,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
110751
110762
|
WrapFnPipe,
|
|
110752
110763
|
LocalizationModule,
|
|
110753
110764
|
SharedDirectivesModule,
|
|
110754
|
-
], template: "<ng-container *ngIf=\"touched || controlContainer.control.get(controlName)?.touched\">\n <ng-container *tbVar=\"getErrors | wrapFn: controlContainer.control.get(controlName)?.errors ?? errors as errors\">\n <div *ngIf=\"ObjectKeys(errors || {}).length > 1; then hasMultiErrors else hasOneError\"></div>\n <ng-template #hasMultiErrors>\n {{ L.invalid | translate: { controlName: label | translate} }}\n </ng-template>\n <ng-template #hasOneError>\n <div *ngIf=\"errors?.required\">\n {{ L.form_validation_required_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDate\">\n {{ L.form_validation_invalid_date_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDateRange\">\n {{ L.form_validation_invalid_date_range | translate }}</div>\n <div *ngIf=\"errors?.invalidTerms\">\n {{ L.form_validation_terms_policy | translate }}</div>\n <div *ngIf=\"errors?.min min\">\n {{ L.form_validation_min_message | translate: { controlName: label | translate, value: errors?.min.min || 0 } }}\n </div>\n <div *ngIf=\"errors?.max\">\n {{ L.form_validation_max_message | translate: { controlName: label | translate, value: errors?.max.max || 0 } }}\n </div>\n <div *ngIf=\"errors?.minlength\">\n {{ L.form_validation_min_length_message | translate: { controlName: label | translate, value: errors?.minlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.maxlength\">\n {{ L.form_validation_max_length_message | translate: { controlName: label | translate, value: errors?.maxlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.invalidNumberLength\">\n {{ L.form_validation_invalid_length_message | translate: { controlName: label | translate, value: errors?.invalidNumberLength.requiredLength\n || 0 } }}\n </div>\n <div *ngIf=\"errors?.integerNumber\">\n {{ L.form_validation_invalid_integer_number_message | translate: { controlName: label | translate, value: errors?.integerNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.integerPositiveNumber\">\n {{ L.form_validation_invalid_integer_positive_number_message | translate: { controlName: label | translate, value:\n errors?.integerPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.decimalNumber\">\n {{ L.form_validation_invalid_decimal_number_message | translate: { controlName: label | translate, value: errors?.decimalNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.decimalPositiveNumber\">\n {{ L.form_validation_invalid_decimal_positive_number_message | translate: { controlName: label | translate, value:\n errors?.decimalPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbers\">\n {{ L.form_validation_invalid_positive_number_message | translate: { controlName: label | translate, value: errors?.positiveNumbers.value || 0\n } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbersGreaterThanZero\">\n {{ L.form_validation_invalid_positive_number_greater_than_zero | translate: { controlName: label | translate, value:\n errors?.positiveNumbersGreaterThanZero.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.mobileNumbers\">\n {{ L.form_validation_invalid_mobile_number_message | translate: { controlName: label | translate, value: errors?.mobileNumbers.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.email\">\n {{ L.form_validation_email_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.pattern\">\n {{ L.form_validation_password_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordPolicyRequirements\">\n {{ L.form_validation_password_policy | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordNotMatch\">\n {{ L.form_validation_password_not_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordMatch\">\n {{ L.form_validation_password_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noWhitespaceWithinSentence\">\n {{ L.form_validation_no_white_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDotWithinSentence\">\n {{ L.form_validation_no_dot_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.guidIsValid\">\n {{ L.form_validation_invalid_uuid | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDefaultAccessProfile\">\n {{ L.no_access_default_profile | translate: { controlName: label | translate,\n companyName: errors?.noDefaultAccessProfile?.companyName } }}\n </div>\n <div *ngIf=\"errors?.noEmoji\">\n {{ L.form_validation_invalid_no_emoji_message | translate: { controlName: label | translate, value: errors?.noEmoji.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_unsafe_html\">\n {{ L.form_validation_unsafe_html | translate }}\n </div>\n <div *ngIf=\"errors?.ipv4Format\">\n {{ L.form_validation_invalid_ipv4_message | translate: { controlName: label | translate, value: errors?.ipv4Format.value } }}\n </div>\n <div *ngIf=\"errors?.ipv4NotZero\">\n {{ L.form_validation_ipv4_not_zero | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.duplicateIP\">\n {{ L.form_validation_duplicate_ip | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.alphanumericRegex\">\n {{ L.form_validation_alphanumeric_message | translate: { controlName: label | translate, value: errors?.alphanumericRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.validatePositiveInteger\">\n {{ L.form_validation_invalid_positive_integer_number_message | translate: { controlName: label | translate, value:\n errors?.validatePositiveInteger.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.roleNameAlreadyExists\">\n {{ L.role_name_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberAlreadyExists\">\n {{ L.rate_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.accessProfileNumberTaken\">\n {{ L.access_profile_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.cashierNumberTaken\">\n {{ L.cashier_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberIsZero\">\n {{ L.rate_number_is_zero | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time\">\n {{ L.form_validation_invalid_time | translate: { controlName: label ,from: '00:00',to:'00:00' } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time_format\">\n {{ L.form_validation_invalid_time_format | translate: { controlName: label } }}\n </div>\n <div *ngIf=\"errors?.positiveIntegerNumbersGreaterThanZeroRegex\">\n {{ L.form_validation_invalid_positive_integer_number_wo_zero_message | translate: { controlName: label | translate, value:\n errors?.positiveIntegerNumbersGreaterThanZeroRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_maximum\">\n {{ L.form_validation_units_balance_maximum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_minimum\">\n {{ L.form_validation_units_balance_minimum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_percentage\">\n {{ L.form_validation_invalid_percentage_message | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_decimal_percentage\">\n {{ L.form_validation_invalid_percentage_decimal_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_less_than_occupancy\">\n {{ L.revert_at_must_be_less_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_more_than_occupancy\">\n {{ L.revert_at_must_be_more_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.car_plate_sequential_required\">\n {{ L.car_plate_sequential_required | translate }}\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n" }]
|
|
110765
|
+
], template: "<ng-container *ngIf=\"touched || controlContainer.control.get(controlName)?.touched\">\n <ng-container *tbVar=\"getErrors | wrapFn: controlContainer.control.get(controlName)?.errors ?? errors as errors\">\n <div *ngIf=\"ObjectKeys(errors || {}).length > 1; then hasMultiErrors else hasOneError\"></div>\n <ng-template #hasMultiErrors>\n {{ L.invalid | translate: { controlName: label | translate} }}\n </ng-template>\n <ng-template #hasOneError>\n <div *ngIf=\"errors?.required\">\n {{ L.form_validation_required_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDate\">\n {{ L.form_validation_invalid_date_message | translate }}</div>\n <div *ngIf=\"errors?.invalidDateRange\">\n {{ L.form_validation_invalid_date_range | translate }}</div>\n <div *ngIf=\"errors?.invalidTerms\">\n {{ L.form_validation_terms_policy | translate }}</div>\n <div *ngIf=\"errors?.min min\">\n {{ L.form_validation_min_message | translate: { controlName: label | translate, value: errors?.min.min || 0 } }}\n </div>\n <div *ngIf=\"errors?.max\">\n {{ L.form_validation_max_message | translate: { controlName: label | translate, value: errors?.max.max || 0 } }}\n </div>\n <div *ngIf=\"errors?.minlength\">\n {{ L.form_validation_min_length_message | translate: { controlName: label | translate, value: errors?.minlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.maxlength\">\n {{ L.form_validation_max_length_message | translate: { controlName: label | translate, value: errors?.maxlength.requiredLength || 0 } }}\n </div>\n <div *ngIf=\"errors?.invalidNumberLength\">\n {{ L.form_validation_invalid_length_message | translate: { controlName: label | translate, value: errors?.invalidNumberLength.requiredLength\n || 0 } }}\n </div>\n <div *ngIf=\"errors?.integerNumber\">\n {{ L.form_validation_invalid_integer_number_message | translate: { controlName: label | translate, value: errors?.integerNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.integerPositiveNumber\">\n {{ L.form_validation_invalid_integer_positive_number_message | translate: { controlName: label | translate, value:\n errors?.integerPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.decimalNumber\">\n {{ L.form_validation_invalid_decimal_number_message | translate: { controlName: label | translate, value: errors?.decimalNumber.value || 0 }\n }}\n </div>\n <div *ngIf=\"errors?.decimalPositiveNumber\">\n {{ L.form_validation_invalid_decimal_positive_number_message | translate: { controlName: label | translate, value:\n errors?.decimalPositiveNumber.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbers\">\n {{ L.form_validation_invalid_positive_number_message | translate: { controlName: label | translate, value: errors?.positiveNumbers.value || 0\n } }}\n </div>\n <div *ngIf=\"errors?.positiveNumbersGreaterThanZero\">\n {{ L.form_validation_invalid_positive_number_greater_than_zero | translate: { controlName: label | translate, value:\n errors?.positiveNumbersGreaterThanZero.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.mobileNumbers\">\n {{ L.form_validation_invalid_mobile_number_message | translate: { controlName: label | translate, value: errors?.mobileNumbers.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.email\">\n {{ L.form_validation_email_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.pattern\">\n {{ L.form_validation_password_pattern | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordPolicyRequirements\">\n {{ L.form_validation_password_policy | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordNotMatch\">\n {{ L.form_validation_password_not_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.passwordMatch\">\n {{ L.form_validation_password_match | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noWhitespaceWithinSentence\">\n {{ L.form_validation_no_white_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDotWithinSentence\">\n {{ L.form_validation_no_dot_space_within_sentence | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.guidIsValid\">\n {{ L.form_validation_invalid_uuid | translate: { controlName: label | translate} }}\n </div>\n <div *ngIf=\"errors?.noDefaultAccessProfile\">\n {{ L.no_access_default_profile | translate: { controlName: label | translate,\n companyName: errors?.noDefaultAccessProfile?.companyName } }}\n </div>\n <div *ngIf=\"errors?.noEmoji\">\n {{ L.form_validation_invalid_no_emoji_message | translate: { controlName: label | translate, value: errors?.noEmoji.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_unsafe_html\">\n {{ L.form_validation_unsafe_html | translate }}\n </div>\n <div *ngIf=\"errors?.ipv4Format\">\n {{ L.form_validation_invalid_ipv4_message | translate: { controlName: label | translate, value: errors?.ipv4Format.value } }}\n </div>\n <div *ngIf=\"errors?.ipv4NotZero\">\n {{ L.form_validation_ipv4_not_zero | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.duplicateIP\">\n {{ L.form_validation_duplicate_ip | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.alphanumericRegex\">\n {{ L.form_validation_alphanumeric_message | translate: { controlName: label | translate, value: errors?.alphanumericRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.validatePositiveInteger\">\n {{ L.form_validation_invalid_positive_integer_number_message | translate: { controlName: label | translate, value:\n errors?.validatePositiveInteger.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.roleNameAlreadyExists\">\n {{ L.role_name_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberAlreadyExists\">\n {{ L.rate_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.accessProfileNumberTaken\">\n {{ L.access_profile_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.cashierNumberTaken\">\n {{ L.cashier_number_already_exists | translate }}\n </div>\n <div *ngIf=\"errors?.rateNumberIsZero\">\n {{ L.rate_number_is_zero | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time\">\n {{ L.form_validation_invalid_time | translate: { controlName: label ,from: '00:00',to:'00:00' } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_time_format\">\n {{ L.form_validation_invalid_time_format | translate: { controlName: label } }}\n </div>\n <div *ngIf=\"errors?.positiveIntegerNumbersGreaterThanZeroRegex\">\n {{ L.form_validation_invalid_positive_integer_number_wo_zero_message | translate: { controlName: label | translate, value:\n errors?.positiveIntegerNumbersGreaterThanZeroRegex.value || 0 } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_maximum\">\n {{ L.form_validation_units_balance_maximum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_units_balance_minimum\">\n {{ L.form_validation_units_balance_minimum | translate: { controlName: label | translate } }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_percentage\">\n {{ L.form_validation_invalid_percentage_message | translate }}\n </div>\n <div *ngIf=\"errors?.form_validation_invalid_decimal_percentage\">\n {{ L.form_validation_invalid_percentage_decimal_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_less_than_occupancy\">\n {{ L.revert_at_must_be_less_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.revert_at_must_be_more_than_occupancy\">\n {{ L.revert_at_must_be_more_than_occupancy_message | translate }}\n </div>\n <div *ngIf=\"errors?.car_plate_sequential_required\">\n {{ L.car_plate_sequential_required | translate }}\n </div>\n <div *ngIf=\"errors?.card_sequential_required\">\n {{ L.card_sequential_required | translate }}\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n" }]
|
|
110755
110766
|
}], ctorParameters: () => [{ type: i1.ControlContainer }], propDecorators: { controlName: [{
|
|
110756
110767
|
type: Input
|
|
110757
110768
|
}], label: [{
|