@seniorsistemas/angular-components 19.5.5 → 19.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/accordion/README.md +95 -59
  2. package/calendar-mask/lib/calendar-mask/calendar-mask.directive.d.ts +4 -0
  3. package/datepicker/README.md +175 -0
  4. package/datepicker/index.d.ts +5 -0
  5. package/datepicker/lib/datepicker/date.utils.d.ts +21 -0
  6. package/datepicker/lib/datepicker/datepicker.component.d.ts +254 -0
  7. package/datepicker/lib/datepicker/models/index.d.ts +16 -0
  8. package/datepicker/public-api.d.ts +2 -0
  9. package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +3 -1
  10. package/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.d.ts +5 -0
  11. package/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +119 -24
  12. package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +6 -0
  13. package/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.d.ts +6 -23
  14. package/dynamic-form/public-api.d.ts +1 -0
  15. package/editor/README.md +229 -0
  16. package/editor/index.d.ts +5 -0
  17. package/editor/lib/editor/editor.component.d.ts +127 -0
  18. package/editor/lib/editor/link-dialog/link-dialog.component.d.ts +18 -0
  19. package/editor/lib/editor/models/index.d.ts +12 -0
  20. package/editor/lib/editor/toolbar-button/editor-toolbar-button.component.d.ts +10 -0
  21. package/editor/public-api.d.ts +2 -0
  22. package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.directive.mjs +5 -1
  23. package/esm2022/datepicker/lib/datepicker/date.utils.mjs +182 -0
  24. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +1062 -0
  25. package/esm2022/datepicker/lib/datepicker/models/index.mjs +2 -0
  26. package/esm2022/datepicker/public-api.mjs +2 -0
  27. package/esm2022/datepicker/seniorsistemas-angular-components-datepicker.mjs +5 -0
  28. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +11 -5
  29. package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.mjs +2 -0
  30. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.mjs +1 -1
  31. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
  32. package/esm2022/dynamic-form/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +2 -2
  33. package/esm2022/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +23 -116
  34. package/esm2022/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +3 -3
  35. package/esm2022/dynamic-form/public-api.mjs +1 -1
  36. package/esm2022/editor/lib/editor/editor.component.mjs +375 -0
  37. package/esm2022/editor/lib/editor/link-dialog/link-dialog.component.mjs +48 -0
  38. package/esm2022/editor/lib/editor/models/index.mjs +3 -0
  39. package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +17 -0
  40. package/esm2022/editor/public-api.mjs +3 -0
  41. package/esm2022/editor/seniorsistemas-angular-components-editor.mjs +5 -0
  42. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.mjs +22 -12
  43. package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +5 -5
  44. package/esm2022/lib/locale/fallback.mjs +82 -3
  45. package/esm2022/optional-fields/editor/editor-field/editor-field.component.mjs +5 -6
  46. package/esm2022/optional-fields/editor/editor-field.mjs +1 -1
  47. package/esm2022/panel/lib/panel/panel.component.mjs +7 -3
  48. package/esm2022/select/lib/select/select.component.mjs +4 -8
  49. package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +5 -1
  50. package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs +4 -0
  51. package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs.map +1 -1
  52. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +1250 -0
  53. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -0
  54. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +49 -135
  55. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  56. package/fesm2022/seniorsistemas-angular-components-editor.mjs +437 -0
  57. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -0
  58. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +24 -15
  59. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  60. package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs +4 -5
  61. package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs.map +1 -1
  62. package/fesm2022/seniorsistemas-angular-components-panel.mjs +6 -2
  63. package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
  64. package/fesm2022/seniorsistemas-angular-components-select.mjs +3 -7
  65. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  66. package/fesm2022/seniorsistemas-angular-components-shared.mjs +4 -0
  67. package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
  68. package/fesm2022/seniorsistemas-angular-components.mjs +81 -2
  69. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  70. package/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.d.ts +6 -4
  71. package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +2 -2
  72. package/loading-state/README.md +57 -17
  73. package/optional-fields/editor/editor-field.d.ts +9 -6
  74. package/package.json +74 -8
  75. package/panel/README.md +12 -1
  76. package/panel/lib/panel/panel.component.d.ts +3 -1
  77. package/schematics/collection.json +4 -0
  78. package/schematics/migrations/migrate-p-datepicker/index.d.ts +2 -0
  79. package/schematics/migrations/migrate-p-datepicker/index.js +141 -0
  80. package/schematics/migrations/migrate-p-datepicker/index.js.map +1 -0
  81. package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +1 -0
  82. package/schematics/migrations/migrate-p-datepicker/index.test.js +392 -0
  83. package/schematics/migrations/migrate-p-datepicker/index.test.js.map +1 -0
  84. package/schematics/migrations.json +10 -0
  85. package/schematics/utils/ast-utils.d.ts +28 -0
  86. package/schematics/utils/ast-utils.js +116 -0
  87. package/schematics/utils/ast-utils.js.map +1 -0
  88. package/schematics/utils/ast-utils.test.d.ts +1 -0
  89. package/schematics/utils/ast-utils.test.js +138 -0
  90. package/schematics/utils/ast-utils.test.js.map +1 -0
  91. package/schematics/utils/workspace-utils.d.ts +6 -0
  92. package/schematics/utils/workspace-utils.js +37 -0
  93. package/schematics/utils/workspace-utils.js.map +1 -0
  94. package/schematics/utils/workspace-utils.test.d.ts +1 -0
  95. package/schematics/utils/workspace-utils.test.js +152 -0
  96. package/schematics/utils/workspace-utils.test.js.map +1 -0
  97. package/shared/lib/accessibility/datepicker-no-period-tab.directive.d.ts +4 -0
  98. package/stats-card/README.md +80 -45
@@ -127,6 +127,10 @@ const ARIA_TRANSLATIONS = {
127
127
  *
128
128
  * Uso: `<p-datepicker sDatepickerNoPeriodTab ...>`
129
129
  *
130
+ * @deprecated Use `s-datepicker` (`<s-datepicker>`), o componente oficial do
131
+ * Design System da Senior, que implementa toda a acessibilidade necessária
132
+ * nativamente. Esta diretiva será removida na próxima major release.
133
+ *
130
134
  * @category Directives
131
135
  */
132
136
  export class DatepickerNoPeriodTabDirective {
@@ -538,4 +542,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
538
542
  type: HostListener,
539
543
  args: ['onYearChange']
540
544
  }] } });
541
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1uby1wZXJpb2QtdGFiLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQvc3JjL2xpYi9hY2Nlc3NpYmlsaXR5L2RhdGVwaWNrZXItbm8tcGVyaW9kLXRhYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFaEQ7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLGdDQUFnQyxDQUFDO0FBRXhELCtGQUErRjtBQUMvRixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFFMUIsOEZBQThGO0FBQzlGLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRWpDLDhFQUE4RTtBQUM5RSxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0ErQnBCLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBQ3pDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBRXpDLE1BQU0sdUJBQXVCLEdBQTJCO0lBQ3BELGFBQWEsRUFBRSxpQkFBaUI7SUFDaEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLGdCQUFnQixFQUFFLGNBQWM7SUFDaEMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsZUFBZSxFQUFFLGNBQWM7SUFDL0IsV0FBVyxFQUFFLGFBQWE7SUFDMUIs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a0I7c0JBRnhCLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBMT0NBTEVfSUQsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGVQaWNrZXIgfSBmcm9tICdwcmltZW5nL2RhdGVwaWNrZXInO1xuXG4vKipcbiAqIENTUyBjdXN0b21pemFkbyBpbmpldGFkbyBnbG9iYWxtZW50ZSBwYXJhIGZvY3VzLXZpc2libGUgbm9zIGludGVybmFscyBkbyBEYXRlUGlja2VyLlxuICogTmVjZXNzw6FyaW8gcG9ycXVlIGNvbSBgYXBwZW5kVG89XCJib2R5XCJgIG8gb3ZlcmxheSBmaWNhIGZvcmEgZG8gaG9zdCBjb21wb25lbnQsXG4gKiBlIGVzdGlsb3MgY29tIGA6aG9zdCA6Om5nLWRlZXBgIG91IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkIG7Do28gYWxjYW7Dp2FtLlxuICovXG5jb25zdCBGT0NVU19TVFlMRV9JRCA9ICdzLWRhdGVwaWNrZXItYTExeS1mb2N1cy1zdHlsZXMnO1xuXG4vKiogRGVsYXkgZW0gbXMgcGFyYSBmb2NvIHDDs3MtYWJlcnR1cmEgZSBuYXZlZ2HDp8OjbyAocGVybWl0ZSBOVkRBIHByb2Nlc3NhciBkaWFsb2cgYW5ub3VuY2UpLiAqL1xuY29uc3QgRk9DVVNfREVMQVlfTVMgPSA1MDtcblxuLyoqIERlbGF5IGVtIG1zIHBhcmEgZGVib3VuY2UgZG8gTXV0YXRpb25PYnNlcnZlciAoZXZpdGEgcmUtZXhlY3XDp8OjbyBwb3IgcmlwcGxlL2FuaW1hw6fDtWVzKS4gKi9cbmNvbnN0IE1VVEFUSU9OX0RFQk9VTkNFX01TID0gMTAwO1xuXG4vKiogQXR0cmlidXRlIG5hbWUgY29uc3RhbnQgdG8gYXZvaWQgU29uYXJRdWJlIGxpdGVyYWwgZHVwbGljYXRpb24gd2FybmluZy4gKi9cbmNvbnN0IEFSSUFfTEFCRUxfQVRUUiA9ICdhcmlhLWxhYmVsJztcbmNvbnN0IEZPQ1VTX1NUWUxFUyA9IGBcbi5wLWRhdGVwaWNrZXItZGF5OmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLWRheS5zLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnAtZGF0ZXBpY2tlci1tb250aDpmb2N1cy12aXNpYmxlLFxuLnAtZGF0ZXBpY2tlci1tb250aC5zLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnAtZGF0ZXBpY2tlci15ZWFyOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLXllYXIucy1kYXRlcGlja2VyLWRheS1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcC1wcmltYXJ5LWNvbG9yLCAjM2I4MmY2KSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi5wLWRhdGVwaWNrZXItc2VsZWN0LW1vbnRoOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLXNlbGVjdC15ZWFyOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4ucC1kYXRlcGlja2VyLXByZXYtYnV0dG9uOmZvY3VzLXZpc2libGUsXG4ucC1kYXRlcGlja2VyLW5leHQtYnV0dG9uOmZvY3VzLXZpc2libGUge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1wLXByaW1hcnktY29sb3IsICMzYjgyZjYpICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG5gO1xuXG4vKipcbiAqIFRyYWR1w6fDtWVzIHB0LUJSIHBhcmEgYXJpYS1sYWJlbHMgZG8gRGF0ZVBpY2tlciBQcmltZU5HLlxuICogUHJpbWVORyB1c2EgYGdldFRyYW5zbGF0aW9uKClgIHF1ZSByZXRvcm5hIGluZ2zDqnMgcG9yIHBhZHLDo29cbiAqIHNlIG7Do28gY29uZmlndXJhZG8gdmlhIGBQcmltZU5HQ29uZmlnLnNldFRyYW5zbGF0aW9uKClgLlxuICpcbiAqIEtleXMgY29ycmVzcG9uZGVtIGFvIHRleHRvIGV4YXRvIHJlbmRlcml6YWRvIHBlbG8gUHJpbWVORyBubyBET006XG4gKiAtIFwiUHJldmlvdXMgTW9udGhcIiAobsOjbyBcIlByZXYgTW9udGhcIilcbiAqIC0gXCJDaG9vc2UgRGF0ZVwiLCBcIkNob29zZSBNb250aFwiLCBcIkNob29zZSBZZWFyXCJcbiAqL1xuY29uc3QgUFJFVl9ERUNBREVfUFQgPSAnRMOpY2FkYSBhbnRlcmlvcic7XG5jb25zdCBQUkVWX0RFQ0FERV9FUyA9ICdEw6ljYWRhIGFudGVyaW9yJztcblxuY29uc3QgQVJJQV9UUkFOU0xBVElPTlNfUFRfQlI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ0Nob29zZSBEYXRlJzogJ1NlbGVjaW9uYXIgZGF0YScsXG4gICAgJ0Nob29zZSBNb250aCc6ICdTZWxlY2lvbmFyIG3DqnMnLFxuICAgICdDaG9vc2UgWWVhcic6ICdTZWxlY2lvbmFyIGFubycsXG4gICAgJ1ByZXZpb3VzIE1vbnRoJzogJ03DqnMgYW50ZXJpb3InLFxuICAgICdOZXh0IE1vbnRoJzogJ1Byw7N4aW1vIG3DqnMnLFxuICAgICdQcmV2aW91cyBZZWFyJzogJ0FubyBhbnRlcmlvcicsXG4gICAgJ05leHQgWWVhcic6ICdQcsOzeGltbyBhbm8nLFxuICAgICdQcmV2aW91cyBEZWNhZGUnOiBQUkVWX0RFQ0FERV9QVCxcbiAgICAnTmV4dCBEZWNhZGUnOiAnUHLDs3hpbWEgZMOpY2FkYScsXG4gICAgJ1ByZXYgTW9udGgnOiAnTcOqcyBhbnRlcmlvcicsXG4gICAgJ1ByZXYgWWVhcic6ICdBbm8gYW50ZXJpb3InLFxuICAgICdQcmV2IERlY2FkZSc6IFBSRVZfREVDQURFX1BULFxufTtcblxuY29uc3QgQVJJQV9UUkFOU0xBVElPTlNfRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ0Nob29zZSBEYXRlJzogJ1NlbGVjY2lvbmFyIGZlY2hhJyxcbiAgICAnQ2hvb3NlIE1vbnRoJzogJ1NlbGVjY2lvbmFyIG1lcycsXG4gICAgJ0Nob29zZSBZZWFyJzogJ1NlbGVjY2lvbmFyIGHDsW8nLFxuICAgICdQcmV2aW91cyBNb250aCc6ICdNZXMgYW50ZXJpb3InLFxuICAgICdOZXh0IE1vbnRoJzogJ1Byw7N4aW1vIG1lcycsXG4gICAgJ1ByZXZpb3VzIFllYXInOiAnQcOxbyBhbnRlcmlvcicsXG4gICAgJ05leHQgWWVhcic6ICdQcsOzeGltbyBhw7FvJyxcbiAgICAnUHJldmlvdXMgRGVjYWRlJzogUFJFVl9ERUNBREVfRVMsXG4gICAgJ05leHQgRGVjYWRlJzogJ1Byw7N4aW1hIGTDqWNhZGEnLFxuICAgICdQcmV2IE1vbnRoJzogJ01lcyBhbnRlcmlvcicsXG4gICAgJ1ByZXYgWWVhcic6ICdBw7FvIGFudGVyaW9yJyxcbiAgICAnUHJldiBEZWNhZGUnOiBQUkVWX0RFQ0FERV9FUyxcbn07XG5cbmNvbnN0IEFSSUFfVFJBTlNMQVRJT05TOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgICAncHQtQlInOiBBUklBX1RSQU5TTEFUSU9OU19QVF9CUixcbiAgICAncHQnOiBBUklBX1RSQU5TTEFUSU9OU19QVF9CUixcbiAgICAnZXMnOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbiAgICAnZXMtQ08nOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbiAgICAnZXMtRVMnOiBBUklBX1RSQU5TTEFUSU9OU19FUyxcbn07XG5cbi8qKlxuICogRGlyZXRpdmEgcGFyYSBjb3JyaWdpciBhIGFjZXNzaWJpbGlkYWRlIGRvIHBhaW5lbCBkbyBEYXRlUGlja2VyIFByaW1lTkcuXG4gKlxuICogUmVzb2x2ZSBvcyBzZWd1aW50ZXMgcHJvYmxlbWFzOlxuICpcbiAqIDEuICoqRm9jbyBpbmljaWFsIGFvIGFicmlyIG92ZXJsYXkqKjogbW92ZSBmb2NvIHByb2dyYW1hdGljYW1lbnRlIHBhcmFcbiAqICAgIGEgY8OpbHVsYSBzZWxlY2lvbmFkYSwgaG9qZSwgb3UgcHJpbWVpcmEgY8OpbHVsYSBkaXNwb27DrXZlbCDigJQgZXZpdGFuZG9cbiAqICAgIHF1ZSBOVkRBIGxlaWEgdG9kYSBlc3RydXR1cmEgZG8gZ3JpZCBhbyBlbnRyYXIgbm8gcGFpbmVsLlxuICpcbiAqIDIuICoqUmUtZm9jbyBhbyB0cm9jYXIgdmlldyAobcOqcy9hbm8pKio6IGFvIG5hdmVnYXIgcGFyYSB2aWV3cyBkZSBtw6pzIG91XG4gKiAgICBhbm8sIG8gRE9NIMOpIGRlc3RydcOtZG8gZSByZWNyaWFkby4gU2VtIGludGVydmVuw6fDo28sIGZvY28gZXNjYXBhIHBhcmFcbiAqICAgIGA8Ym9keT5gIGUgTlZEQSBsw6ogY29udGXDumRvIGZvcmEgZG8gb3ZlcmxheS4gQSBkaXJldGl2YSByZS1mb2NhIG9cbiAqICAgIHByaW1laXJvIGVsZW1lbnRvIGludGVyYXRpdm8gZGEgbm92YSB2aWV3LlxuICpcbiAqIDMuICoqRm9jdXMtdmlzaWJsZSBub3MgZWxlbWVudG9zIGludGVybm9zKio6IGluamV0YSBDU1MgZ2xvYmFsIGNvbVxuICogICAgb3V0bGluZSBwYXJhIHRvZG9zIGVsZW1lbnRvcyBpbnRlcmF0aXZvcyBkbyBvdmVybGF5LCBnYXJhbnRpbmRvXG4gKiAgICBmZWVkYmFjayB2aXN1YWwgbWVzbW8gY29tIGBhcHBlbmRUbz1cImJvZHlcImAuXG4gKlxuICogNC4gKiphcmlhLWxhYmVsIGVucmlxdWVjaWRvIG5vcyBkYXkgY2VsbHMqKjogUHJpbWVORyBzZXRhIGFwZW5hcyBvXG4gKiAgICBuw7ptZXJvIGRvIGRpYS4gQSBkaXJldGl2YSBzb2JyZXNjcmV2ZSBjb20gZGF0YSBjb21wbGV0YSBmb3JtYXRhZGFcbiAqICAgIChleDogXCIzIGRlIGp1bmhvIGRlIDIwMjYsIFF1YVwiKSDigJQgTlZEQSBuYXJyYSBsYWJlbCBzZW0gcHJlY2lzYXJcbiAqICAgIGNvbnRleHR1YWxpemFyIHRvZGEgZ3JpZC5cbiAqXG4gKiA1LiAqKlZpZXcgZGUgbWVzZXMvYW5vcyBzZW0gdGFiaW5kZXgqKjogc3BhbnMgZGUgbcOqcy9hbm8gcmVjZWJlbVxuICogICAgYHRhYmluZGV4PVwiMFwiYCBlIGByb2xlPVwib3B0aW9uXCJgIHBhcmEgbmF2ZWdhw6fDo28gcG9yIHRlY2xhZG8uXG4gKlxuICogVXRpbGl6YSBgTXV0YXRpb25PYnNlcnZlcmAgcGFyYSBkZXRlY3RhciBtdWRhbsOnYXMgaW50ZXJuYXMgZGUgdmlldyxcbiAqIGrDoSBxdWUgUHJpbWVORyBuw6NvIGVtaXRlIGV2ZW50b3MgcGFyYSBlc3NhcyB0cmFuc2nDp8O1ZXMuXG4gKlxuICogKipDU1MqKjogQSBkaXJldGl2YSBpbmpldGEgdW0gYDxzdHlsZT5gIGdsb2JhbCBubyBgPGhlYWQ+YCAodW1hIHZleikuXG4gKiBQYXJhIHByb2pldG9zIHF1ZSBwcmVmZXJlbSBjb250cm9sZSBtYW51YWwsIGRlc2FiaWxpdGUgdmlhIElucHV0XG4gKiBgW3NEYXRlcGlja2VySW5qZWN0U3R5bGVzXT1cImZhbHNlXCJgIGUgaW1wb3J0ZSBvcyBlc3RpbG9zIG1hbnVhbG1lbnRlLlxuICpcbiAqIFVzbzogYDxwLWRhdGVwaWNrZXIgc0RhdGVwaWNrZXJOb1BlcmlvZFRhYiAuLi4+YFxuICpcbiAqIEBjYXRlZ29yeSBEaXJlY3RpdmVzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3NEYXRlcGlja2VyTm9QZXJpb2RUYWJdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyTm9QZXJpb2RUYWJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVBpY2tlciA9IGluamVjdChEYXRlUGlja2VyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2NhbGUgPSBpbmplY3QoTE9DQUxFX0lEKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBmb2N1c0xpc3RlbmVyQ2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbmplY3RHbG9iYWxGb2N1c1N0eWxlcygpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ29uU2hvdycpXG4gICAgcHVibGljIG9uUGFuZWxTaG93KCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk7XG4gICAgICAgICAgICAvLyBOw6NvIGNoYW1hciBmb2N1c0Jlc3RUYXJnZXQoKSBhcXVpIOKAlCBQcmltZU5HIGluaXRGb2N1c2FibGVDZWxsKClcbiAgICAgICAgICAgIC8vIGrDoSBtb3ZlIGZvY28gcHJvIGRheSBjZWxsIGNvbSB0YWJpbmRleD1cIjBcIiBuYSBhYmVydHVyYS5cbiAgICAgICAgICAgIC8vIENoYW1hciBkZSBub3ZvIGNhdXNhIGRvdWJsZS1hbm5vdW5jZSBubyBOVkRBLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9ic2VydmVQYW5lbENoYW5nZXMoKSwgTVVUQVRJT05fREVCT1VOQ0VfTVMpO1xuICAgICAgICB9LCBGT0NVU19ERUxBWV9NUyk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignb25Nb250aENoYW5nZScpXG4gICAgQEhvc3RMaXN0ZW5lcignb25ZZWFyQ2hhbmdlJylcbiAgICBwdWJsaWMgb25OYXZpZ2F0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdFRhcmdldCgpO1xuICAgICAgICB9LCBGT0NVU19ERUxBWV9NUyk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPYnNlcnZlcigpO1xuICAgICAgICB0aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBmb2NvIHBhcmEgbWVsaG9yIGFsdm8gZGlzcG9uw612ZWwgbm8gcGFpbmVsLlxuICAgICAqIFVzYWRvIGFvIGFicmlyIG92ZXJsYXkgZSBhbyB0cm9jYXIgdmlldyAobcOqcy9hbm8pLlxuICAgICAqXG4gICAgICogQW8gYWJyaXI6IGV2aXRhIHF1ZSBOVkRBIGxlaWEgdG9kYSBlc3RydXR1cmEgZG8gZ3JpZC5cbiAgICAgKiBBbyB0cm9jYXIgdmlldzogcHJldmluZSBmb2NvIGVzY2FwYXIgcGFyYSBgPGJvZHk+YCBxdWFuZG9cbiAgICAgKiBQcmltZU5HIGRlc3Ryw7NpIERPTSBkYSB2aWV3IGFudGVyaW9yLlxuICAgICAqXG4gICAgICogUHJpb3JpZGFkZTogc2VsZWNpb25hZG8gPiBob2plID4gcHJpbWVpcm8gZGlzcG9uw612ZWwuXG4gICAgICogUHVsYSBzZSBmb2NvIGrDoSBlc3TDoSBubyB0YXJnZXQgY29ycmV0byAoZXZpdGEgZG91YmxlLWFubm91bmNlIG5vIE5WREEpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZm9jdXNCZXN0VGFyZ2V0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5O1xuICAgICAgICBpZiAoIXBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZpbmRGb2N1c1RhcmdldChwYW5lbCk7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldC50YWJJbmRleCA9IDA7XG4gICAgICAgICAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluamV0YSBDU1MgZ2xvYmFsIGRlIGZvY3VzLXZpc2libGUgbm8gYDxoZWFkPmAgZG8gZG9jdW1lbnRvLlxuICAgICAqIEV4ZWN1dGEgYXBlbmFzIHVtYSB2ZXogKGlkZW1wb3RlbnRlIHZpYSBJRCBkbyBzdHlsZSBlbGVtZW50KS5cbiAgICAgKiBOZWNlc3PDoXJpbyBwb3JxdWUgb3ZlcmxheSBjb20gYGFwcGVuZFRvPVwiYm9keVwiYCBmaWNhIGZvcmEgZG9cbiAgICAgKiBlc2NvcG8gZGUgVmlld0VuY2Fwc3VsYXRpb24gZG8gY29tcG9uZW50ZSBob3N0LlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5qZWN0R2xvYmFsRm9jdXNTdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEZPQ1VTX1NUWUxFX0lEKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlLCAnaWQnLCBGT0NVU19TVFlMRV9JRCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlLCAndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KEZPQ1VTX1NUWUxFUyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3R5bGUsIHRleHQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuaGVhZCwgc3R5bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuY29udHJhIG1lbGhvciBlbGVtZW50byBwYXJhIHJlY2ViZXIgZm9jbyBubyBwYWluZWwgYXR1YWwuXG4gICAgICogQnVzY2EgZW0gb3JkZW06IHNlbGVjaW9uYWRvIOKGkiBob2plIOKGkiBwcmltZWlybyBkaXNwb27DrXZlbC5cbiAgICAgKiBGdW5jaW9uYSBwYXJhIHZpZXdzIGRlIGRpYXMsIG1lc2VzIGUgYW5vcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRGb2N1c1RhcmdldChwYW5lbDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICAvLyBWaWV3IGRlIGRpYXNcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXkgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICcucC1kYXRlcGlja2VyLWRheS1zZWxlY3RlZCwgLnAtZGF0ZXBpY2tlci1kYXlbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0nXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZERheSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF5O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9kYXkgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci10b2RheSAucC1kYXRlcGlja2VyLWRheScpO1xuICAgICAgICBpZiAodG9kYXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2RheTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZpZXcgZGUgbWVzZXNcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLW1vbnRoLnAtZGF0ZXBpY2tlci1tb250aC1zZWxlY3RlZCcpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRNb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTW9udGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RNb250aCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLW1vbnRoOm5vdCgucC1kaXNhYmxlZCknKTtcbiAgICAgICAgaWYgKGZpcnN0TW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE1vbnRoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmlldyBkZSBhbm9zXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhciA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXllYXIucC1kYXRlcGlja2VyLXllYXItc2VsZWN0ZWQnKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkWWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkWWVhcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdFllYXIgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci15ZWFyOm5vdCgucC1kaXNhYmxlZCknKTtcbiAgICAgICAgaWYgKGZpcnN0WWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0WWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGxiYWNrOiBwcmltZWlybyBkYXkgY2VsbCBkaXNwb27DrXZlbFxuICAgICAgICBjb25zdCBmaXJzdERheSA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheTpub3QoLnAtZGlzYWJsZWQpJyk7XG4gICAgICAgIHJldHVybiBmaXJzdERheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcGxpY2EgY29ycmXDp8O1ZXMgZGUgYWNlc3NpYmlsaWRhZGUgbm8gcGFpbmVsIGRvIERhdGVQaWNrZXIsXG4gICAgICogaW5kZXBlbmRlbnRlIGRhIHZpZXcgaW50ZXJuYSBhdGl2YSAoZGlhcywgbWVzZXMgb3UgYW5vcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhQYW5lbEFjY2Vzc2liaWxpdHkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5kYXRlUGlja2VyLm92ZXJsYXk7XG4gICAgICAgIGlmICghcGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXNlbGVjdC1tb250aCwgLnAtZGF0ZXBpY2tlci1zZWxlY3QteWVhcicpLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnRuLCAndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1tb250aDpub3QoW3RhYmluZGV4XSknKS5mb3JFYWNoKChtb250aCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobW9udGgsICd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShtb250aCwgJ3JvbGUnLCAnb3B0aW9uJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXllYXI6bm90KFt0YWJpbmRleF0pJykuZm9yRWFjaCgoeWVhcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoeWVhciwgJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHllYXIsICdyb2xlJywgJ29wdGlvbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFwcGx5R3JpZGNlbGxSb2xlVG9EYXlzKHBhbmVsKTtcbiAgICAgICAgdGhpcy5lbnJpY2hEYXlDZWxsQXJpYUxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMuZW5yaWNoR3JpZEFyaWFMYWJlbChwYW5lbCk7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQXJpYUxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMuZml4TmF2aWdhdGlvbkJ1dHRvbkxhYmVscyhwYW5lbCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQXBwbGljYXRpb25Sb2xlRnJvbUNvbnRhaW5lcihwYW5lbCk7XG4gICAgICAgIHRoaXMuc2V0dXBGb2N1c1RyYWNraW5nKHBhbmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBgcm9sZT1cImdyaWRjZWxsXCJgIG5vcyBgPHNwYW4gY2xhc3M9XCJwLWRhdGVwaWNrZXItZGF5XCI+YCBxdWUgcmVjZWJlbSBmb2NvLlxuICAgICAqXG4gICAgICogUHJpbWVORyBjb2xvY2EgYHRhYmluZGV4YCBubyBgPHNwYW4+YCBkZW50cm8gZG8gYDx0ZD5gLCBtYXMgc2VtIHJvbGUgZXhwbMOtY2l0by5cbiAgICAgKiBOVkRBIG7Do28gZW50cmEgYXV0b21hdGljYW1lbnRlIGVtIGZvY3VzIG1vZGUgcXVhbmRvIGZvY2EgdW0gZWxlbWVudG8gc2VtXG4gICAgICogcm9sZSBkZSB3aWRnZXQgKGdyaWRjZWxsLCBidXR0b24sIGV0YykuIFJlc3VsdGFkbzogTlZEQSBmaWNhIGVtIGJyb3dzZSBtb2RlXG4gICAgICogZSBsw6ogdG9kYSBhIHRhYmVsYSBzZXF1ZW5jaWFsbWVudGUgYW8gaW52w6lzIGRlIGFudW5jaWFyIHPDsyBhIGPDqWx1bGEgZm9jYWRhLlxuICAgICAqXG4gICAgICogQW8gYWRpY2lvbmFyIGByb2xlPVwiZ3JpZGNlbGxcImAgbm8gc3BhbiBmb2PDoXZlbCwgTlZEQSByZWNvbmhlY2UgcXVlIMOpIHVtXG4gICAgICogd2lkZ2V0IGludGVyYXRpdm8gZSBlbnRyYSBlbSBmb2N1cyBtb2RlIOKAlCBhbnVuY2lhbmRvIGFwZW5hcyBvIGFyaWEtbGFiZWxcbiAgICAgKiBkYSBjw6lsdWxhIGZvY2FkYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5R3JpZGNlbGxSb2xlVG9EYXlzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1kYXk6bm90KC5wLWRpc2FibGVkKScpLmZvckVhY2goKGRheVNwYW4pID0+IHtcbiAgICAgICAgICAgIGlmICghZGF5U3Bhbi5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGRheVNwYW4sICdyb2xlJywgJ2dyaWRjZWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVucmlxdWVjZSBgYXJpYS1sYWJlbGAgZG9zIGRheSBjZWxscyBjb20gZGF0YSBjb21wbGV0YSBmb3JtYXRhZGEuXG4gICAgICogUHJpbWVORyBwb3IgcGFkcsOjbyB1c2EgYXBlbmFzIG8gbsO6bWVybyBkbyBkaWEsIGZvcsOnYW5kbyBOVkRBXG4gICAgICogYSBuYXJyYXIgY29udGV4dG8gZGUgZ3JpZCAobGluaGEvY29sdW5hL3dlZWtkYXkpIHBhcmEgaW5mb3JtYXIgYSBkYXRhLlxuICAgICAqIENvbSBhcmlhLWxhYmVsIGNvbXBsZXRvLCBOVkRBIG5hcnJhIGRpcmV0YW1lbnRlIGEgZGF0YSBzZW0gdmVyYm9zaWRhZGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnJpY2hEYXlDZWxsQXJpYUxhYmVscyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50TW9udGgsIGN1cnJlbnRZZWFyIH0gPSB0aGlzLmRhdGVQaWNrZXI7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRNb250aCA9PSBudWxsIHx8IGN1cnJlbnRZZWFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdlZWtkYXlIZWFkZXJzID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItd2Vla2RheScpO1xuICAgICAgICBjb25zdCB3ZWVrZGF5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgd2Vla2RheUhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgICB3ZWVrZGF5cy5wdXNoKGhlYWRlci50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheS12aWV3IHRib2R5IHRyJyk7XG4gICAgICAgIHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PigndGQnKTtcbiAgICAgICAgICAgIGNlbGxzLmZvckVhY2goKGNlbGwsIGNlbGxJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRheVNwYW4gPSBjZWxsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheScpO1xuICAgICAgICAgICAgICAgIGlmICghZGF5U3Bhbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5TnVtYmVyID0gcGFyc2VJbnQoZGF5U3Bhbi50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcwJywgMTApO1xuICAgICAgICAgICAgICAgIGlmICghZGF5TnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpc090aGVyTW9udGggPSBjZWxsLmNsYXNzTGlzdC5jb250YWlucygncC1kYXRlcGlja2VyLW90aGVyLW1vbnRoJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzT3RoZXJNb250aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIGRheU51bWJlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZUZvckFyaWFMYWJlbChkYXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWVrZGF5ID0gd2Vla2RheXNbY2VsbEluZGV4XSB8fCAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSB3ZWVrZGF5ID8gYCR7Zm9ybWF0dGVkRGF0ZX0sICR7d2Vla2RheX1gIDogZm9ybWF0dGVkRGF0ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGRheVNwYW4sIEFSSUFfTEFCRUxfQVRUUiwgYXJpYUxhYmVsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBhcmlhLWxhYmVsIG5vIGdyaWQgY29tIG3DqnMvYW5vIGF0dWFsIHBhcmEgZGFyIGNvbnRleHRvXG4gICAgICogaW1lZGlhdG8gYW8gTlZEQSBhbyBlbnRyYXIgbmEgdGFiZWxhIGRlIGRpYXMuXG4gICAgICogRXhlbXBsbzogXCJDYWxlbmTDoXJpbywgSnVuaG8gMjAyNlwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnJpY2hHcmlkQXJpYUxhYmVsKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBncmlkID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItZGF5LXZpZXdbcm9sZT1cImdyaWRcIl0nKTtcbiAgICAgICAgaWYgKCFncmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGN1cnJlbnRNb250aCwgY3VycmVudFllYXIgfSA9IHRoaXMuZGF0ZVBpY2tlcjtcbiAgICAgICAgaWYgKGN1cnJlbnRNb250aCA9PSBudWxsIHx8IGN1cnJlbnRZZWFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIDEpLnRvTG9jYWxlRGF0ZVN0cmluZygncHQtQlInLCB7XG4gICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRNb250aCA9IG1vbnRoTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG1vbnRoTmFtZS5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBgQ2FsZW5kw6FyaW8sICR7Y2FwaXRhbGl6ZWRNb250aH0gJHtjdXJyZW50WWVhcn1gO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShncmlkLCBBUklBX0xBQkVMX0FUVFIsIGxhYmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRhIGRhdGEgcGFyYSBhcmlhLWxhYmVsIGxlZ8OtdmVsIHBvciBsZWl0b3IgZGUgdGVsYS5cbiAgICAgKiBTZW1wcmUgdXNhIHB0LUJSIHBhcmEgZ2FyYW50aXIgY29uc2lzdMOqbmNpYSBjb20gbGFiZWxzIHRyYWR1emlkb3MsXG4gICAgICogaW5kZXBlbmRlbnRlIGRvIExPQ0FMRV9JRCBjb25maWd1cmFkbyBubyBBbmd1bGFyLlxuICAgICAqIEV4ZW1wbG86IFwiMyBkZSBqdW5obyBkZSAyMDI2XCJcbiAgICAgKi9cbiAgICBwcml2YXRlIGZvcm1hdERhdGVGb3JBcmlhTGFiZWwoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ3B0LUJSJywge1xuICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGUuZ2V0RGF0ZSgpfS8ke2RhdGUuZ2V0TW9udGgoKSArIDF9LyR7ZGF0ZS5nZXRGdWxsWWVhcigpfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIGxvY2FsZSBzdHJpbmcgcGFyYSBmb3JtYXRhw6fDo28uXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlIHx8ICdwdC1CUic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhZHV6IGFyaWEtbGFiZWxzIGRvcyBib3TDtWVzIGRvIGhlYWRlciBxdWUgUHJpbWVORyByZW5kZXJpemEgZW0gaW5nbMOqcy5cbiAgICAgKiBQcmltZU5HIHVzYSBgZ2V0VHJhbnNsYXRpb24oJ2Nob29zZURhdGUnKWAgZXRjLCBxdWUgcmV0b3JuYSBpbmdsw6pzXG4gICAgICogc2UgYFByaW1lTkdDb25maWcuc2V0VHJhbnNsYXRpb24oKWAgbsOjbyBmb2kgY29uZmlndXJhZG8gcGVsbyBwcm9qZXRvLlxuICAgICAqXG4gICAgICogQnVzY2EgYm90w7VlcyBjb20gYXJpYS1sYWJlbCBlbSBpbmdsw6pzIGUgdHJhZHV6IHBybyBsb2NhbGUgYXR1YWwuXG4gICAgICovXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVBcmlhTGFiZWxzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLmdldFRyYW5zbGF0aW9ucygpO1xuXG4gICAgICAgIC8vIERpYWxvZyBhcmlhLWxhYmVsIChcIkNob29zZSBEYXRlXCIpXG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IHBhbmVsLmNsb3Nlc3QoJ1tyb2xlPVwiZGlhbG9nXCJdJykgfHwgcGFuZWw7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0xhYmVsID0gZGlhbG9nLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpO1xuICAgICAgICBpZiAoZGlhbG9nTGFiZWwgJiYgdHJhbnNsYXRpb25zW2RpYWxvZ0xhYmVsXSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZGlhbG9nLCBBUklBX0xBQkVMX0FUVFIsIHRyYW5zbGF0aW9uc1tkaWFsb2dMYWJlbF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm90w7VlcyBcIkNob29zZSBNb250aFwiIGUgXCJDaG9vc2UgWWVhclwiIG5vIGhlYWRlclxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1zZWxlY3QtbW9udGgsIC5wLWRhdGVwaWNrZXItc2VsZWN0LXllYXInKS5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gYnRuLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIHRyYW5zbGF0aW9uc1tsYWJlbF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidG4sIEFSSUFfTEFCRUxfQVRUUiwgdHJhbnNsYXRpb25zW2xhYmVsXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcnJpZ2UgYXJpYS1sYWJlbCBkb3MgYm90w7VlcyBwcmV2L25leHQgZG8gUHJpbWVORy5cbiAgICAgKiBQcmltZU5HIHVzYSBgcC1idXR0b25gIGNvbXBvbmVudCBxdWUgc2V0YSBgYXJpYS1sYWJlbGAgbm8gaG9zdCBlbGVtZW50IGA8cC1idXR0b24+YCxcbiAgICAgKiBtYXMgTlZEQSBmb2NhIG8gYDxidXR0b24+YCBpbnRlcm5vIHF1ZSBuw6NvIGhlcmRhIG8gbGFiZWwgZG8gY3VzdG9tIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBFc3RydXR1cmEgRE9NOiBgPHAtYnV0dG9uIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBNb250aFwiPjxidXR0b24gY2xhc3M9XCJwLWRhdGVwaWNrZXItcHJldi1idXR0b25cIj4uLi48L2J1dHRvbj48L3AtYnV0dG9uPmBcbiAgICAgKlxuICAgICAqIEZpeDogbMOqIGFyaWEtbGFiZWwgZG8gYDxwLWJ1dHRvbj5gIGhvc3QsIHRyYWR1eiwgZSBwcm9wYWdhIHBybyBgPGJ1dHRvbj5gIGludGVybm8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhOYXZpZ2F0aW9uQnV0dG9uTGFiZWxzKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLmdldFRyYW5zbGF0aW9ucygpO1xuXG4gICAgICAgIC8vIEJ1c2NhciA8cC1idXR0b24+IGhvc3RzIHF1ZSBjb250w6ltIG9zIGJvdMO1ZXMgcHJldi9uZXh0XG4gICAgICAgIGNvbnN0IHBCdXR0b25zID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3AtYnV0dG9uJyk7XG4gICAgICAgIHBCdXR0b25zLmZvckVhY2goKHBCdG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyQnV0dG9uID0gcEJ0bi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICAgICAnYnV0dG9uLnAtZGF0ZXBpY2tlci1wcmV2LWJ1dHRvbiwgYnV0dG9uLnAtZGF0ZXBpY2tlci1uZXh0LWJ1dHRvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWlubmVyQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBwQnRuLmdldEF0dHJpYnV0ZShBUklBX0xBQkVMX0FUVFIpIHx8ICcnO1xuXG4gICAgICAgICAgICAvLyBUcmFkdXppclxuICAgICAgICAgICAgaWYgKGxhYmVsICYmIHRyYW5zbGF0aW9uc1tsYWJlbF0pIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IHRyYW5zbGF0aW9uc1tsYWJlbF07XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUocEJ0biwgQVJJQV9MQUJFTF9BVFRSLCBsYWJlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3BhZ2FyIHBybyA8YnV0dG9uPiBpbnRlcm5vXG4gICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShpbm5lckJ1dHRvbiwgQVJJQV9MQUJFTF9BVFRSLCBsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIGRvIGNvbnRhaW5lciBkbyBjYWxlbmTDoXJpby5cbiAgICAgKlxuICAgICAqIFByaW1lTkcgc2V0YSBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIG5vIGAucC1kYXRlcGlja2VyLWNhbGVuZGFyLWNvbnRhaW5lcmBcbiAgICAgKiBwYXJhIHF1ZSBhcnJvdyBrZXlzIGNoZWd1ZW0gbm8gSmF2YVNjcmlwdCBzZW0gaW50ZXJjZXB0YcOnw6NvIGRvIGJyb3dzZSBtb2RlLlxuICAgICAqIFBvcsOpbSBgcm9sZT1cImdyaWRcImAgbmEgdGFibGUgasOhIGdhcmFudGUgZXNzZSBjb21wb3J0YW1lbnRvIOKAlCBOVkRBIGVudHJhXG4gICAgICogYXV0b21hdGljYW1lbnRlIGVtIGZvY3VzIG1vZGUgYW8gZm9jYXIgdW1hIGdyaWRjZWxsLlxuICAgICAqXG4gICAgICogTyBgcm9sZT1cImFwcGxpY2F0aW9uXCJgIG5vIGNvbnRhaW5lciBQQUkgY2F1c2EgTlZEQSBhIGRlc3BlamEgbyBjb250ZcO6ZG9cbiAgICAgKiB2aXJ0dWFsIGRvIGNvbnRhaW5lciBpbnRlaXJvIGFvIGVudHJhciBubyBkaWFsb2csIGFudGVzIGRlIHBvdXNhciBuYSBjw6lsdWxhLlxuICAgICAqIFJlbW92w6otbG8gcmVzb2x2ZSBhIGxlaXR1cmEgZXhjZXNzaXZhIHNlbSBxdWVicmFyIG5hdmVnYcOnw6NvIHBvciBzZXRhcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUFwcGxpY2F0aW9uUm9sZUZyb21Db250YWluZXIocGFuZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyQ29udGFpbmVyID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItY2FsZW5kYXItY29udGFpbmVyJyk7XG4gICAgICAgIGlmIChjYWxlbmRhckNvbnRhaW5lcj8uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdhcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGNhbGVuZGFyQ29udGFpbmVyLCAncm9sZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBtYXBhIGRlIHRyYWR1w6fDtWVzIHBybyBsb2NhbGUgYXR1YWwuXG4gICAgICogU2UgbG9jYWxlIMOpIGluZ2zDqnMgb3UgbsOjbyByZWNvbmhlY2lkbywgZmFsbGJhY2sgcHJhIHB0LUJSXG4gICAgICogKGFzc3VtaW1vcyBxdWUgbGFiZWxzIGVtIGluZ2zDqnMgZGV2ZW0gc2VyIHRyYWR1emlkb3MpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VHJhbnNsYXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgICByZXR1cm4gQVJJQV9UUkFOU0xBVElPTlNbbG9jYWxlXVxuICAgICAgICAgICAgfHwgQVJJQV9UUkFOU0xBVElPTlNbbG9jYWxlLnNwbGl0KCctJylbMF1dXG4gICAgICAgICAgICB8fCBBUklBX1RSQU5TTEFUSU9OU19QVF9CUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSBsaXN0ZW5lcnMgZGUgZm9jdXMvYmx1ciBub3MgZWxlbWVudG9zIGludGVyYXRpdm9zIHBhcmFcbiAgICAgKiBnYXJhbnRpciBpbmRpY2Fkb3IgdmlzdWFsIHF1YW5kbyBgLmZvY3VzKClgIMOpIGNoYW1hZG8gcHJvZ3JhbWF0aWNhbWVudGUuXG4gICAgICpcbiAgICAgKiBgOmZvY3VzLXZpc2libGVgIHBvZGUgbsOjbyBzZXIgYXBsaWNhZG8gcXVhbmRvIGZvY28gw6kgbW92aWRvIHZpYSBKUyxcbiAgICAgKiBlbnTDo28gdXNhbW9zIGNsYXNzZSBhdXhpbGlhciBgcy1kYXRlcGlja2VyLWRheS1mb2N1c2VkYCBjb21vIGZhbGxiYWNrLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0dXBGb2N1c1RyYWNraW5nKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICAgICAgICAgICcucC1kYXRlcGlja2VyLWRheSwgLnAtZGF0ZXBpY2tlci1tb250aCwgLnAtZGF0ZXBpY2tlci15ZWFyJ1xuICAgICAgICApO1xuICAgICAgICBmb2N1c2FibGVFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNDbGVhbnVwID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZWwsICdmb2N1cycsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsLCAncy1kYXRlcGlja2VyLWRheS1mb2N1c2VkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJsdXJDbGVhbnVwID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZWwsICdibHVyJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsICdzLWRhdGVwaWNrZXItZGF5LWZvY3VzZWQnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMucHVzaChmb2N1c0NsZWFudXAsIGJsdXJDbGVhbnVwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGxpc3RlbmVycyBkZSBmb2N1cy9ibHVyIHJlZ2lzdHJhZG9zIGFudGVyaW9ybWVudGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVGb2N1c0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMuZm9yRWFjaCgoY2xlYW51cCkgPT4gY2xlYW51cCgpKTtcbiAgICAgICAgdGhpcy5mb2N1c0xpc3RlbmVyQ2xlYW51cHMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhIG11ZGFuw6dhcyBubyBET00gZG8gcGFpbmVsIHBhcmEgcmVhcGxpY2FyIGNvcnJlw6fDtWVzXG4gICAgICogcXVhbmRvIG8gUHJpbWVORyB0cm9jYSBhIHZpZXcgaW50ZXJuYSAoZGlhcyDihpIgbWVzZXMg4oaSIGFub3MpLlxuICAgICAqIFVzYSBkZWJvdW5jZSBlIHPDsyByZWFnZSBhIGNoaWxkTGlzdCBjaGFuZ2VzIChuw6NvIGF0dHJpYnV0ZXMpXG4gICAgICogcGFyYSBldml0YXIgbG9vcCBpbmZpbml0byBjb20gYXMgcHLDs3ByaWFzIG11dGHDp8O1ZXMgZGEgZGlyZXRpdmEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvYnNlcnZlUGFuZWxDaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPYnNlcnZlcigpO1xuXG4gICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5kYXRlUGlja2VyLm92ZXJsYXk7XG4gICAgICAgIGlmICghcGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWJvdW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgaXNQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Byb2Nlc3NpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFPDsyByZWFnaXIgc2UgaG91dmUgYWRpw6fDo28vcmVtb8Onw6NvIGRlIG7Ds3MgKHRyb2NhIGRlIHZpZXcpXG4gICAgICAgICAgICBjb25zdCBoYXNTdHJ1Y3R1cmFsQ2hhbmdlID0gbXV0YXRpb25zLnNvbWUoXG4gICAgICAgICAgICAgICAgKG0pID0+IG0udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgKG0uYWRkZWROb2Rlcy5sZW5ndGggPiAwIHx8IG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWhhc1N0cnVjdHVyYWxDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZWJvdW5jZVRpbWVyKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhQYW5lbEFjY2Vzc2liaWxpdHkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQmVzdFRhcmdldCgpO1xuICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgTVVUQVRJT05fREVCT1VOQ0VfTVMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUocGFuZWwsIHtcbiAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzY29ubmVjdE9ic2VydmVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1uby1wZXJpb2QtdGFiLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zaGFyZWQvc3JjL2xpYi9hY2Nlc3NpYmlsaXR5L2RhdGVwaWNrZXItbm8tcGVyaW9kLXRhYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFaEQ7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLGdDQUFnQyxDQUFDO0FBRXhELCtGQUErRjtBQUMvRixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFFMUIsOEZBQThGO0FBQzlGLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRWpDLDhFQUE4RTtBQUM5RSxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0ErQnBCLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBQ3pDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO0FBRXpDLE1BQU0sdUJBQXVCLEdBQTJCO0lBQ3BELGFBQWEsRUFBRSxpQkFBaUI7SUFDaEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLGdCQUFnQixFQUFFLGNBQWM7SUFDaEMsWUFBWSxFQUFFLGFBQWE7SUFDM0IsZUFBZSxFQUFFLGNBQWM7SUFDL0IsV0FBVyxFQUFFLGFBQWE7SUFDMUIs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a0JBQWtCO3NCQUZ4QixZQUFZO3VCQUFDLGVBQWU7O3NCQUM1QixZQUFZO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgTE9DQUxFX0lELCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlUGlja2VyIH0gZnJvbSAncHJpbWVuZy9kYXRlcGlja2VyJztcblxuLyoqXG4gKiBDU1MgY3VzdG9taXphZG8gaW5qZXRhZG8gZ2xvYmFsbWVudGUgcGFyYSBmb2N1cy12aXNpYmxlIG5vcyBpbnRlcm5hbHMgZG8gRGF0ZVBpY2tlci5cbiAqIE5lY2Vzc8OhcmlvIHBvcnF1ZSBjb20gYGFwcGVuZFRvPVwiYm9keVwiYCBvIG92ZXJsYXkgZmljYSBmb3JhIGRvIGhvc3QgY29tcG9uZW50LFxuICogZSBlc3RpbG9zIGNvbSBgOmhvc3QgOjpuZy1kZWVwYCBvdSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCBuw6NvIGFsY2Fuw6dhbS5cbiAqL1xuY29uc3QgRk9DVVNfU1RZTEVfSUQgPSAncy1kYXRlcGlja2VyLWExMXktZm9jdXMtc3R5bGVzJztcblxuLyoqIERlbGF5IGVtIG1zIHBhcmEgZm9jbyBww7NzLWFiZXJ0dXJhIGUgbmF2ZWdhw6fDo28gKHBlcm1pdGUgTlZEQSBwcm9jZXNzYXIgZGlhbG9nIGFubm91bmNlKS4gKi9cbmNvbnN0IEZPQ1VTX0RFTEFZX01TID0gNTA7XG5cbi8qKiBEZWxheSBlbSBtcyBwYXJhIGRlYm91bmNlIGRvIE11dGF0aW9uT2JzZXJ2ZXIgKGV2aXRhIHJlLWV4ZWN1w6fDo28gcG9yIHJpcHBsZS9hbmltYcOnw7VlcykuICovXG5jb25zdCBNVVRBVElPTl9ERUJPVU5DRV9NUyA9IDEwMDtcblxuLyoqIEF0dHJpYnV0ZSBuYW1lIGNvbnN0YW50IHRvIGF2b2lkIFNvbmFyUXViZSBsaXRlcmFsIGR1cGxpY2F0aW9uIHdhcm5pbmcuICovXG5jb25zdCBBUklBX0xBQkVMX0FUVFIgPSAnYXJpYS1sYWJlbCc7XG5jb25zdCBGT0NVU19TVFlMRVMgPSBgXG4ucC1kYXRlcGlja2VyLWRheTpmb2N1cy12aXNpYmxlLFxuLnAtZGF0ZXBpY2tlci1kYXkucy1kYXRlcGlja2VyLWRheS1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcC1wcmltYXJ5LWNvbG9yLCAjM2I4MmY2KSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi5wLWRhdGVwaWNrZXItbW9udGg6Zm9jdXMtdmlzaWJsZSxcbi5wLWRhdGVwaWNrZXItbW9udGgucy1kYXRlcGlja2VyLWRheS1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcC1wcmltYXJ5LWNvbG9yLCAjM2I4MmY2KSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cbi5wLWRhdGVwaWNrZXIteWVhcjpmb2N1cy12aXNpYmxlLFxuLnAtZGF0ZXBpY2tlci15ZWFyLnMtZGF0ZXBpY2tlci1kYXktZm9jdXNlZCB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLXAtcHJpbWFyeS1jb2xvciwgIzNiODJmNikgIWltcG9ydGFudDtcbiAgICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG4ucC1kYXRlcGlja2VyLXNlbGVjdC1tb250aDpmb2N1cy12aXNpYmxlLFxuLnAtZGF0ZXBpY2tlci1zZWxlY3QteWVhcjpmb2N1cy12aXNpYmxlIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcC1wcmltYXJ5LWNvbG9yLCAjM2I4MmY2KSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuLnAtZGF0ZXBpY2tlci1wcmV2LWJ1dHRvbjpmb2N1cy12aXNpYmxlLFxuLnAtZGF0ZXBpY2tlci1uZXh0LWJ1dHRvbjpmb2N1cy12aXNpYmxlIHtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tcC1wcmltYXJ5LWNvbG9yLCAjM2I4MmY2KSAhaW1wb3J0YW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xufVxuYDtcblxuLyoqXG4gKiBUcmFkdcOnw7VlcyBwdC1CUiBwYXJhIGFyaWEtbGFiZWxzIGRvIERhdGVQaWNrZXIgUHJpbWVORy5cbiAqIFByaW1lTkcgdXNhIGBnZXRUcmFuc2xhdGlvbigpYCBxdWUgcmV0b3JuYSBpbmdsw6pzIHBvciBwYWRyw6NvXG4gKiBzZSBuw6NvIGNvbmZpZ3VyYWRvIHZpYSBgUHJpbWVOR0NvbmZpZy5zZXRUcmFuc2xhdGlvbigpYC5cbiAqXG4gKiBLZXlzIGNvcnJlc3BvbmRlbSBhbyB0ZXh0byBleGF0byByZW5kZXJpemFkbyBwZWxvIFByaW1lTkcgbm8gRE9NOlxuICogLSBcIlByZXZpb3VzIE1vbnRoXCIgKG7Do28gXCJQcmV2IE1vbnRoXCIpXG4gKiAtIFwiQ2hvb3NlIERhdGVcIiwgXCJDaG9vc2UgTW9udGhcIiwgXCJDaG9vc2UgWWVhclwiXG4gKi9cbmNvbnN0IFBSRVZfREVDQURFX1BUID0gJ0TDqWNhZGEgYW50ZXJpb3InO1xuY29uc3QgUFJFVl9ERUNBREVfRVMgPSAnRMOpY2FkYSBhbnRlcmlvcic7XG5cbmNvbnN0IEFSSUFfVFJBTlNMQVRJT05TX1BUX0JSOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdDaG9vc2UgRGF0ZSc6ICdTZWxlY2lvbmFyIGRhdGEnLFxuICAgICdDaG9vc2UgTW9udGgnOiAnU2VsZWNpb25hciBtw6pzJyxcbiAgICAnQ2hvb3NlIFllYXInOiAnU2VsZWNpb25hciBhbm8nLFxuICAgICdQcmV2aW91cyBNb250aCc6ICdNw6pzIGFudGVyaW9yJyxcbiAgICAnTmV4dCBNb250aCc6ICdQcsOzeGltbyBtw6pzJyxcbiAgICAnUHJldmlvdXMgWWVhcic6ICdBbm8gYW50ZXJpb3InLFxuICAgICdOZXh0IFllYXInOiAnUHLDs3hpbW8gYW5vJyxcbiAgICAnUHJldmlvdXMgRGVjYWRlJzogUFJFVl9ERUNBREVfUFQsXG4gICAgJ05leHQgRGVjYWRlJzogJ1Byw7N4aW1hIGTDqWNhZGEnLFxuICAgICdQcmV2IE1vbnRoJzogJ03DqnMgYW50ZXJpb3InLFxuICAgICdQcmV2IFllYXInOiAnQW5vIGFudGVyaW9yJyxcbiAgICAnUHJldiBEZWNhZGUnOiBQUkVWX0RFQ0FERV9QVCxcbn07XG5cbmNvbnN0IEFSSUFfVFJBTlNMQVRJT05TX0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdDaG9vc2UgRGF0ZSc6ICdTZWxlY2Npb25hciBmZWNoYScsXG4gICAgJ0Nob29zZSBNb250aCc6ICdTZWxlY2Npb25hciBtZXMnLFxuICAgICdDaG9vc2UgWWVhcic6ICdTZWxlY2Npb25hciBhw7FvJyxcbiAgICAnUHJldmlvdXMgTW9udGgnOiAnTWVzIGFudGVyaW9yJyxcbiAgICAnTmV4dCBNb250aCc6ICdQcsOzeGltbyBtZXMnLFxuICAgICdQcmV2aW91cyBZZWFyJzogJ0HDsW8gYW50ZXJpb3InLFxuICAgICdOZXh0IFllYXInOiAnUHLDs3hpbW8gYcOxbycsXG4gICAgJ1ByZXZpb3VzIERlY2FkZSc6IFBSRVZfREVDQURFX0VTLFxuICAgICdOZXh0IERlY2FkZSc6ICdQcsOzeGltYSBkw6ljYWRhJyxcbiAgICAnUHJldiBNb250aCc6ICdNZXMgYW50ZXJpb3InLFxuICAgICdQcmV2IFllYXInOiAnQcOxbyBhbnRlcmlvcicsXG4gICAgJ1ByZXYgRGVjYWRlJzogUFJFVl9ERUNBREVfRVMsXG59O1xuXG5jb25zdCBBUklBX1RSQU5TTEFUSU9OUzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gICAgJ3B0LUJSJzogQVJJQV9UUkFOU0xBVElPTlNfUFRfQlIsXG4gICAgJ3B0JzogQVJJQV9UUkFOU0xBVElPTlNfUFRfQlIsXG4gICAgJ2VzJzogQVJJQV9UUkFOU0xBVElPTlNfRVMsXG4gICAgJ2VzLUNPJzogQVJJQV9UUkFOU0xBVElPTlNfRVMsXG4gICAgJ2VzLUVTJzogQVJJQV9UUkFOU0xBVElPTlNfRVMsXG59O1xuXG4vKipcbiAqIERpcmV0aXZhIHBhcmEgY29ycmlnaXIgYSBhY2Vzc2liaWxpZGFkZSBkbyBwYWluZWwgZG8gRGF0ZVBpY2tlciBQcmltZU5HLlxuICpcbiAqIFJlc29sdmUgb3Mgc2VndWludGVzIHByb2JsZW1hczpcbiAqXG4gKiAxLiAqKkZvY28gaW5pY2lhbCBhbyBhYnJpciBvdmVybGF5Kio6IG1vdmUgZm9jbyBwcm9ncmFtYXRpY2FtZW50ZSBwYXJhXG4gKiAgICBhIGPDqWx1bGEgc2VsZWNpb25hZGEsIGhvamUsIG91IHByaW1laXJhIGPDqWx1bGEgZGlzcG9uw612ZWwg4oCUIGV2aXRhbmRvXG4gKiAgICBxdWUgTlZEQSBsZWlhIHRvZGEgZXN0cnV0dXJhIGRvIGdyaWQgYW8gZW50cmFyIG5vIHBhaW5lbC5cbiAqXG4gKiAyLiAqKlJlLWZvY28gYW8gdHJvY2FyIHZpZXcgKG3DqnMvYW5vKSoqOiBhbyBuYXZlZ2FyIHBhcmEgdmlld3MgZGUgbcOqcyBvdVxuICogICAgYW5vLCBvIERPTSDDqSBkZXN0cnXDrWRvIGUgcmVjcmlhZG8uIFNlbSBpbnRlcnZlbsOnw6NvLCBmb2NvIGVzY2FwYSBwYXJhXG4gKiAgICBgPGJvZHk+YCBlIE5WREEgbMOqIGNvbnRlw7pkbyBmb3JhIGRvIG92ZXJsYXkuIEEgZGlyZXRpdmEgcmUtZm9jYSBvXG4gKiAgICBwcmltZWlybyBlbGVtZW50byBpbnRlcmF0aXZvIGRhIG5vdmEgdmlldy5cbiAqXG4gKiAzLiAqKkZvY3VzLXZpc2libGUgbm9zIGVsZW1lbnRvcyBpbnRlcm5vcyoqOiBpbmpldGEgQ1NTIGdsb2JhbCBjb21cbiAqICAgIG91dGxpbmUgcGFyYSB0b2RvcyBlbGVtZW50b3MgaW50ZXJhdGl2b3MgZG8gb3ZlcmxheSwgZ2FyYW50aW5kb1xuICogICAgZmVlZGJhY2sgdmlzdWFsIG1lc21vIGNvbSBgYXBwZW5kVG89XCJib2R5XCJgLlxuICpcbiAqIDQuICoqYXJpYS1sYWJlbCBlbnJpcXVlY2lkbyBub3MgZGF5IGNlbGxzKio6IFByaW1lTkcgc2V0YSBhcGVuYXMgb1xuICogICAgbsO6bWVybyBkbyBkaWEuIEEgZGlyZXRpdmEgc29icmVzY3JldmUgY29tIGRhdGEgY29tcGxldGEgZm9ybWF0YWRhXG4gKiAgICAoZXg6IFwiMyBkZSBqdW5obyBkZSAyMDI2LCBRdWFcIikg4oCUIE5WREEgbmFycmEgbGFiZWwgc2VtIHByZWNpc2FyXG4gKiAgICBjb250ZXh0dWFsaXphciB0b2RhIGdyaWQuXG4gKlxuICogNS4gKipWaWV3IGRlIG1lc2VzL2Fub3Mgc2VtIHRhYmluZGV4Kio6IHNwYW5zIGRlIG3DqnMvYW5vIHJlY2ViZW1cbiAqICAgIGB0YWJpbmRleD1cIjBcImAgZSBgcm9sZT1cIm9wdGlvblwiYCBwYXJhIG5hdmVnYcOnw6NvIHBvciB0ZWNsYWRvLlxuICpcbiAqIFV0aWxpemEgYE11dGF0aW9uT2JzZXJ2ZXJgIHBhcmEgZGV0ZWN0YXIgbXVkYW7Dp2FzIGludGVybmFzIGRlIHZpZXcsXG4gKiBqw6EgcXVlIFByaW1lTkcgbsOjbyBlbWl0ZSBldmVudG9zIHBhcmEgZXNzYXMgdHJhbnNpw6fDtWVzLlxuICpcbiAqICoqQ1NTKio6IEEgZGlyZXRpdmEgaW5qZXRhIHVtIGA8c3R5bGU+YCBnbG9iYWwgbm8gYDxoZWFkPmAgKHVtYSB2ZXopLlxuICogUGFyYSBwcm9qZXRvcyBxdWUgcHJlZmVyZW0gY29udHJvbGUgbWFudWFsLCBkZXNhYmlsaXRlIHZpYSBJbnB1dFxuICogYFtzRGF0ZXBpY2tlckluamVjdFN0eWxlc109XCJmYWxzZVwiYCBlIGltcG9ydGUgb3MgZXN0aWxvcyBtYW51YWxtZW50ZS5cbiAqXG4gKiBVc286IGA8cC1kYXRlcGlja2VyIHNEYXRlcGlja2VyTm9QZXJpb2RUYWIgLi4uPmBcbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHMtZGF0ZXBpY2tlcmAgKGA8cy1kYXRlcGlja2VyPmApLCBvIGNvbXBvbmVudGUgb2ZpY2lhbCBkb1xuICogRGVzaWduIFN5c3RlbSBkYSBTZW5pb3IsIHF1ZSBpbXBsZW1lbnRhIHRvZGEgYSBhY2Vzc2liaWxpZGFkZSBuZWNlc3PDoXJpYVxuICogbmF0aXZhbWVudGUuIEVzdGEgZGlyZXRpdmEgc2Vyw6EgcmVtb3ZpZGEgbmEgcHLDs3hpbWEgbWFqb3IgcmVsZWFzZS5cbiAqXG4gKiBAY2F0ZWdvcnkgRGlyZWN0aXZlc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tzRGF0ZXBpY2tlck5vUGVyaW9kVGFiXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlck5vUGVyaW9kVGFiRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVQaWNrZXIgPSBpbmplY3QoRGF0ZVBpY2tlcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxlID0gaW5qZWN0KExPQ0FMRV9JRCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZm9jdXNMaXN0ZW5lckNsZWFudXBzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5qZWN0R2xvYmFsRm9jdXNTdHlsZXMoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdvblNob3cnKVxuICAgIHB1YmxpYyBvblBhbmVsU2hvdygpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpeFBhbmVsQWNjZXNzaWJpbGl0eSgpO1xuICAgICAgICAgICAgLy8gTsOjbyBjaGFtYXIgZm9jdXNCZXN0VGFyZ2V0KCkgYXF1aSDigJQgUHJpbWVORyBpbml0Rm9jdXNhYmxlQ2VsbCgpXG4gICAgICAgICAgICAvLyBqw6EgbW92ZSBmb2NvIHBybyBkYXkgY2VsbCBjb20gdGFiaW5kZXg9XCIwXCIgbmEgYWJlcnR1cmEuXG4gICAgICAgICAgICAvLyBDaGFtYXIgZGUgbm92byBjYXVzYSBkb3VibGUtYW5ub3VuY2Ugbm8gTlZEQS5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vYnNlcnZlUGFuZWxDaGFuZ2VzKCksIE1VVEFUSU9OX0RFQk9VTkNFX01TKTtcbiAgICAgICAgfSwgRk9DVVNfREVMQVlfTVMpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ29uTW9udGhDaGFuZ2UnKVxuICAgIEBIb3N0TGlzdGVuZXIoJ29uWWVhckNoYW5nZScpXG4gICAgcHVibGljIG9uTmF2aWdhdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpeFBhbmVsQWNjZXNzaWJpbGl0eSgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RUYXJnZXQoKTtcbiAgICAgICAgfSwgRk9DVVNfREVMQVlfTVMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0T2JzZXJ2ZXIoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVGb2N1c0xpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgZm9jbyBwYXJhIG1lbGhvciBhbHZvIGRpc3BvbsOtdmVsIG5vIHBhaW5lbC5cbiAgICAgKiBVc2FkbyBhbyBhYnJpciBvdmVybGF5IGUgYW8gdHJvY2FyIHZpZXcgKG3DqnMvYW5vKS5cbiAgICAgKlxuICAgICAqIEFvIGFicmlyOiBldml0YSBxdWUgTlZEQSBsZWlhIHRvZGEgZXN0cnV0dXJhIGRvIGdyaWQuXG4gICAgICogQW8gdHJvY2FyIHZpZXc6IHByZXZpbmUgZm9jbyBlc2NhcGFyIHBhcmEgYDxib2R5PmAgcXVhbmRvXG4gICAgICogUHJpbWVORyBkZXN0csOzaSBET00gZGEgdmlldyBhbnRlcmlvci5cbiAgICAgKlxuICAgICAqIFByaW9yaWRhZGU6IHNlbGVjaW9uYWRvID4gaG9qZSA+IHByaW1laXJvIGRpc3BvbsOtdmVsLlxuICAgICAqIFB1bGEgc2UgZm9jbyBqw6EgZXN0w6Egbm8gdGFyZ2V0IGNvcnJldG8gKGV2aXRhIGRvdWJsZS1hbm5vdW5jZSBubyBOVkRBKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZvY3VzQmVzdFRhcmdldCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLmRhdGVQaWNrZXIub3ZlcmxheTtcbiAgICAgICAgaWYgKCFwYW5lbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5maW5kRm9jdXNUYXJnZXQocGFuZWwpO1xuICAgICAgICBpZiAodGFyZ2V0ICYmIHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXQudGFiSW5kZXggPSAwO1xuICAgICAgICAgICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmpldGEgQ1NTIGdsb2JhbCBkZSBmb2N1cy12aXNpYmxlIG5vIGA8aGVhZD5gIGRvIGRvY3VtZW50by5cbiAgICAgKiBFeGVjdXRhIGFwZW5hcyB1bWEgdmV6IChpZGVtcG90ZW50ZSB2aWEgSUQgZG8gc3R5bGUgZWxlbWVudCkuXG4gICAgICogTmVjZXNzw6FyaW8gcG9ycXVlIG92ZXJsYXkgY29tIGBhcHBlbmRUbz1cImJvZHlcImAgZmljYSBmb3JhIGRvXG4gICAgICogZXNjb3BvIGRlIFZpZXdFbmNhcHN1bGF0aW9uIGRvIGNvbXBvbmVudGUgaG9zdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluamVjdEdsb2JhbEZvY3VzU3R5bGVzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChGT0NVU19TVFlMRV9JRCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShzdHlsZSwgJ2lkJywgRk9DVVNfU1RZTEVfSUQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShzdHlsZSwgJ3R5cGUnLCAndGV4dC9jc3MnKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChGT0NVU19TVFlMRVMpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHN0eWxlLCB0ZXh0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNvbnRyYSBtZWxob3IgZWxlbWVudG8gcGFyYSByZWNlYmVyIGZvY28gbm8gcGFpbmVsIGF0dWFsLlxuICAgICAqIEJ1c2NhIGVtIG9yZGVtOiBzZWxlY2lvbmFkbyDihpIgaG9qZSDihpIgcHJpbWVpcm8gZGlzcG9uw612ZWwuXG4gICAgICogRnVuY2lvbmEgcGFyYSB2aWV3cyBkZSBkaWFzLCBtZXNlcyBlIGFub3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kRm9jdXNUYXJnZXQocGFuZWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgLy8gVmlldyBkZSBkaWFzXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRGF5ID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgICAgICAgICAnLnAtZGF0ZXBpY2tlci1kYXktc2VsZWN0ZWQsIC5wLWRhdGVwaWNrZXItZGF5W2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoc2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZERheTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItdG9kYXkgLnAtZGF0ZXBpY2tlci1kYXknKTtcbiAgICAgICAgaWYgKHRvZGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdG9kYXk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWaWV3IGRlIG1lc2VzXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1tb250aC5wLWRhdGVwaWNrZXItbW9udGgtc2VsZWN0ZWQnKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkTW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZE1vbnRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpcnN0TW9udGggPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1tb250aDpub3QoLnAtZGlzYWJsZWQpJyk7XG4gICAgICAgIGlmIChmaXJzdE1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RNb250aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZpZXcgZGUgYW5vc1xuICAgICAgICBjb25zdCBzZWxlY3RlZFllYXIgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci15ZWFyLnAtZGF0ZXBpY2tlci15ZWFyLXNlbGVjdGVkJyk7XG4gICAgICAgIGlmIChzZWxlY3RlZFllYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFllYXI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RZZWFyID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXIteWVhcjpub3QoLnAtZGlzYWJsZWQpJyk7XG4gICAgICAgIGlmIChmaXJzdFllYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdFllYXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGYWxsYmFjazogcHJpbWVpcm8gZGF5IGNlbGwgZGlzcG9uw612ZWxcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1kYXk6bm90KC5wLWRpc2FibGVkKScpO1xuICAgICAgICByZXR1cm4gZmlyc3REYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBsaWNhIGNvcnJlw6fDtWVzIGRlIGFjZXNzaWJpbGlkYWRlIG5vIHBhaW5lbCBkbyBEYXRlUGlja2VyLFxuICAgICAqIGluZGVwZW5kZW50ZSBkYSB2aWV3IGludGVybmEgYXRpdmEgKGRpYXMsIG1lc2VzIG91IGFub3MpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5O1xuICAgICAgICBpZiAoIXBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1zZWxlY3QtbW9udGgsIC5wLWRhdGVwaWNrZXItc2VsZWN0LXllYXInKS5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ0biwgJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItbW9udGg6bm90KFt0YWJpbmRleF0pJykuZm9yRWFjaCgobW9udGgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKG1vbnRoLCAndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUobW9udGgsICdyb2xlJywgJ29wdGlvbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci15ZWFyOm5vdChbdGFiaW5kZXhdKScpLmZvckVhY2goKHllYXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHllYXIsICd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh5ZWFyLCAncm9sZScsICdvcHRpb24nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hcHBseUdyaWRjZWxsUm9sZVRvRGF5cyhwYW5lbCk7XG4gICAgICAgIHRoaXMuZW5yaWNoRGF5Q2VsbEFyaWFMYWJlbHMocGFuZWwpO1xuICAgICAgICB0aGlzLmVucmljaEdyaWRBcmlhTGFiZWwocGFuZWwpO1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZUFyaWFMYWJlbHMocGFuZWwpO1xuICAgICAgICB0aGlzLmZpeE5hdmlnYXRpb25CdXR0b25MYWJlbHMocGFuZWwpO1xuICAgICAgICB0aGlzLnJlbW92ZUFwcGxpY2F0aW9uUm9sZUZyb21Db250YWluZXIocGFuZWwpO1xuICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFja2luZyhwYW5lbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgYHJvbGU9XCJncmlkY2VsbFwiYCBub3MgYDxzcGFuIGNsYXNzPVwicC1kYXRlcGlja2VyLWRheVwiPmAgcXVlIHJlY2ViZW0gZm9jby5cbiAgICAgKlxuICAgICAqIFByaW1lTkcgY29sb2NhIGB0YWJpbmRleGAgbm8gYDxzcGFuPmAgZGVudHJvIGRvIGA8dGQ+YCwgbWFzIHNlbSByb2xlIGV4cGzDrWNpdG8uXG4gICAgICogTlZEQSBuw6NvIGVudHJhIGF1dG9tYXRpY2FtZW50ZSBlbSBmb2N1cyBtb2RlIHF1YW5kbyBmb2NhIHVtIGVsZW1lbnRvIHNlbVxuICAgICAqIHJvbGUgZGUgd2lkZ2V0IChncmlkY2VsbCwgYnV0dG9uLCBldGMpLiBSZXN1bHRhZG86IE5WREEgZmljYSBlbSBicm93c2UgbW9kZVxuICAgICAqIGUgbMOqIHRvZGEgYSB0YWJlbGEgc2VxdWVuY2lhbG1lbnRlIGFvIGludsOpcyBkZSBhbnVuY2lhciBzw7MgYSBjw6lsdWxhIGZvY2FkYS5cbiAgICAgKlxuICAgICAqIEFvIGFkaWNpb25hciBgcm9sZT1cImdyaWRjZWxsXCJgIG5vIHNwYW4gZm9jw6F2ZWwsIE5WREEgcmVjb25oZWNlIHF1ZSDDqSB1bVxuICAgICAqIHdpZGdldCBpbnRlcmF0aXZvIGUgZW50cmEgZW0gZm9jdXMgbW9kZSDigJQgYW51bmNpYW5kbyBhcGVuYXMgbyBhcmlhLWxhYmVsXG4gICAgICogZGEgY8OpbHVsYSBmb2NhZGEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBseUdyaWRjZWxsUm9sZVRvRGF5cyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItZGF5Om5vdCgucC1kaXNhYmxlZCknKS5mb3JFYWNoKChkYXlTcGFuKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRheVNwYW4uZ2V0QXR0cmlidXRlKCdyb2xlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShkYXlTcGFuLCAncm9sZScsICdncmlkY2VsbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnJpcXVlY2UgYGFyaWEtbGFiZWxgIGRvcyBkYXkgY2VsbHMgY29tIGRhdGEgY29tcGxldGEgZm9ybWF0YWRhLlxuICAgICAqIFByaW1lTkcgcG9yIHBhZHLDo28gdXNhIGFwZW5hcyBvIG7Dum1lcm8gZG8gZGlhLCBmb3LDp2FuZG8gTlZEQVxuICAgICAqIGEgbmFycmFyIGNvbnRleHRvIGRlIGdyaWQgKGxpbmhhL2NvbHVuYS93ZWVrZGF5KSBwYXJhIGluZm9ybWFyIGEgZGF0YS5cbiAgICAgKiBDb20gYXJpYS1sYWJlbCBjb21wbGV0bywgTlZEQSBuYXJyYSBkaXJldGFtZW50ZSBhIGRhdGEgc2VtIHZlcmJvc2lkYWRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5yaWNoRGF5Q2VsbEFyaWFMYWJlbHMocGFuZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudE1vbnRoLCBjdXJyZW50WWVhciB9ID0gdGhpcy5kYXRlUGlja2VyO1xuXG4gICAgICAgIGlmIChjdXJyZW50TW9udGggPT0gbnVsbCB8fCBjdXJyZW50WWVhciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3ZWVrZGF5SGVhZGVycyA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLXdlZWtkYXknKTtcbiAgICAgICAgY29uc3Qgd2Vla2RheXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHdlZWtkYXlIZWFkZXJzLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICAgICAgd2Vla2RheXMucHVzaChoZWFkZXIudGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJvd3MgPSBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1kYXktdmlldyB0Ym9keSB0cicpO1xuICAgICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSByb3cucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ3RkJyk7XG4gICAgICAgICAgICBjZWxscy5mb3JFYWNoKChjZWxsLCBjZWxsSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXlTcGFuID0gY2VsbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnAtZGF0ZXBpY2tlci1kYXknKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRheVNwYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRheU51bWJlciA9IHBhcnNlSW50KGRheVNwYW4udGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnMCcsIDEwKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRheU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdGhlck1vbnRoID0gY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ3AtZGF0ZXBpY2tlci1vdGhlci1tb250aCcpO1xuICAgICAgICAgICAgICAgIGlmIChpc090aGVyTW9udGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShjdXJyZW50WWVhciwgY3VycmVudE1vbnRoLCBkYXlOdW1iZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmZvcm1hdERhdGVGb3JBcmlhTGFiZWwoZGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2Vla2RheSA9IHdlZWtkYXlzW2NlbGxJbmRleF0gfHwgJyc7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJpYUxhYmVsID0gd2Vla2RheSA/IGAke2Zvcm1hdHRlZERhdGV9LCAke3dlZWtkYXl9YCA6IGZvcm1hdHRlZERhdGU7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShkYXlTcGFuLCBBUklBX0xBQkVMX0FUVFIsIGFyaWFMYWJlbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgYXJpYS1sYWJlbCBubyBncmlkIGNvbSBtw6pzL2FubyBhdHVhbCBwYXJhIGRhciBjb250ZXh0b1xuICAgICAqIGltZWRpYXRvIGFvIE5WREEgYW8gZW50cmFyIG5hIHRhYmVsYSBkZSBkaWFzLlxuICAgICAqIEV4ZW1wbG86IFwiQ2FsZW5kw6FyaW8sIEp1bmhvIDIwMjZcIlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5yaWNoR3JpZEFyaWFMYWJlbChwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWRheS12aWV3W3JvbGU9XCJncmlkXCJdJyk7XG4gICAgICAgIGlmICghZ3JpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjdXJyZW50TW9udGgsIGN1cnJlbnRZZWFyIH0gPSB0aGlzLmRhdGVQaWNrZXI7XG4gICAgICAgIGlmIChjdXJyZW50TW9udGggPT0gbnVsbCB8fCBjdXJyZW50WWVhciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb250aE5hbWUgPSBuZXcgRGF0ZShjdXJyZW50WWVhciwgY3VycmVudE1vbnRoLCAxKS50b0xvY2FsZURhdGVTdHJpbmcoJ3B0LUJSJywge1xuICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNhcGl0YWxpemVkTW9udGggPSBtb250aE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBtb250aE5hbWUuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gYENhbGVuZMOhcmlvLCAke2NhcGl0YWxpemVkTW9udGh9ICR7Y3VycmVudFllYXJ9YDtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZ3JpZCwgQVJJQV9MQUJFTF9BVFRSLCBsYWJlbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0YSBkYXRhIHBhcmEgYXJpYS1sYWJlbCBsZWfDrXZlbCBwb3IgbGVpdG9yIGRlIHRlbGEuXG4gICAgICogU2VtcHJlIHVzYSBwdC1CUiBwYXJhIGdhcmFudGlyIGNvbnNpc3TDqm5jaWEgY29tIGxhYmVscyB0cmFkdXppZG9zLFxuICAgICAqIGluZGVwZW5kZW50ZSBkbyBMT0NBTEVfSUQgY29uZmlndXJhZG8gbm8gQW5ndWxhci5cbiAgICAgKiBFeGVtcGxvOiBcIjMgZGUganVuaG8gZGUgMjAyNlwiXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXREYXRlRm9yQXJpYUxhYmVsKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCdwdC1CUicsIHtcbiAgICAgICAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtkYXRlLmdldERhdGUoKX0vJHtkYXRlLmdldE1vbnRoKCkgKyAxfS8ke2RhdGUuZ2V0RnVsbFllYXIoKX1gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBsb2NhbGUgc3RyaW5nIHBhcmEgZm9ybWF0YcOnw6NvLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZSB8fCAncHQtQlInO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWR1eiBhcmlhLWxhYmVscyBkb3MgYm90w7VlcyBkbyBoZWFkZXIgcXVlIFByaW1lTkcgcmVuZGVyaXphIGVtIGluZ2zDqnMuXG4gICAgICogUHJpbWVORyB1c2EgYGdldFRyYW5zbGF0aW9uKCdjaG9vc2VEYXRlJylgIGV0YywgcXVlIHJldG9ybmEgaW5nbMOqc1xuICAgICAqIHNlIGBQcmltZU5HQ29uZmlnLnNldFRyYW5zbGF0aW9uKClgIG7Do28gZm9pIGNvbmZpZ3VyYWRvIHBlbG8gcHJvamV0by5cbiAgICAgKlxuICAgICAqIEJ1c2NhIGJvdMO1ZXMgY29tIGFyaWEtbGFiZWwgZW0gaW5nbMOqcyBlIHRyYWR1eiBwcm8gbG9jYWxlIGF0dWFsLlxuICAgICAqL1xuICAgIHByaXZhdGUgdHJhbnNsYXRlQXJpYUxhYmVscyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy5nZXRUcmFuc2xhdGlvbnMoKTtcblxuICAgICAgICAvLyBEaWFsb2cgYXJpYS1sYWJlbCAoXCJDaG9vc2UgRGF0ZVwiKVxuICAgICAgICBjb25zdCBkaWFsb2cgPSBwYW5lbC5jbG9zZXN0KCdbcm9sZT1cImRpYWxvZ1wiXScpIHx8IHBhbmVsO1xuICAgICAgICBjb25zdCBkaWFsb2dMYWJlbCA9IGRpYWxvZy5nZXRBdHRyaWJ1dGUoQVJJQV9MQUJFTF9BVFRSKTtcbiAgICAgICAgaWYgKGRpYWxvZ0xhYmVsICYmIHRyYW5zbGF0aW9uc1tkaWFsb2dMYWJlbF0pIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGRpYWxvZywgQVJJQV9MQUJFTF9BVFRSLCB0cmFuc2xhdGlvbnNbZGlhbG9nTGFiZWxdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJvdMO1ZXMgXCJDaG9vc2UgTW9udGhcIiBlIFwiQ2hvb3NlIFllYXJcIiBubyBoZWFkZXJcbiAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5wLWRhdGVwaWNrZXItc2VsZWN0LW1vbnRoLCAucC1kYXRlcGlja2VyLXNlbGVjdC15ZWFyJykuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGJ0bi5nZXRBdHRyaWJ1dGUoQVJJQV9MQUJFTF9BVFRSKTtcbiAgICAgICAgICAgIGlmIChsYWJlbCAmJiB0cmFuc2xhdGlvbnNbbGFiZWxdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoYnRuLCBBUklBX0xBQkVMX0FUVFIsIHRyYW5zbGF0aW9uc1tsYWJlbF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3JyaWdlIGFyaWEtbGFiZWwgZG9zIGJvdMO1ZXMgcHJldi9uZXh0IGRvIFByaW1lTkcuXG4gICAgICogUHJpbWVORyB1c2EgYHAtYnV0dG9uYCBjb21wb25lbnQgcXVlIHNldGEgYGFyaWEtbGFiZWxgIG5vIGhvc3QgZWxlbWVudCBgPHAtYnV0dG9uPmAsXG4gICAgICogbWFzIE5WREEgZm9jYSBvIGA8YnV0dG9uPmAgaW50ZXJubyBxdWUgbsOjbyBoZXJkYSBvIGxhYmVsIGRvIGN1c3RvbSBlbGVtZW50LlxuICAgICAqXG4gICAgICogRXN0cnV0dXJhIERPTTogYDxwLWJ1dHRvbiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgTW9udGhcIj48YnV0dG9uIGNsYXNzPVwicC1kYXRlcGlja2VyLXByZXYtYnV0dG9uXCI+Li4uPC9idXR0b24+PC9wLWJ1dHRvbj5gXG4gICAgICpcbiAgICAgKiBGaXg6IGzDqiBhcmlhLWxhYmVsIGRvIGA8cC1idXR0b24+YCBob3N0LCB0cmFkdXosIGUgcHJvcGFnYSBwcm8gYDxidXR0b24+YCBpbnRlcm5vLlxuICAgICAqL1xuICAgIHByaXZhdGUgZml4TmF2aWdhdGlvbkJ1dHRvbkxhYmVscyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy5nZXRUcmFuc2xhdGlvbnMoKTtcblxuICAgICAgICAvLyBCdXNjYXIgPHAtYnV0dG9uPiBob3N0cyBxdWUgY29udMOpbSBvcyBib3TDtWVzIHByZXYvbmV4dFxuICAgICAgICBjb25zdCBwQnV0dG9ucyA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdwLWJ1dHRvbicpO1xuICAgICAgICBwQnV0dG9ucy5mb3JFYWNoKChwQnRuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbm5lckJ1dHRvbiA9IHBCdG4ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgICAgICAgICAgICAgJ2J1dHRvbi5wLWRhdGVwaWNrZXItcHJldi1idXR0b24sIGJ1dHRvbi5wLWRhdGVwaWNrZXItbmV4dC1idXR0b24nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFpbm5lckJ1dHRvbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxhYmVsID0gcEJ0bi5nZXRBdHRyaWJ1dGUoQVJJQV9MQUJFTF9BVFRSKSB8fCAnJztcblxuICAgICAgICAgICAgLy8gVHJhZHV6aXJcbiAgICAgICAgICAgIGlmIChsYWJlbCAmJiB0cmFuc2xhdGlvbnNbbGFiZWxdKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSB0cmFuc2xhdGlvbnNbbGFiZWxdO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHBCdG4sIEFSSUFfTEFCRUxfQVRUUiwgbGFiZWwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm9wYWdhciBwcm8gPGJ1dHRvbj4gaW50ZXJub1xuICAgICAgICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoaW5uZXJCdXR0b24sIEFSSUFfTEFCRUxfQVRUUiwgbGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYHJvbGU9XCJhcHBsaWNhdGlvblwiYCBkbyBjb250YWluZXIgZG8gY2FsZW5kw6FyaW8uXG4gICAgICpcbiAgICAgKiBQcmltZU5HIHNldGEgYHJvbGU9XCJhcHBsaWNhdGlvblwiYCBubyBgLnAtZGF0ZXBpY2tlci1jYWxlbmRhci1jb250YWluZXJgXG4gICAgICogcGFyYSBxdWUgYXJyb3cga2V5cyBjaGVndWVtIG5vIEphdmFTY3JpcHQgc2VtIGludGVyY2VwdGHDp8OjbyBkbyBicm93c2UgbW9kZS5cbiAgICAgKiBQb3LDqW0gYHJvbGU9XCJncmlkXCJgIG5hIHRhYmxlIGrDoSBnYXJhbnRlIGVzc2UgY29tcG9ydGFtZW50byDigJQgTlZEQSBlbnRyYVxuICAgICAqIGF1dG9tYXRpY2FtZW50ZSBlbSBmb2N1cyBtb2RlIGFvIGZvY2FyIHVtYSBncmlkY2VsbC5cbiAgICAgKlxuICAgICAqIE8gYHJvbGU9XCJhcHBsaWNhdGlvblwiYCBubyBjb250YWluZXIgUEFJIGNhdXNhIE5WREEgYSBkZXNwZWphIG8gY29udGXDumRvXG4gICAgICogdmlydHVhbCBkbyBjb250YWluZXIgaW50ZWlybyBhbyBlbnRyYXIgbm8gZGlhbG9nLCBhbnRlcyBkZSBwb3VzYXIgbmEgY8OpbHVsYS5cbiAgICAgKiBSZW1vdsOqLWxvIHJlc29sdmUgYSBsZWl0dXJhIGV4Y2Vzc2l2YSBzZW0gcXVlYnJhciBuYXZlZ2HDp8OjbyBwb3Igc2V0YXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmVBcHBsaWNhdGlvblJvbGVGcm9tQ29udGFpbmVyKHBhbmVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjYWxlbmRhckNvbnRhaW5lciA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcucC1kYXRlcGlja2VyLWNhbGVuZGFyLWNvbnRhaW5lcicpO1xuICAgICAgICBpZiAoY2FsZW5kYXJDb250YWluZXI/LmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnYXBwbGljYXRpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShjYWxlbmRhckNvbnRhaW5lciwgJ3JvbGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbWFwYSBkZSB0cmFkdcOnw7VlcyBwcm8gbG9jYWxlIGF0dWFsLlxuICAgICAqIFNlIGxvY2FsZSDDqSBpbmdsw6pzIG91IG7Do28gcmVjb25oZWNpZG8sIGZhbGxiYWNrIHByYSBwdC1CUlxuICAgICAqIChhc3N1bWltb3MgcXVlIGxhYmVscyBlbSBpbmdsw6pzIGRldmVtIHNlciB0cmFkdXppZG9zKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFRyYW5zbGF0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gdGhpcy5nZXRMb2NhbGUoKTtcbiAgICAgICAgcmV0dXJuIEFSSUFfVFJBTlNMQVRJT05TW2xvY2FsZV1cbiAgICAgICAgICAgIHx8IEFSSUFfVFJBTlNMQVRJT05TW2xvY2FsZS5zcGxpdCgnLScpWzBdXVxuICAgICAgICAgICAgfHwgQVJJQV9UUkFOU0xBVElPTlNfUFRfQlI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgbGlzdGVuZXJzIGRlIGZvY3VzL2JsdXIgbm9zIGVsZW1lbnRvcyBpbnRlcmF0aXZvcyBwYXJhXG4gICAgICogZ2FyYW50aXIgaW5kaWNhZG9yIHZpc3VhbCBxdWFuZG8gYC5mb2N1cygpYCDDqSBjaGFtYWRvIHByb2dyYW1hdGljYW1lbnRlLlxuICAgICAqXG4gICAgICogYDpmb2N1cy12aXNpYmxlYCBwb2RlIG7Do28gc2VyIGFwbGljYWRvIHF1YW5kbyBmb2NvIMOpIG1vdmlkbyB2aWEgSlMsXG4gICAgICogZW50w6NvIHVzYW1vcyBjbGFzc2UgYXV4aWxpYXIgYHMtZGF0ZXBpY2tlci1kYXktZm9jdXNlZGAgY29tbyBmYWxsYmFjay5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldHVwRm9jdXNUcmFja2luZyhwYW5lbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmVGb2N1c0xpc3RlbmVycygpO1xuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gcGFuZWwucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgICAgICAgICAnLnAtZGF0ZXBpY2tlci1kYXksIC5wLWRhdGVwaWNrZXItbW9udGgsIC5wLWRhdGVwaWNrZXIteWVhcidcbiAgICAgICAgKTtcbiAgICAgICAgZm9jdXNhYmxlRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzQ2xlYW51cCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGVsLCAnZm9jdXMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbCwgJ3MtZGF0ZXBpY2tlci1kYXktZm9jdXNlZCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBibHVyQ2xlYW51cCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGVsLCAnYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLCAncy1kYXRlcGlja2VyLWRheS1mb2N1c2VkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNMaXN0ZW5lckNsZWFudXBzLnB1c2goZm9jdXNDbGVhbnVwLCBibHVyQ2xlYW51cCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBsaXN0ZW5lcnMgZGUgZm9jdXMvYmx1ciByZWdpc3RyYWRvcyBhbnRlcmlvcm1lbnRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVtb3ZlRm9jdXNMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNMaXN0ZW5lckNsZWFudXBzLmZvckVhY2goKGNsZWFudXApID0+IGNsZWFudXAoKSk7XG4gICAgICAgIHRoaXMuZm9jdXNMaXN0ZW5lckNsZWFudXBzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2YSBtdWRhbsOnYXMgbm8gRE9NIGRvIHBhaW5lbCBwYXJhIHJlYXBsaWNhciBjb3JyZcOnw7Vlc1xuICAgICAqIHF1YW5kbyBvIFByaW1lTkcgdHJvY2EgYSB2aWV3IGludGVybmEgKGRpYXMg4oaSIG1lc2VzIOKGkiBhbm9zKS5cbiAgICAgKiBVc2EgZGVib3VuY2UgZSBzw7MgcmVhZ2UgYSBjaGlsZExpc3QgY2hhbmdlcyAobsOjbyBhdHRyaWJ1dGVzKVxuICAgICAqIHBhcmEgZXZpdGFyIGxvb3AgaW5maW5pdG8gY29tIGFzIHByw7NwcmlhcyBtdXRhw6fDtWVzIGRhIGRpcmV0aXZhLlxuICAgICAqL1xuICAgIHByaXZhdGUgb2JzZXJ2ZVBhbmVsQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0T2JzZXJ2ZXIoKTtcblxuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5O1xuICAgICAgICBpZiAoIXBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVib3VuY2VUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTw7MgcmVhZ2lyIHNlIGhvdXZlIGFkacOnw6NvL3JlbW/Dp8OjbyBkZSBuw7NzICh0cm9jYSBkZSB2aWV3KVxuICAgICAgICAgICAgY29uc3QgaGFzU3RydWN0dXJhbENoYW5nZSA9IG11dGF0aW9ucy5zb21lKFxuICAgICAgICAgICAgICAgIChtKSA9PiBtLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIChtLmFkZGVkTm9kZXMubGVuZ3RoID4gMCB8fCBtLnJlbW92ZWROb2Rlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFoYXNTdHJ1Y3R1cmFsQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGVib3VuY2VUaW1lcikge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpc1Byb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZml4UGFuZWxBY2Nlc3NpYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RUYXJnZXQoKTtcbiAgICAgICAgICAgICAgICBpc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIE1VVEFUSU9OX0RFQk9VTkNFX01TKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHBhbmVsLCB7XG4gICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RPYnNlcnZlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -5,6 +5,10 @@ import { isNullOrUndefined } from '@seniorsistemas/angular-components/utils';
5
5
  import { Calendar } from 'primeng/calendar';
6
6
 
7
7
  /**
8
+ * @deprecated
9
+ * @since 19.6.0
10
+ * Favor utilizar o componente: s-datepicker, que é o calendário oficial do Design System da Senior.
11
+ *
8
12
  * @description Diretiva que aplica máscara de entrada a um componente `p-calendar` do PrimeNG,
9
13
  * formatando automaticamente a data conforme o formato configurado no calendário.
10
14
  * Intercepta os eventos de teclado e input do campo interno do calendar para garantir
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-calendar-mask.mjs","sources":["../../projects/angular-components/calendar-mask/src/lib/calendar-mask/calendar-mask.directive.ts","../../projects/angular-components/calendar-mask/src/lib/calendar-mask/calendar-mask.module.ts","../../projects/angular-components/calendar-mask/src/seniorsistemas-angular-components-calendar-mask.ts"],"sourcesContent":["import { AfterViewChecked, Directive, HostListener, Input, OnDestroy, OnInit, Renderer2, inject } from '@angular/core';\nimport { isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\n\nimport { Calendar } from 'primeng/calendar';\n\n/**\n * @description Diretiva que aplica máscara de entrada a um componente `p-calendar` do PrimeNG,\n * formatando automaticamente a data conforme o formato configurado no calendário.\n * Intercepta os eventos de teclado e input do campo interno do calendar para garantir\n * que apenas entradas válidas sejam aceitas.\n *\n * @example\n * ```html\n * <p-calendar sCalendarMask [(ngModel)]=\"data\" dateFormat=\"dd/mm/yy\" />\n * ```\n *\n * @category Inputs\n */\n@Directive({\n selector: 'p-calendar[sCalendarMask]',\n})\nexport class CalendarMaskDirective implements OnInit, OnDestroy, AfterViewChecked {\n host = inject(Calendar);\n renderer = inject(Renderer2);\n\n // TODO: Mudei um monte de coisa e tem que testar se isso ainda funciona\n // TODO: Ainda está sendo usada esta diretiva?\n SELECTORS = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n\n /**\n * @description Caractere usado como placeholder para as posições ainda não preenchidas na máscara.\n *\n * @default '_'\n */\n @Input()\n public slotChar = '_';\n\n /**\n * @description Quando `true`, limpa automaticamente o campo caso o valor digitado\n * seja inválido ao perder o foco.\n *\n * @default false\n */\n @Input()\n public autoClear = false;\n\n public value: any;\n public input?: HTMLInputElement;\n public filled?: boolean;\n\n private _mask?: string;\n private defs: any;\n private tests?: any[];\n private partialPosition: any;\n private firstNonMaskPos: number | null | undefined;\n private lastRequiredNonMaskPos: any;\n private len?: number;\n private oldVal?: string;\n private buffer: any;\n private defaultBuffer?: string;\n private focusText?: string;\n private caretTimeoutId: any;\n private androidChrome?: boolean;\n private firstTime = true;\n\n private focusListener?: () => void;\n private blurListener?: () => void;\n private keydownListener?: () => void;\n private keypressListener?: () => void;\n private inputListener?: () => void;\n private pasteListener?: () => void;\n\n private setListeners() {\n this.input = this.host.inputfieldViewChild?.nativeElement;\n this.value = this.input?.value;\n\n this.focusListener = this.renderer.listen(this.input, 'focus', () => {\n this.onInputFocus();\n });\n\n this.blurListener = this.renderer.listen(this.input, 'blur', (event: any) => {\n this.onInputBlur(event);\n });\n\n this.keydownListener = this.renderer.listen(this.input, 'keydown', (event: any) => {\n this.onKeyDown(event);\n });\n\n this.keypressListener = this.renderer.listen(this.input, 'keypress', (event: any) => {\n this.onKeyPress(event);\n });\n\n this.inputListener = this.renderer.listen(this.input, 'input', (event: any) => {\n this.onInputChange(event);\n });\n\n this.pasteListener = this.renderer.listen(this.input, 'paste', (event: any) => {\n this.handleInputChange(event);\n });\n }\n\n public ngOnInit() {\n const ua = navigator.userAgent;\n this.androidChrome = /chrome/i.test(ua) && /android/i.test(ua);\n\n this.createMaskFromDateFormat();\n this.initMask();\n }\n\n get mask(): string {\n return this._mask ?? '';\n }\n\n set mask(val: string) {\n this._mask = val;\n\n this.initMask();\n this.writeValue('');\n }\n\n public writeValue(value: any): void {\n this.value = value;\n\n if (this.input) {\n if (this.value == undefined) {\n this.input.value = '';\n } else {\n this.input.value = this.value;\n }\n\n this.checkVal();\n this.focusText = this.input.value;\n this.updateFilledState();\n }\n }\n\n public onInputBlur(e: any) {\n this.checkVal();\n this.updateFilledState();\n\n if (this.value != this.focusText) {\n if (\n !this.input?.disabled &&\n (this.value === undefined || this.value === null || (this.value as string).indexOf(this.slotChar) >= 0)\n ) {\n this.value = '';\n e.target.value = '';\n this.host.updateModel(null);\n }\n\n this.updateModel(e);\n const event = document.createEvent('HTMLEvents');\n event.initEvent('change', true, false);\n this.input?.dispatchEvent(event);\n }\n }\n\n public onKeyDown(e: any) {\n if (this.host.readonlyInput) {\n return;\n }\n\n const k = e.which || e.keyCode;\n const iPhone = /iphone/i.test(navigator.userAgent);\n let pos;\n let begin;\n let end;\n this.oldVal = this.input?.value;\n\n // Backspace, delete, and escape get special treatment\n if (k === 8 || k === 46 || (iPhone && k === 127)) {\n pos = this.caret();\n begin = pos?.begin;\n end = pos?.end;\n\n if (begin && end) {\n if (end - begin === 0) {\n begin = k !== 46 ? this.seekPrev(begin) : (end = this.seekNext(begin - 1));\n end = k === 46 ? this.seekNext(end) : end;\n }\n\n this.clearBuffer(begin, end);\n this.shiftL(begin, end - 1);\n }\n\n this.updateModel(e);\n e.preventDefault();\n } else if (k === 13) {\n // Enter\n this.onInputBlur(e);\n this.updateModel(e);\n } else if (k === 27) {\n // Escape\n if (this.input && this.focusText) {\n this.input.value = this.focusText;\n this.caret(0, this.checkVal());\n }\n this.updateModel(e);\n e.preventDefault();\n }\n }\n\n public onKeyPress(e: any) {\n if (this.host.readonlyInput) return;\n\n const k = e.which || e.keyCode;\n const pos = this.caret();\n let p;\n let c;\n let next: any;\n\n if (e.ctrlKey || e.altKey || e.metaKey || k < 32 || (k > 34 && k < 41)) {\n // Ignore\n return;\n } else if (k && k !== 13) {\n if (!isNullOrUndefined(pos?.end) && !isNullOrUndefined(pos?.begin)) {\n if (pos.end - pos.begin !== 0) {\n this.clearBuffer(pos.begin, pos.end);\n this.shiftL(pos.begin, pos.end - 1);\n }\n }\n\n if (!isNullOrUndefined(pos?.begin)) {\n p = this.seekNext(pos.begin - 1);\n }\n\n if (p < (this.len ?? 0)) {\n c = String.fromCharCode(k);\n if (this.tests?.[p].test(c)) {\n this.shiftR(p);\n\n this.buffer[p] = c;\n this.writeBuffer();\n next = this.seekNext(p);\n\n if (/android/i.test(navigator.userAgent)) {\n // Path for CSP Violation on FireFox OS 1.1\n const proxy = () => {\n this.caret(next);\n };\n\n setTimeout(proxy, 0);\n } else {\n this.caret(next);\n }\n }\n }\n e.preventDefault();\n }\n\n this.updateModel(e);\n this.updateFilledState();\n }\n\n private createCompleteMask(): string {\n switch (this.host.selectionMode) {\n case 'range':\n return this.mask + ` ${this.host.rangeSeparator} ` + this.mask;\n case 'single':\n case 'multiple':\n return this.mask;\n default:\n return '';\n }\n }\n\n public checkVal(allow?: boolean) {\n // Try to place characters where they belong\n const test = this.input?.value;\n let lastMatch = -1;\n let i: any;\n let c: any;\n let pos = 0;\n\n for (i = 0; i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n this.buffer[i] = this.getPlaceholder(i);\n while (pos++ < (test?.length ?? 0)) {\n c = test?.charAt(pos - 1);\n if (this.tests[i].test(c)) {\n this.buffer[i] = c;\n lastMatch = i;\n break;\n }\n }\n if (pos > (test?.length ?? 0)) {\n this.clearBuffer(i + 1, this.len);\n break;\n }\n } else {\n if (this.buffer[i] === test?.charAt(pos)) {\n pos++;\n }\n if (i < this.partialPosition) {\n lastMatch = i;\n }\n }\n }\n if (allow) {\n this.writeBuffer();\n } else if (lastMatch + 1 < this.partialPosition) {\n if (this.autoClear || this.buffer.join('') === this.defaultBuffer) {\n // Invalid value. Remove it and replace it with the\n // mask, which is the default behavior.\n if (this.input?.value) {\n this.input.value = '';\n }\n this.clearBuffer(0, this.len);\n } else {\n // Invalid value, but we opt to show the value to the\n // user and allow them to correct their mistake.\n this.writeBuffer();\n }\n } else {\n this.writeBuffer();\n if (!isNullOrUndefined(this.input)) {\n this.input.value = this.input.value.substring(0, lastMatch + 1);\n }\n }\n\n return this.partialPosition ? i : this.firstNonMaskPos;\n }\n\n public onInputFocus() {\n if (this.host.readonlyInput) return;\n\n clearTimeout(this.caretTimeoutId);\n let pos: any;\n\n this.focusText = this.input?.value;\n\n pos = this.checkVal();\n\n this.caretTimeoutId = setTimeout(() => {\n if (this.input !== document.activeElement) {\n return;\n }\n this.writeBuffer();\n if (pos == this.mask.replace('?', '').length) {\n this.caret(0, pos);\n } else {\n this.caret(pos);\n }\n }, 10);\n }\n\n public onInputChange(event: any) {\n if (this.androidChrome) this.handleAndroidInput(event);\n else this.handleInputChange(event);\n }\n\n public handleInputChange(event: any) {\n if (this.host.readonlyInput) return;\n\n setTimeout(() => {\n const pos = this.checkVal(true);\n this.caret(pos);\n this.updateModel(event);\n }, 0);\n }\n\n public updateModel(e: any) {\n const updatedValue = e.target.value;\n if (updatedValue !== null || updatedValue !== undefined) {\n this.value = updatedValue;\n this.host.onUserInput(e);\n }\n }\n\n public updateFilledState() {\n this.filled = this.input && this.input.value != '';\n }\n\n public focus() {\n this.input?.focus();\n }\n\n private initMask() {\n const completeMask = this.createCompleteMask();\n\n this.tests = [];\n this.partialPosition = completeMask.length;\n this.len = completeMask.length;\n this.firstNonMaskPos = null;\n this.defs = {\n '9': '[0-9]',\n };\n\n const maskTokens = completeMask.split('');\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c == '?') {\n this.len--;\n this.partialPosition = i;\n } else if (this.defs[c]) {\n this.tests.push(new RegExp(this.defs[c]));\n\n if (this.firstNonMaskPos === null) {\n this.firstNonMaskPos = this.tests.length - 1;\n }\n\n if (i < this.partialPosition) {\n this.lastRequiredNonMaskPos = this.tests.length - 1;\n }\n } else {\n this.tests.push(null);\n }\n }\n\n this.buffer = [];\n\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c != '?') {\n if (this.defs[c]) {\n this.buffer.push(this.getPlaceholder(i));\n } else {\n this.buffer.push(c);\n }\n }\n }\n\n this.defaultBuffer = this.buffer.join('');\n }\n\n private caret(first?: number, last?: number) {\n let range, begin, end;\n\n if (!this.input?.offsetParent || this.input !== document.activeElement) {\n return { begin: 0, end: 0 };\n }\n\n if (typeof first == 'number') {\n begin = first;\n end = typeof last === 'number' ? last : begin;\n\n if (this.input.setSelectionRange) {\n this.input.setSelectionRange(begin, end);\n } else if ((this.input as any)['createTextRange']) {\n range = (this.input as any)['createTextRange']();\n range.collapse(true);\n range.moveEnd('character', end);\n range.moveStart('character', begin);\n range.select();\n }\n } else {\n begin = this.input.selectionStart;\n end = this.input.selectionEnd;\n\n return { begin: begin, end: end };\n }\n\n return { begin: first ?? 0, end: last ?? 0 };\n }\n\n private getPlaceholder(i: number) {\n if (i < this.slotChar.length) return this.slotChar.charAt(i);\n return this.slotChar.charAt(0);\n }\n\n private seekNext(pos: any) {\n while (++pos < (this.len ?? 0)) {\n if (this.tests?.[pos]) break;\n }\n return pos;\n }\n\n private seekPrev(pos: any) {\n while (--pos >= 0 && !this.tests?.[pos]) {\n if (this.tests?.[pos]) break;\n }\n return pos;\n }\n\n private shiftL(begin: number, end: number) {\n let i: any;\n let j: any;\n\n if (begin < 0) {\n return;\n }\n\n j = this.seekNext(end);\n\n for (i = begin; i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n if (j < (this.len ?? 0) && this.tests[i].test(this.buffer[j])) {\n this.buffer[i] = this.buffer[j];\n this.buffer[j] = this.getPlaceholder(j);\n } else break;\n\n j = this.seekNext(j);\n }\n }\n this.writeBuffer();\n if (!isNullOrUndefined(this.firstNonMaskPos)) {\n this.caret(Math.max(this.firstNonMaskPos, begin));\n }\n }\n\n private shiftR(pos: any) {\n let i: any;\n let c = this.getPlaceholder(pos);\n let j: any;\n let t: any;\n\n for (i = pos; i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n j = this.seekNext(i);\n t = this.buffer[i];\n this.buffer[i] = c;\n\n if (j < (this.len ?? 0) && this.tests[j].test(t)) {\n c = t;\n } else break;\n }\n }\n }\n\n private handleAndroidInput(e: any) {\n const curVal = this.input?.value;\n const pos = this.caret();\n\n if (isNullOrUndefined(pos?.begin)) return;\n\n if (this.oldVal && this.oldVal.length && this.oldVal.length > (curVal?.length ?? 0)) {\n // A deletion or backspace happened\n this.checkVal(true);\n while (pos?.begin > 0 && !this.tests?.[pos.begin - 1]) {\n pos.begin--;\n }\n if (pos.begin === 0) {\n while (pos.begin < (this.firstNonMaskPos ?? 0) && !this.tests?.[pos.begin]) {\n pos.begin++;\n }\n }\n\n setTimeout(() => {\n this.caret(pos.begin!, pos.begin!);\n if (this.isCompleted()) {\n const sentVal = curVal?.replace(this.slotChar, ''); // Limpa os caracteres placeholders extras caso ele esteja completo\n sentVal && this.updateCalendarValue(sentVal);\n }\n }, 0);\n } else {\n this.checkVal(true);\n\n while (pos.begin < (this.len ?? 0) && !this.tests?.[pos.begin]) {\n pos.begin++;\n }\n\n if (!isNullOrUndefined(pos.begin)) {\n setTimeout(() => {\n this.caret(pos.begin!, pos.begin!);\n if (this.isCompleted()) {\n const sentVal = curVal?.replace(this.slotChar, ''); // Limpa os caracteres placeholders extras caso ele esteja completo\n sentVal && this.updateCalendarValue(sentVal);\n }\n }, 0);\n }\n }\n }\n\n private updateCalendarValue(sentVal: string) {\n // TODO verificar\n const dateVal = <Date>this.host.parseValueFromString(sentVal);\n if (this.host.isSelectable(dateVal.getDate(), dateVal.getMonth(), dateVal.getFullYear(), false)) {\n this.host.updateModel(sentVal);\n this.host.updateUI();\n }\n }\n\n private clearBuffer(start: any, end: any) {\n let i;\n\n for (i = start; i < end && i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n this.buffer[i] = this.getPlaceholder(i);\n }\n }\n }\n\n private writeBuffer() {\n if (!isNullOrUndefined(this.input)) {\n this.input.value = this.buffer.join('');\n }\n }\n\n private createMaskFromDateFormat() {\n const calendar = this.host;\n let mask = this.autoClear ? '?' : '';\n\n if (!calendar.timeOnly) {\n let dateFormat = calendar.dateFormat;\n dateFormat = dateFormat?.replace(/y/g, 'yy');\n mask += dateFormat?.replace(/[^/*,.\\-+\\[\\]\\\\]/g, '9');\n if (calendar.showTime) {\n mask += ' ';\n }\n }\n\n if (calendar.showTime || calendar.timeOnly) {\n mask += '99:99';\n if (calendar.showSeconds) {\n mask += ':99';\n }\n }\n\n this._mask = mask;\n\n this.initMask();\n }\n\n isCompleted(): boolean {\n for (let i = this.firstNonMaskPos ?? 0; i <= this.lastRequiredNonMaskPos; i++) {\n if (this.tests?.[i] && this.buffer[i] === this.getPlaceholder(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n ngAfterViewChecked(): void {\n if (this.host.inputfieldViewChild && this.firstTime) {\n this.firstTime = false;\n this.setListeners();\n if (!isNullOrUndefined(this.input)) {\n this.input.type = 'tel';\n }\n }\n }\n\n ngOnDestroy(): void {\n if (this.focusListener) this.focusListener();\n if (this.blurListener) this.blurListener();\n if (this.keydownListener) this.keydownListener();\n if (this.keypressListener) this.keypressListener();\n if (this.inputListener) this.inputListener();\n if (this.pasteListener) this.pasteListener();\n }\n\n @HostListener('keydown', ['$event'])\n onKeydownEventTest(e: KeyboardEvent) {\n const { key } = e;\n if (key == 'Tab') {\n // Este código foi implementado para corrigir um problema no componente na v9\n // Deve ser removido assim que atualizarmos o PrimeNG para a v10\n const allFocusableElements = document.querySelectorAll(this.SELECTORS);\n let nextIsFocusable = false;\n let previousFocusable: string;\n let forceCloseModal = true;\n allFocusableElements.forEach((element) => {\n if (!e.shiftKey) {\n if (nextIsFocusable && element.id) {\n this.focusableElement(element.id, forceCloseModal);\n nextIsFocusable = false;\n e.preventDefault();\n return;\n }\n }\n\n let activeTagName = window.document.activeElement?.tagName;\n if (e.shiftKey && element.id && element.tagName === 'INPUT' && activeTagName == 'BUTTON') {\n previousFocusable = element.id;\n forceCloseModal = false;\n }\n\n if (element.id === this.host.inputId) {\n if (previousFocusable) {\n this.focusableElement(previousFocusable, forceCloseModal);\n e.preventDefault();\n forceCloseModal = true;\n return;\n }\n nextIsFocusable = true;\n } else if (e.shiftKey && element.id) {\n previousFocusable = element.id;\n }\n });\n }\n }\n\n public focusableElement(id: string, hide: boolean) {\n const htmlElement = window.document.getElementById(id);\n htmlElement?.focus();\n if (hide) {\n this.host.hideOverlay();\n }\n }\n}\n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { CalendarMaskDirective } from './calendar-mask.directive';\n\n@NgModule({\n declarations: [CalendarMaskDirective],\n imports: [CommonModule],\n exports: [CalendarMaskDirective],\n})\nexport class CalendarMaskModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-calendar-mask.mjs","sources":["../../projects/angular-components/calendar-mask/src/lib/calendar-mask/calendar-mask.directive.ts","../../projects/angular-components/calendar-mask/src/lib/calendar-mask/calendar-mask.module.ts","../../projects/angular-components/calendar-mask/src/seniorsistemas-angular-components-calendar-mask.ts"],"sourcesContent":["import { AfterViewChecked, Directive, HostListener, Input, OnDestroy, OnInit, Renderer2, inject } from '@angular/core';\nimport { isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\n\nimport { Calendar } from 'primeng/calendar';\n\n/**\n * @deprecated\n * @since 19.6.0\n * Favor utilizar o componente: s-datepicker, que é o calendário oficial do Design System da Senior.\n *\n * @description Diretiva que aplica máscara de entrada a um componente `p-calendar` do PrimeNG,\n * formatando automaticamente a data conforme o formato configurado no calendário.\n * Intercepta os eventos de teclado e input do campo interno do calendar para garantir\n * que apenas entradas válidas sejam aceitas.\n *\n * @example\n * ```html\n * <p-calendar sCalendarMask [(ngModel)]=\"data\" dateFormat=\"dd/mm/yy\" />\n * ```\n *\n * @category Inputs\n */\n@Directive({\n selector: 'p-calendar[sCalendarMask]',\n})\nexport class CalendarMaskDirective implements OnInit, OnDestroy, AfterViewChecked {\n host = inject(Calendar);\n renderer = inject(Renderer2);\n\n // TODO: Mudei um monte de coisa e tem que testar se isso ainda funciona\n // TODO: Ainda está sendo usada esta diretiva?\n SELECTORS = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n\n /**\n * @description Caractere usado como placeholder para as posições ainda não preenchidas na máscara.\n *\n * @default '_'\n */\n @Input()\n public slotChar = '_';\n\n /**\n * @description Quando `true`, limpa automaticamente o campo caso o valor digitado\n * seja inválido ao perder o foco.\n *\n * @default false\n */\n @Input()\n public autoClear = false;\n\n public value: any;\n public input?: HTMLInputElement;\n public filled?: boolean;\n\n private _mask?: string;\n private defs: any;\n private tests?: any[];\n private partialPosition: any;\n private firstNonMaskPos: number | null | undefined;\n private lastRequiredNonMaskPos: any;\n private len?: number;\n private oldVal?: string;\n private buffer: any;\n private defaultBuffer?: string;\n private focusText?: string;\n private caretTimeoutId: any;\n private androidChrome?: boolean;\n private firstTime = true;\n\n private focusListener?: () => void;\n private blurListener?: () => void;\n private keydownListener?: () => void;\n private keypressListener?: () => void;\n private inputListener?: () => void;\n private pasteListener?: () => void;\n\n private setListeners() {\n this.input = this.host.inputfieldViewChild?.nativeElement;\n this.value = this.input?.value;\n\n this.focusListener = this.renderer.listen(this.input, 'focus', () => {\n this.onInputFocus();\n });\n\n this.blurListener = this.renderer.listen(this.input, 'blur', (event: any) => {\n this.onInputBlur(event);\n });\n\n this.keydownListener = this.renderer.listen(this.input, 'keydown', (event: any) => {\n this.onKeyDown(event);\n });\n\n this.keypressListener = this.renderer.listen(this.input, 'keypress', (event: any) => {\n this.onKeyPress(event);\n });\n\n this.inputListener = this.renderer.listen(this.input, 'input', (event: any) => {\n this.onInputChange(event);\n });\n\n this.pasteListener = this.renderer.listen(this.input, 'paste', (event: any) => {\n this.handleInputChange(event);\n });\n }\n\n public ngOnInit() {\n const ua = navigator.userAgent;\n this.androidChrome = /chrome/i.test(ua) && /android/i.test(ua);\n\n this.createMaskFromDateFormat();\n this.initMask();\n }\n\n get mask(): string {\n return this._mask ?? '';\n }\n\n set mask(val: string) {\n this._mask = val;\n\n this.initMask();\n this.writeValue('');\n }\n\n public writeValue(value: any): void {\n this.value = value;\n\n if (this.input) {\n if (this.value == undefined) {\n this.input.value = '';\n } else {\n this.input.value = this.value;\n }\n\n this.checkVal();\n this.focusText = this.input.value;\n this.updateFilledState();\n }\n }\n\n public onInputBlur(e: any) {\n this.checkVal();\n this.updateFilledState();\n\n if (this.value != this.focusText) {\n if (\n !this.input?.disabled &&\n (this.value === undefined || this.value === null || (this.value as string).indexOf(this.slotChar) >= 0)\n ) {\n this.value = '';\n e.target.value = '';\n this.host.updateModel(null);\n }\n\n this.updateModel(e);\n const event = document.createEvent('HTMLEvents');\n event.initEvent('change', true, false);\n this.input?.dispatchEvent(event);\n }\n }\n\n public onKeyDown(e: any) {\n if (this.host.readonlyInput) {\n return;\n }\n\n const k = e.which || e.keyCode;\n const iPhone = /iphone/i.test(navigator.userAgent);\n let pos;\n let begin;\n let end;\n this.oldVal = this.input?.value;\n\n // Backspace, delete, and escape get special treatment\n if (k === 8 || k === 46 || (iPhone && k === 127)) {\n pos = this.caret();\n begin = pos?.begin;\n end = pos?.end;\n\n if (begin && end) {\n if (end - begin === 0) {\n begin = k !== 46 ? this.seekPrev(begin) : (end = this.seekNext(begin - 1));\n end = k === 46 ? this.seekNext(end) : end;\n }\n\n this.clearBuffer(begin, end);\n this.shiftL(begin, end - 1);\n }\n\n this.updateModel(e);\n e.preventDefault();\n } else if (k === 13) {\n // Enter\n this.onInputBlur(e);\n this.updateModel(e);\n } else if (k === 27) {\n // Escape\n if (this.input && this.focusText) {\n this.input.value = this.focusText;\n this.caret(0, this.checkVal());\n }\n this.updateModel(e);\n e.preventDefault();\n }\n }\n\n public onKeyPress(e: any) {\n if (this.host.readonlyInput) return;\n\n const k = e.which || e.keyCode;\n const pos = this.caret();\n let p;\n let c;\n let next: any;\n\n if (e.ctrlKey || e.altKey || e.metaKey || k < 32 || (k > 34 && k < 41)) {\n // Ignore\n return;\n } else if (k && k !== 13) {\n if (!isNullOrUndefined(pos?.end) && !isNullOrUndefined(pos?.begin)) {\n if (pos.end - pos.begin !== 0) {\n this.clearBuffer(pos.begin, pos.end);\n this.shiftL(pos.begin, pos.end - 1);\n }\n }\n\n if (!isNullOrUndefined(pos?.begin)) {\n p = this.seekNext(pos.begin - 1);\n }\n\n if (p < (this.len ?? 0)) {\n c = String.fromCharCode(k);\n if (this.tests?.[p].test(c)) {\n this.shiftR(p);\n\n this.buffer[p] = c;\n this.writeBuffer();\n next = this.seekNext(p);\n\n if (/android/i.test(navigator.userAgent)) {\n // Path for CSP Violation on FireFox OS 1.1\n const proxy = () => {\n this.caret(next);\n };\n\n setTimeout(proxy, 0);\n } else {\n this.caret(next);\n }\n }\n }\n e.preventDefault();\n }\n\n this.updateModel(e);\n this.updateFilledState();\n }\n\n private createCompleteMask(): string {\n switch (this.host.selectionMode) {\n case 'range':\n return this.mask + ` ${this.host.rangeSeparator} ` + this.mask;\n case 'single':\n case 'multiple':\n return this.mask;\n default:\n return '';\n }\n }\n\n public checkVal(allow?: boolean) {\n // Try to place characters where they belong\n const test = this.input?.value;\n let lastMatch = -1;\n let i: any;\n let c: any;\n let pos = 0;\n\n for (i = 0; i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n this.buffer[i] = this.getPlaceholder(i);\n while (pos++ < (test?.length ?? 0)) {\n c = test?.charAt(pos - 1);\n if (this.tests[i].test(c)) {\n this.buffer[i] = c;\n lastMatch = i;\n break;\n }\n }\n if (pos > (test?.length ?? 0)) {\n this.clearBuffer(i + 1, this.len);\n break;\n }\n } else {\n if (this.buffer[i] === test?.charAt(pos)) {\n pos++;\n }\n if (i < this.partialPosition) {\n lastMatch = i;\n }\n }\n }\n if (allow) {\n this.writeBuffer();\n } else if (lastMatch + 1 < this.partialPosition) {\n if (this.autoClear || this.buffer.join('') === this.defaultBuffer) {\n // Invalid value. Remove it and replace it with the\n // mask, which is the default behavior.\n if (this.input?.value) {\n this.input.value = '';\n }\n this.clearBuffer(0, this.len);\n } else {\n // Invalid value, but we opt to show the value to the\n // user and allow them to correct their mistake.\n this.writeBuffer();\n }\n } else {\n this.writeBuffer();\n if (!isNullOrUndefined(this.input)) {\n this.input.value = this.input.value.substring(0, lastMatch + 1);\n }\n }\n\n return this.partialPosition ? i : this.firstNonMaskPos;\n }\n\n public onInputFocus() {\n if (this.host.readonlyInput) return;\n\n clearTimeout(this.caretTimeoutId);\n let pos: any;\n\n this.focusText = this.input?.value;\n\n pos = this.checkVal();\n\n this.caretTimeoutId = setTimeout(() => {\n if (this.input !== document.activeElement) {\n return;\n }\n this.writeBuffer();\n if (pos == this.mask.replace('?', '').length) {\n this.caret(0, pos);\n } else {\n this.caret(pos);\n }\n }, 10);\n }\n\n public onInputChange(event: any) {\n if (this.androidChrome) this.handleAndroidInput(event);\n else this.handleInputChange(event);\n }\n\n public handleInputChange(event: any) {\n if (this.host.readonlyInput) return;\n\n setTimeout(() => {\n const pos = this.checkVal(true);\n this.caret(pos);\n this.updateModel(event);\n }, 0);\n }\n\n public updateModel(e: any) {\n const updatedValue = e.target.value;\n if (updatedValue !== null || updatedValue !== undefined) {\n this.value = updatedValue;\n this.host.onUserInput(e);\n }\n }\n\n public updateFilledState() {\n this.filled = this.input && this.input.value != '';\n }\n\n public focus() {\n this.input?.focus();\n }\n\n private initMask() {\n const completeMask = this.createCompleteMask();\n\n this.tests = [];\n this.partialPosition = completeMask.length;\n this.len = completeMask.length;\n this.firstNonMaskPos = null;\n this.defs = {\n '9': '[0-9]',\n };\n\n const maskTokens = completeMask.split('');\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c == '?') {\n this.len--;\n this.partialPosition = i;\n } else if (this.defs[c]) {\n this.tests.push(new RegExp(this.defs[c]));\n\n if (this.firstNonMaskPos === null) {\n this.firstNonMaskPos = this.tests.length - 1;\n }\n\n if (i < this.partialPosition) {\n this.lastRequiredNonMaskPos = this.tests.length - 1;\n }\n } else {\n this.tests.push(null);\n }\n }\n\n this.buffer = [];\n\n for (let i = 0; i < maskTokens.length; i++) {\n const c = maskTokens[i];\n\n if (c != '?') {\n if (this.defs[c]) {\n this.buffer.push(this.getPlaceholder(i));\n } else {\n this.buffer.push(c);\n }\n }\n }\n\n this.defaultBuffer = this.buffer.join('');\n }\n\n private caret(first?: number, last?: number) {\n let range, begin, end;\n\n if (!this.input?.offsetParent || this.input !== document.activeElement) {\n return { begin: 0, end: 0 };\n }\n\n if (typeof first == 'number') {\n begin = first;\n end = typeof last === 'number' ? last : begin;\n\n if (this.input.setSelectionRange) {\n this.input.setSelectionRange(begin, end);\n } else if ((this.input as any)['createTextRange']) {\n range = (this.input as any)['createTextRange']();\n range.collapse(true);\n range.moveEnd('character', end);\n range.moveStart('character', begin);\n range.select();\n }\n } else {\n begin = this.input.selectionStart;\n end = this.input.selectionEnd;\n\n return { begin: begin, end: end };\n }\n\n return { begin: first ?? 0, end: last ?? 0 };\n }\n\n private getPlaceholder(i: number) {\n if (i < this.slotChar.length) return this.slotChar.charAt(i);\n return this.slotChar.charAt(0);\n }\n\n private seekNext(pos: any) {\n while (++pos < (this.len ?? 0)) {\n if (this.tests?.[pos]) break;\n }\n return pos;\n }\n\n private seekPrev(pos: any) {\n while (--pos >= 0 && !this.tests?.[pos]) {\n if (this.tests?.[pos]) break;\n }\n return pos;\n }\n\n private shiftL(begin: number, end: number) {\n let i: any;\n let j: any;\n\n if (begin < 0) {\n return;\n }\n\n j = this.seekNext(end);\n\n for (i = begin; i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n if (j < (this.len ?? 0) && this.tests[i].test(this.buffer[j])) {\n this.buffer[i] = this.buffer[j];\n this.buffer[j] = this.getPlaceholder(j);\n } else break;\n\n j = this.seekNext(j);\n }\n }\n this.writeBuffer();\n if (!isNullOrUndefined(this.firstNonMaskPos)) {\n this.caret(Math.max(this.firstNonMaskPos, begin));\n }\n }\n\n private shiftR(pos: any) {\n let i: any;\n let c = this.getPlaceholder(pos);\n let j: any;\n let t: any;\n\n for (i = pos; i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n j = this.seekNext(i);\n t = this.buffer[i];\n this.buffer[i] = c;\n\n if (j < (this.len ?? 0) && this.tests[j].test(t)) {\n c = t;\n } else break;\n }\n }\n }\n\n private handleAndroidInput(e: any) {\n const curVal = this.input?.value;\n const pos = this.caret();\n\n if (isNullOrUndefined(pos?.begin)) return;\n\n if (this.oldVal && this.oldVal.length && this.oldVal.length > (curVal?.length ?? 0)) {\n // A deletion or backspace happened\n this.checkVal(true);\n while (pos?.begin > 0 && !this.tests?.[pos.begin - 1]) {\n pos.begin--;\n }\n if (pos.begin === 0) {\n while (pos.begin < (this.firstNonMaskPos ?? 0) && !this.tests?.[pos.begin]) {\n pos.begin++;\n }\n }\n\n setTimeout(() => {\n this.caret(pos.begin!, pos.begin!);\n if (this.isCompleted()) {\n const sentVal = curVal?.replace(this.slotChar, ''); // Limpa os caracteres placeholders extras caso ele esteja completo\n sentVal && this.updateCalendarValue(sentVal);\n }\n }, 0);\n } else {\n this.checkVal(true);\n\n while (pos.begin < (this.len ?? 0) && !this.tests?.[pos.begin]) {\n pos.begin++;\n }\n\n if (!isNullOrUndefined(pos.begin)) {\n setTimeout(() => {\n this.caret(pos.begin!, pos.begin!);\n if (this.isCompleted()) {\n const sentVal = curVal?.replace(this.slotChar, ''); // Limpa os caracteres placeholders extras caso ele esteja completo\n sentVal && this.updateCalendarValue(sentVal);\n }\n }, 0);\n }\n }\n }\n\n private updateCalendarValue(sentVal: string) {\n // TODO verificar\n const dateVal = <Date>this.host.parseValueFromString(sentVal);\n if (this.host.isSelectable(dateVal.getDate(), dateVal.getMonth(), dateVal.getFullYear(), false)) {\n this.host.updateModel(sentVal);\n this.host.updateUI();\n }\n }\n\n private clearBuffer(start: any, end: any) {\n let i;\n\n for (i = start; i < end && i < (this.len ?? 0); i++) {\n if (this.tests?.[i]) {\n this.buffer[i] = this.getPlaceholder(i);\n }\n }\n }\n\n private writeBuffer() {\n if (!isNullOrUndefined(this.input)) {\n this.input.value = this.buffer.join('');\n }\n }\n\n private createMaskFromDateFormat() {\n const calendar = this.host;\n let mask = this.autoClear ? '?' : '';\n\n if (!calendar.timeOnly) {\n let dateFormat = calendar.dateFormat;\n dateFormat = dateFormat?.replace(/y/g, 'yy');\n mask += dateFormat?.replace(/[^/*,.\\-+\\[\\]\\\\]/g, '9');\n if (calendar.showTime) {\n mask += ' ';\n }\n }\n\n if (calendar.showTime || calendar.timeOnly) {\n mask += '99:99';\n if (calendar.showSeconds) {\n mask += ':99';\n }\n }\n\n this._mask = mask;\n\n this.initMask();\n }\n\n isCompleted(): boolean {\n for (let i = this.firstNonMaskPos ?? 0; i <= this.lastRequiredNonMaskPos; i++) {\n if (this.tests?.[i] && this.buffer[i] === this.getPlaceholder(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n ngAfterViewChecked(): void {\n if (this.host.inputfieldViewChild && this.firstTime) {\n this.firstTime = false;\n this.setListeners();\n if (!isNullOrUndefined(this.input)) {\n this.input.type = 'tel';\n }\n }\n }\n\n ngOnDestroy(): void {\n if (this.focusListener) this.focusListener();\n if (this.blurListener) this.blurListener();\n if (this.keydownListener) this.keydownListener();\n if (this.keypressListener) this.keypressListener();\n if (this.inputListener) this.inputListener();\n if (this.pasteListener) this.pasteListener();\n }\n\n @HostListener('keydown', ['$event'])\n onKeydownEventTest(e: KeyboardEvent) {\n const { key } = e;\n if (key == 'Tab') {\n // Este código foi implementado para corrigir um problema no componente na v9\n // Deve ser removido assim que atualizarmos o PrimeNG para a v10\n const allFocusableElements = document.querySelectorAll(this.SELECTORS);\n let nextIsFocusable = false;\n let previousFocusable: string;\n let forceCloseModal = true;\n allFocusableElements.forEach((element) => {\n if (!e.shiftKey) {\n if (nextIsFocusable && element.id) {\n this.focusableElement(element.id, forceCloseModal);\n nextIsFocusable = false;\n e.preventDefault();\n return;\n }\n }\n\n let activeTagName = window.document.activeElement?.tagName;\n if (e.shiftKey && element.id && element.tagName === 'INPUT' && activeTagName == 'BUTTON') {\n previousFocusable = element.id;\n forceCloseModal = false;\n }\n\n if (element.id === this.host.inputId) {\n if (previousFocusable) {\n this.focusableElement(previousFocusable, forceCloseModal);\n e.preventDefault();\n forceCloseModal = true;\n return;\n }\n nextIsFocusable = true;\n } else if (e.shiftKey && element.id) {\n previousFocusable = element.id;\n }\n });\n }\n }\n\n public focusableElement(id: string, hide: boolean) {\n const htmlElement = window.document.getElementById(id);\n htmlElement?.focus();\n if (hide) {\n this.host.hideOverlay();\n }\n }\n}\n\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { CalendarMaskDirective } from './calendar-mask.directive';\n\n@NgModule({\n declarations: [CalendarMaskDirective],\n imports: [CommonModule],\n exports: [CalendarMaskDirective],\n})\nexport class CalendarMaskModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}