@ks89/angular-modal-gallery 8.0.0-beta.5 → 9.0.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 (161) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +20 -38
  3. package/LICENSE +1 -1
  4. package/README.md +36 -42
  5. package/esm2020/ks89-angular-modal-gallery.mjs +5 -0
  6. package/esm2020/lib/components/accessibility-default.mjs +41 -0
  7. package/esm2020/lib/components/accessible.component.mjs +130 -0
  8. package/esm2020/lib/components/carousel/carousel-previews/carousel-previews.component.mjs +462 -0
  9. package/esm2020/lib/components/carousel/carousel.component.mjs +747 -0
  10. package/esm2020/lib/components/components.mjs +50 -0
  11. package/esm2020/lib/components/current-image/current-image.component.mjs +616 -0
  12. package/esm2020/lib/components/current-image/loading-spinner/loading-spinner.component.mjs +80 -0
  13. package/esm2020/lib/components/dots/dots.component.mjs +127 -0
  14. package/esm2020/lib/components/modal-gallery/modal-gallery-ref.mjs +103 -0
  15. package/esm2020/lib/components/modal-gallery/modal-gallery.component.mjs +523 -0
  16. package/esm2020/lib/components/modal-gallery/modal-gallery.service.mjs +187 -0
  17. package/esm2020/lib/components/modal-gallery/modal-gallery.tokens.mjs +26 -0
  18. package/esm2020/lib/components/plain-gallery/plain-gallery.component.mjs +249 -0
  19. package/esm2020/lib/components/previews/previews.component.mjs +332 -0
  20. package/esm2020/lib/components/upper-buttons/upper-buttons-default.mjs +76 -0
  21. package/esm2020/lib/components/upper-buttons/upper-buttons.component.mjs +249 -0
  22. package/esm2020/lib/directives/a-tag-bg-image.directive.mjs +78 -0
  23. package/esm2020/lib/directives/click-outside.directive.mjs +91 -0
  24. package/esm2020/lib/directives/description.directive.mjs +98 -0
  25. package/esm2020/lib/directives/direction.directive.mjs +73 -0
  26. package/esm2020/lib/directives/directives.mjs +49 -0
  27. package/esm2020/lib/directives/fallback-image.directive.mjs +59 -0
  28. package/esm2020/lib/directives/keyboard-navigation.directive.mjs +58 -0
  29. package/esm2020/lib/directives/margin.directive.mjs +84 -0
  30. package/esm2020/lib/directives/max-size.directive.mjs +75 -0
  31. package/esm2020/lib/directives/size.directive.mjs +76 -0
  32. package/{esm2015/lib/directives/size.directive.js → esm2020/lib/directives/wrap.directive.mjs} +23 -22
  33. package/esm2020/lib/modal-gallery.module.mjs +94 -0
  34. package/esm2020/lib/model/accessibility.interface.mjs +25 -0
  35. package/esm2020/lib/model/action.enum.mjs +36 -0
  36. package/esm2020/lib/model/buttons-config.interface.mjs +62 -0
  37. package/esm2020/lib/model/carousel-config.interface.mjs +25 -0
  38. package/esm2020/lib/model/carousel-image-config.interface.mjs +25 -0
  39. package/esm2020/lib/model/carousel-preview-config.interface.mjs +25 -0
  40. package/{esm2015/lib/model/keyboard-service-config.interface.js → esm2020/lib/model/current-image-config.interface.mjs} +2 -2
  41. package/esm2020/lib/model/description.interface.mjs +33 -0
  42. package/{esm2015/lib/model/preview-config.interface.js → esm2020/lib/model/dots-config.interface.mjs} +2 -2
  43. package/esm2020/lib/model/image-internal.class.mjs +35 -0
  44. package/esm2020/lib/model/image.class.mjs +54 -0
  45. package/esm2020/lib/model/interaction-event.interface.mjs +2 -0
  46. package/esm2020/lib/model/keyboard-config.interface.mjs +25 -0
  47. package/esm2020/lib/model/keyboard-service-config.interface.mjs +25 -0
  48. package/esm2020/lib/model/keyboard.enum.mjs +35 -0
  49. package/esm2020/lib/model/lib-config.interface.mjs +25 -0
  50. package/esm2020/lib/model/loading-config.interface.mjs +37 -0
  51. package/{esm2015/lib/model/dots-config.interface.js → esm2020/lib/model/max-size.interface.mjs} +2 -2
  52. package/{esm2015/lib/model/carousel-preview-config.interface.js → esm2020/lib/model/modal-gallery-config.interface.mjs} +2 -2
  53. package/esm2020/lib/model/plain-gallery-config.interface.mjs +55 -0
  54. package/{esm2015/lib/model/image-internal.class.js → esm2020/lib/model/play-config.interface.mjs} +3 -13
  55. package/esm2020/lib/model/preview-config.interface.mjs +25 -0
  56. package/esm2020/lib/model/size.interface.mjs +25 -0
  57. package/{esm2015/lib/model/carousel-config.interface.js → esm2020/lib/model/slide-config.interface.mjs} +2 -2
  58. package/esm2020/lib/services/config.service.mjs +396 -0
  59. package/esm2020/lib/services/id-validator.service.mjs +71 -0
  60. package/esm2020/lib/services/keyboard.service.mjs +111 -0
  61. package/esm2020/lib/utils/image.util.mjs +48 -0
  62. package/esm2020/lib/utils/user-input.util.mjs +104 -0
  63. package/esm2020/public-api.mjs +42 -0
  64. package/fesm2015/ks89-angular-modal-gallery.mjs +5782 -0
  65. package/fesm2015/ks89-angular-modal-gallery.mjs.map +1 -0
  66. package/{fesm2015/ks89-angular-modal-gallery.js → fesm2020/ks89-angular-modal-gallery.mjs} +3046 -2947
  67. package/fesm2020/ks89-angular-modal-gallery.mjs.map +1 -0
  68. package/ks89-angular-modal-gallery.d.ts +1 -24
  69. package/lib/components/accessible.component.d.ts +5 -2
  70. package/lib/components/carousel/carousel-previews/carousel-previews.component.d.ts +7 -11
  71. package/lib/components/carousel/carousel.component.d.ts +28 -67
  72. package/lib/components/current-image/current-image.component.d.ts +10 -4
  73. package/lib/components/current-image/loading-spinner/loading-spinner.component.d.ts +3 -0
  74. package/lib/components/dots/dots.component.d.ts +7 -0
  75. package/lib/components/modal-gallery/modal-gallery-ref.d.ts +35 -0
  76. package/lib/components/modal-gallery/modal-gallery.component.d.ts +58 -50
  77. package/lib/components/modal-gallery/modal-gallery.service.d.ts +60 -1
  78. package/lib/components/plain-gallery/plain-gallery.component.d.ts +18 -9
  79. package/lib/components/previews/previews.component.d.ts +9 -0
  80. package/lib/components/upper-buttons/upper-buttons.component.d.ts +8 -1
  81. package/lib/directives/a-tag-bg-image.directive.d.ts +3 -0
  82. package/lib/directives/click-outside.directive.d.ts +3 -0
  83. package/lib/directives/description.directive.d.ts +3 -0
  84. package/lib/directives/direction.directive.d.ts +3 -0
  85. package/lib/directives/fallback-image.directive.d.ts +6 -0
  86. package/lib/directives/keyboard-navigation.directive.d.ts +4 -1
  87. package/lib/directives/margin.directive.d.ts +3 -0
  88. package/lib/directives/max-size.directive.d.ts +3 -0
  89. package/lib/directives/size.directive.d.ts +5 -2
  90. package/lib/directives/wrap.directive.d.ts +4 -1
  91. package/lib/modal-gallery.module.d.ts +28 -0
  92. package/lib/model/carousel-config.interface.d.ts +0 -1
  93. package/lib/model/keyboard-config.interface.d.ts +4 -4
  94. package/lib/model/keyboard.enum.d.ts +11 -8
  95. package/lib/model/lib-config.interface.d.ts +20 -7
  96. package/lib/model/modal-gallery-config.interface.d.ts +2 -2
  97. package/lib/model/plain-gallery-config.interface.d.ts +1 -9
  98. package/lib/services/config.service.d.ts +3 -0
  99. package/lib/services/id-validator.service.d.ts +5 -1
  100. package/lib/services/keyboard.service.d.ts +5 -2
  101. package/lib/utils/user-input.util.d.ts +35 -26
  102. package/package.json +28 -16
  103. package/public-api.d.ts +2 -2
  104. package/bundles/ks89-angular-modal-gallery.umd.js +0 -5906
  105. package/bundles/ks89-angular-modal-gallery.umd.js.map +0 -1
  106. package/bundles/ks89-angular-modal-gallery.umd.min.js +0 -16
  107. package/bundles/ks89-angular-modal-gallery.umd.min.js.map +0 -1
  108. package/esm2015/ks89-angular-modal-gallery.js +0 -29
  109. package/esm2015/lib/components/accessibility-default.js +0 -41
  110. package/esm2015/lib/components/accessible.component.js +0 -127
  111. package/esm2015/lib/components/carousel/carousel-previews/carousel-previews.component.js +0 -466
  112. package/esm2015/lib/components/carousel/carousel.component.js +0 -772
  113. package/esm2015/lib/components/components.js +0 -50
  114. package/esm2015/lib/components/current-image/current-image.component.js +0 -590
  115. package/esm2015/lib/components/current-image/loading-spinner/loading-spinner.component.js +0 -80
  116. package/esm2015/lib/components/dots/dots.component.js +0 -127
  117. package/esm2015/lib/components/modal-gallery/modal-gallery-ref.js +0 -45
  118. package/esm2015/lib/components/modal-gallery/modal-gallery.component.js +0 -534
  119. package/esm2015/lib/components/modal-gallery/modal-gallery.service.js +0 -135
  120. package/esm2015/lib/components/modal-gallery/modal-gallery.tokens.js +0 -3
  121. package/esm2015/lib/components/plain-gallery/plain-gallery.component.js +0 -243
  122. package/esm2015/lib/components/previews/previews.component.js +0 -331
  123. package/esm2015/lib/components/upper-buttons/upper-buttons-default.js +0 -76
  124. package/esm2015/lib/components/upper-buttons/upper-buttons.component.js +0 -256
  125. package/esm2015/lib/directives/a-tag-bg-image.directive.js +0 -78
  126. package/esm2015/lib/directives/click-outside.directive.js +0 -85
  127. package/esm2015/lib/directives/description.directive.js +0 -99
  128. package/esm2015/lib/directives/direction.directive.js +0 -73
  129. package/esm2015/lib/directives/directives.js +0 -49
  130. package/esm2015/lib/directives/fallback-image.directive.js +0 -54
  131. package/esm2015/lib/directives/keyboard-navigation.directive.js +0 -52
  132. package/esm2015/lib/directives/margin.directive.js +0 -82
  133. package/esm2015/lib/directives/max-size.directive.js +0 -76
  134. package/esm2015/lib/directives/wrap.directive.js +0 -74
  135. package/esm2015/lib/modal-gallery.module.js +0 -64
  136. package/esm2015/lib/model/accessibility.interface.js +0 -25
  137. package/esm2015/lib/model/action.enum.js +0 -36
  138. package/esm2015/lib/model/buttons-config.interface.js +0 -66
  139. package/esm2015/lib/model/carousel-image-config.interface.js +0 -25
  140. package/esm2015/lib/model/current-image-config.interface.js +0 -25
  141. package/esm2015/lib/model/description.interface.js +0 -33
  142. package/esm2015/lib/model/image.class.js +0 -54
  143. package/esm2015/lib/model/interaction-event.interface.js +0 -2
  144. package/esm2015/lib/model/keyboard-config.interface.js +0 -25
  145. package/esm2015/lib/model/keyboard.enum.js +0 -35
  146. package/esm2015/lib/model/lib-config.interface.js +0 -25
  147. package/esm2015/lib/model/loading-config.interface.js +0 -37
  148. package/esm2015/lib/model/max-size.interface.js +0 -25
  149. package/esm2015/lib/model/modal-gallery-config.interface.js +0 -25
  150. package/esm2015/lib/model/plain-gallery-config.interface.js +0 -64
  151. package/esm2015/lib/model/play-config.interface.js +0 -25
  152. package/esm2015/lib/model/size.interface.js +0 -25
  153. package/esm2015/lib/model/slide-config.interface.js +0 -25
  154. package/esm2015/lib/services/config.service.js +0 -392
  155. package/esm2015/lib/services/id-validator.service.js +0 -71
  156. package/esm2015/lib/services/keyboard.service.js +0 -108
  157. package/esm2015/lib/utils/image.util.js +0 -48
  158. package/esm2015/lib/utils/user-input.util.js +0 -95
  159. package/esm2015/public-api.js +0 -46
  160. package/fesm2015/ks89-angular-modal-gallery.js.map +0 -1
  161. package/ks89-angular-modal-gallery.metadata.json +0 -1
@@ -1,25 +0,0 @@
1
- /*
2
- The MIT License (MIT)
3
-
4
- Copyright (c) 2017-2020 Stefano Cappa (Ks89)
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in all
14
- copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- SOFTWARE.
23
- */
24
- export {};
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6ZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMva3M4OS9hbmd1bGFyLW1vZGFsLWdhbGxlcnkvc3JjLyIsInNvdXJjZXMiOlsibGliL21vZGVsL3NpemUuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcblxuIENvcHlyaWdodCAoYykgMjAxNy0yMDIwIFN0ZWZhbm8gQ2FwcGEgKEtzODkpXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTiBJTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cblxuLyoqXG4gKiBJbnRlcmZhY2UgYFNpemVgIHRvIGNvbmZpZ3VyZSB0aGUgc2l6ZSBiYXNlZCBvbiB3aWR0aCBhbmQgaGVpZ2h0LlxuICogVGhleSBjYW4gYmUgcGl4ZWxzLCBwZXJjZW50YWdlcyBvciBhbHNvICdhdXRvJy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXplIHtcbiAgd2lkdGg6IHN0cmluZztcbiAgaGVpZ2h0OiBzdHJpbmc7XG59XG4iXX0=
@@ -1,25 +0,0 @@
1
- /*
2
- The MIT License (MIT)
3
-
4
- Copyright (c) 2017-2020 Stefano Cappa (Ks89)
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in all
14
- copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- SOFTWARE.
23
- */
24
- export {};
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtY29uZmlnLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy9rczg5L2FuZ3VsYXItbW9kYWwtZ2FsbGVyeS9zcmMvIiwic291cmNlcyI6WyJsaWIvbW9kZWwvc2xpZGUtY29uZmlnLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBTdGVmYW5vIENhcHBhIChLczg5KVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04gSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IFNpemUgfSBmcm9tICcuL3NpemUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBsYXlDb25maWcgfSBmcm9tICcuL3BsYXktY29uZmlnLmludGVyZmFjZSc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGBTbGlkZUNvbmZpZ2AgdG8gY29uZmlndXJlIHNsaWRpbmcgZmVhdHVyZXMgb2YgbW9kYWwgZ2FsbGVyeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGlkZUNvbmZpZyB7XG4gIGluZmluaXRlPzogYm9vbGVhbjtcbiAgcGxheUNvbmZpZz86IFBsYXlDb25maWc7XG4gIHNpZGVQcmV2aWV3cz86IFNpZGVQcmV2aWV3c0NvbmZpZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgYFNpZGVQcmV2aWV3c0NvbmZpZ2AgdG8gY29uZmlndXJlIHNsaWRpbmcgZmVhdHVyZXMgb2YgcHJldmlld3MgaW4gbW9kYWwgZ2FsbGVyeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWRlUHJldmlld3NDb25maWcge1xuICBzaG93OiBib29sZWFuO1xuICBzaXplOiBTaXplO1xufVxuIl19
@@ -1,392 +0,0 @@
1
- /*
2
- The MIT License (MIT)
3
-
4
- Copyright (c) 2017-2020 Stefano Cappa (Ks89)
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in all
14
- copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- SOFTWARE.
23
- */
24
- import { Injectable } from '@angular/core';
25
- import { KS_DEFAULT_ACCESSIBILITY_CONFIG } from '../components/accessibility-default';
26
- import { ButtonsStrategy } from '../model/buttons-config.interface';
27
- import { AdvancedLayout, GridLayout, LineLayout, PlainGalleryStrategy } from '../model/plain-gallery-config.interface';
28
- import { LoadingType } from '../model/loading-config.interface';
29
- import { DescriptionStrategy } from '../model/description.interface';
30
- export const DEFAULT_PREVIEW_SIZE = { height: '50px', width: 'auto' };
31
- export const DEFAULT_LAYOUT = new LineLayout(DEFAULT_PREVIEW_SIZE, { length: -1, wrap: false }, 'flex-start');
32
- export const DEFAULT_PLAIN_CONFIG = {
33
- strategy: PlainGalleryStrategy.ROW,
34
- layout: DEFAULT_LAYOUT,
35
- advanced: { aTags: false, additionalBackground: '50% 50%/cover' }
36
- };
37
- export const DEFAULT_LOADING = { enable: true, type: LoadingType.STANDARD };
38
- export const DEFAULT_DESCRIPTION_STYLE = {
39
- bgColor: 'rgba(0, 0, 0, .5)',
40
- textColor: 'white',
41
- marginTop: '0px',
42
- marginBottom: '0px',
43
- marginLeft: '0px',
44
- marginRight: '0px'
45
- };
46
- export const DEFAULT_DESCRIPTION = {
47
- strategy: DescriptionStrategy.ALWAYS_VISIBLE,
48
- imageText: 'Image ',
49
- numberSeparator: '/',
50
- beforeTextDescription: ' - ',
51
- style: DEFAULT_DESCRIPTION_STYLE
52
- };
53
- export const DEFAULT_CAROUSEL_DESCRIPTION = {
54
- strategy: DescriptionStrategy.ALWAYS_HIDDEN,
55
- imageText: 'Image ',
56
- numberSeparator: '/',
57
- beforeTextDescription: ' - ',
58
- style: DEFAULT_DESCRIPTION_STYLE
59
- };
60
- export const DEFAULT_CURRENT_IMAGE_CONFIG = {
61
- navigateOnClick: true,
62
- loadingConfig: DEFAULT_LOADING,
63
- description: DEFAULT_DESCRIPTION,
64
- downloadable: false,
65
- invertSwipe: false
66
- };
67
- export const DEFAULT_CAROUSEL_IMAGE_CONFIG = {
68
- description: DEFAULT_CAROUSEL_DESCRIPTION,
69
- invertSwipe: false
70
- };
71
- export const DEFAULT_CURRENT_CAROUSEL_CONFIG = {
72
- maxWidth: '100%',
73
- maxHeight: '400px',
74
- showArrows: true,
75
- objectFit: 'cover',
76
- keyboardEnable: true,
77
- modalGalleryEnable: false,
78
- legacyIE11Mode: false
79
- };
80
- export const DEFAULT_CURRENT_CAROUSEL_PLAY = {
81
- autoPlay: true,
82
- interval: 5000,
83
- pauseOnHover: true
84
- };
85
- export const DEFAULT_CAROUSEL_BREAKPOINTS = { xSmall: 100, small: 100, medium: 150, large: 200, xLarge: 200 };
86
- export const DEFAULT_CAROUSEL_PREVIEWS_CONFIG = {
87
- visible: true,
88
- number: 4,
89
- arrows: true,
90
- clickable: true,
91
- width: 100 / 4 + '%',
92
- maxHeight: '200px',
93
- breakpoints: DEFAULT_CAROUSEL_BREAKPOINTS
94
- };
95
- export const DEFAULT_KEYBOARD_SERVICE_CONFIG = {
96
- shortcuts: ['ctrl+s', 'meta+s'],
97
- disableSsrWorkaround: false
98
- };
99
- export const DEFAULT_SLIDE_CONFIG = {
100
- infinite: false,
101
- playConfig: { autoPlay: false, interval: 5000, pauseOnHover: true },
102
- sidePreviews: { show: true, size: { width: '100px', height: 'auto' } }
103
- };
104
- export const DEFAULT_PREVIEW_CONFIG = {
105
- visible: true,
106
- number: 3,
107
- arrows: true,
108
- clickable: true,
109
- // alwaysCenter: false, // TODO still not implemented
110
- size: DEFAULT_PREVIEW_SIZE
111
- };
112
- const DEFAULT_CONFIG = Object.freeze({
113
- slideConfig: DEFAULT_SLIDE_CONFIG,
114
- accessibilityConfig: KS_DEFAULT_ACCESSIBILITY_CONFIG,
115
- previewConfig: DEFAULT_PREVIEW_CONFIG,
116
- buttonsConfig: { visible: true, strategy: ButtonsStrategy.DEFAULT },
117
- dotsConfig: { visible: true },
118
- plainGalleryConfig: DEFAULT_PLAIN_CONFIG,
119
- currentImageConfig: DEFAULT_CURRENT_IMAGE_CONFIG,
120
- keyboardConfig: undefined,
121
- carouselConfig: DEFAULT_CURRENT_CAROUSEL_CONFIG,
122
- carouselImageConfig: DEFAULT_CAROUSEL_IMAGE_CONFIG,
123
- carouselPreviewsConfig: DEFAULT_CAROUSEL_PREVIEWS_CONFIG,
124
- carouselPlayConfig: DEFAULT_CURRENT_CAROUSEL_PLAY,
125
- carouselDotsConfig: { visible: true },
126
- enableCloseOutside: true,
127
- keyboardServiceConfig: DEFAULT_KEYBOARD_SERVICE_CONFIG
128
- });
129
- /**
130
- * Service to handle library configuration in a unique place
131
- */
132
- export class ConfigService {
133
- constructor() {
134
- this.configMap = new Map();
135
- }
136
- getConfig(id) {
137
- this.initIfNotExists(id);
138
- return this.configMap.get(id);
139
- }
140
- setConfig(id, obj) {
141
- this.initIfNotExists(id);
142
- if (!obj) {
143
- return;
144
- }
145
- if (!DEFAULT_CONFIG ||
146
- !DEFAULT_CONFIG.slideConfig ||
147
- !DEFAULT_CONFIG.slideConfig.sidePreviews ||
148
- !DEFAULT_CONFIG.previewConfig ||
149
- !DEFAULT_CONFIG.previewConfig.size ||
150
- !DEFAULT_CONFIG.previewConfig.number ||
151
- !DEFAULT_CONFIG.plainGalleryConfig ||
152
- !DEFAULT_CONFIG.currentImageConfig ||
153
- !DEFAULT_CONFIG.currentImageConfig ||
154
- !DEFAULT_CONFIG.currentImageConfig.description ||
155
- !DEFAULT_CONFIG.carouselImageConfig ||
156
- !DEFAULT_CONFIG.carouselImageConfig.description ||
157
- !DEFAULT_CONFIG.carouselPreviewsConfig ||
158
- !DEFAULT_CONFIG.carouselPreviewsConfig.breakpoints ||
159
- !DEFAULT_CAROUSEL_PREVIEWS_CONFIG.number) {
160
- throw new Error('Internal library error - DEFAULT_CONFIG must be fully initialized!!!');
161
- }
162
- const newConfig = Object.assign({}, this.configMap.get(id));
163
- if (obj.slideConfig) {
164
- let playConfig;
165
- let sidePreviews;
166
- let size;
167
- if (obj.slideConfig.playConfig) {
168
- playConfig = Object.assign({}, DEFAULT_CONFIG.slideConfig.playConfig, obj.slideConfig.playConfig);
169
- }
170
- else {
171
- playConfig = DEFAULT_CONFIG.slideConfig.playConfig;
172
- }
173
- if (obj.slideConfig.sidePreviews) {
174
- if (obj.slideConfig.sidePreviews.size) {
175
- size = Object.assign({}, DEFAULT_CONFIG.slideConfig.sidePreviews.size, obj.slideConfig.sidePreviews.size);
176
- }
177
- else {
178
- size = DEFAULT_CONFIG.slideConfig.sidePreviews.size;
179
- }
180
- sidePreviews = Object.assign({}, DEFAULT_CONFIG.slideConfig.sidePreviews, obj.slideConfig.sidePreviews);
181
- }
182
- else {
183
- sidePreviews = DEFAULT_CONFIG.slideConfig.sidePreviews;
184
- size = DEFAULT_CONFIG.slideConfig.sidePreviews.size;
185
- }
186
- const newSlideConfig = Object.assign({}, DEFAULT_CONFIG.slideConfig, obj.slideConfig);
187
- newSlideConfig.playConfig = playConfig;
188
- newSlideConfig.sidePreviews = sidePreviews;
189
- newSlideConfig.sidePreviews.size = size;
190
- newConfig.slideConfig = newSlideConfig;
191
- }
192
- if (obj.accessibilityConfig) {
193
- newConfig.accessibilityConfig = Object.assign({}, DEFAULT_CONFIG.accessibilityConfig, obj.accessibilityConfig);
194
- }
195
- if (obj.previewConfig) {
196
- let size;
197
- let num;
198
- if (obj.previewConfig.size) {
199
- size = Object.assign({}, DEFAULT_CONFIG.previewConfig.size, obj.previewConfig.size);
200
- }
201
- else {
202
- size = DEFAULT_CONFIG.previewConfig.size;
203
- }
204
- if (obj.previewConfig.number) {
205
- if (obj.previewConfig.number <= 0) {
206
- // if number is <= 0 reset to default
207
- num = DEFAULT_CONFIG.previewConfig.number;
208
- }
209
- else {
210
- num = obj.previewConfig.number;
211
- }
212
- }
213
- else {
214
- num = DEFAULT_CONFIG.previewConfig.number;
215
- }
216
- const newPreviewConfig = Object.assign({}, DEFAULT_CONFIG.previewConfig, obj.previewConfig);
217
- newPreviewConfig.size = size;
218
- newPreviewConfig.number = num;
219
- newConfig.previewConfig = newPreviewConfig;
220
- }
221
- if (obj.buttonsConfig) {
222
- newConfig.buttonsConfig = Object.assign({}, DEFAULT_CONFIG.buttonsConfig, obj.buttonsConfig);
223
- }
224
- if (obj.dotsConfig) {
225
- newConfig.dotsConfig = Object.assign({}, DEFAULT_CONFIG.dotsConfig, obj.dotsConfig);
226
- }
227
- if (obj.plainGalleryConfig) {
228
- let advanced;
229
- let layout;
230
- if (obj.plainGalleryConfig.advanced) {
231
- advanced = Object.assign({}, DEFAULT_CONFIG.plainGalleryConfig.advanced, obj.plainGalleryConfig.advanced);
232
- }
233
- else {
234
- advanced = DEFAULT_CONFIG.plainGalleryConfig.advanced;
235
- }
236
- if (obj.plainGalleryConfig.layout) {
237
- // it isn't mandatory to use assign, because obj.plainGalleryConfig.layout is an instance of class (LineaLayout, GridLayout, AdvancedLayout)
238
- layout = obj.plainGalleryConfig.layout;
239
- }
240
- else {
241
- layout = DEFAULT_CONFIG.plainGalleryConfig.layout;
242
- }
243
- const newPlainGalleryConfig = Object.assign({}, DEFAULT_CONFIG.plainGalleryConfig, obj.plainGalleryConfig);
244
- newPlainGalleryConfig.layout = layout;
245
- newPlainGalleryConfig.advanced = advanced;
246
- newConfig.plainGalleryConfig = initPlainGalleryConfig(newPlainGalleryConfig);
247
- }
248
- if (obj.currentImageConfig) {
249
- let loading;
250
- let description;
251
- let descriptionStyle;
252
- if (obj.currentImageConfig.loadingConfig) {
253
- loading = Object.assign({}, DEFAULT_CONFIG.currentImageConfig.loadingConfig, obj.currentImageConfig.loadingConfig);
254
- }
255
- else {
256
- loading = DEFAULT_CONFIG.currentImageConfig.loadingConfig;
257
- }
258
- if (obj.currentImageConfig.description) {
259
- description = Object.assign({}, DEFAULT_CONFIG.currentImageConfig.description, obj.currentImageConfig.description);
260
- if (obj.currentImageConfig.description.style) {
261
- descriptionStyle = Object.assign({}, DEFAULT_CONFIG.currentImageConfig.description.style, obj.currentImageConfig.description.style);
262
- }
263
- else {
264
- descriptionStyle = DEFAULT_CONFIG.currentImageConfig.description.style;
265
- }
266
- }
267
- else {
268
- description = DEFAULT_CONFIG.currentImageConfig.description;
269
- descriptionStyle = DEFAULT_CONFIG.currentImageConfig.description.style;
270
- }
271
- const newCurrentImageConfig = Object.assign({}, DEFAULT_CONFIG.currentImageConfig, obj.currentImageConfig);
272
- newCurrentImageConfig.loadingConfig = loading;
273
- newCurrentImageConfig.description = description;
274
- newCurrentImageConfig.description.style = descriptionStyle;
275
- newConfig.currentImageConfig = newCurrentImageConfig;
276
- }
277
- if (obj.keyboardConfig) {
278
- newConfig.keyboardConfig = Object.assign({}, DEFAULT_CONFIG.keyboardConfig, obj.keyboardConfig);
279
- }
280
- // carousel
281
- if (obj.carouselConfig) {
282
- newConfig.carouselConfig = Object.assign({}, DEFAULT_CONFIG.carouselConfig, obj.carouselConfig);
283
- }
284
- if (obj.carouselImageConfig) {
285
- let description;
286
- let descriptionStyle;
287
- if (obj.carouselImageConfig.description) {
288
- description = Object.assign({}, DEFAULT_CONFIG.carouselImageConfig.description, obj.carouselImageConfig.description);
289
- if (obj.carouselImageConfig.description.style) {
290
- descriptionStyle = Object.assign({}, DEFAULT_CONFIG.carouselImageConfig.description.style, obj.carouselImageConfig.description.style);
291
- }
292
- else {
293
- descriptionStyle = DEFAULT_CONFIG.carouselImageConfig.description.style;
294
- }
295
- }
296
- else {
297
- description = DEFAULT_CONFIG.carouselImageConfig.description;
298
- descriptionStyle = DEFAULT_CONFIG.carouselImageConfig.description.style;
299
- }
300
- const newCarouselImageConfig = Object.assign({}, DEFAULT_CONFIG.carouselImageConfig, obj.carouselImageConfig);
301
- newCarouselImageConfig.description = description;
302
- newCarouselImageConfig.description.style = descriptionStyle;
303
- newConfig.carouselImageConfig = newCarouselImageConfig;
304
- }
305
- if (obj.carouselPlayConfig) {
306
- // check values
307
- if (obj.carouselPlayConfig.interval <= 0) {
308
- throw new Error(`Carousel's interval must be a number >= 0`);
309
- }
310
- newConfig.carouselPlayConfig = Object.assign({}, DEFAULT_CONFIG.carouselPlayConfig, obj.carouselPlayConfig);
311
- }
312
- if (obj.carouselPreviewsConfig) {
313
- // check values
314
- let num;
315
- let breakpoints;
316
- if (!obj.carouselPreviewsConfig.number || obj.carouselPreviewsConfig.number <= 0) {
317
- num = DEFAULT_CAROUSEL_PREVIEWS_CONFIG.number;
318
- }
319
- else {
320
- num = obj.carouselPreviewsConfig.number;
321
- }
322
- if (obj.carouselPreviewsConfig.breakpoints) {
323
- breakpoints = Object.assign({}, DEFAULT_CONFIG.carouselPreviewsConfig.breakpoints, obj.carouselPreviewsConfig.breakpoints);
324
- }
325
- else {
326
- breakpoints = DEFAULT_CONFIG.carouselPreviewsConfig.breakpoints;
327
- }
328
- newConfig.carouselPreviewsConfig = Object.assign({}, DEFAULT_CONFIG.carouselPreviewsConfig, obj.carouselPreviewsConfig);
329
- newConfig.carouselPreviewsConfig.number = num;
330
- newConfig.carouselPreviewsConfig.breakpoints = breakpoints;
331
- // Init preview image width based on the number of previews in PreviewConfig
332
- // Don't move this line above, because I need to be sure that both configPreview.number
333
- // and configPreview.size are initialized
334
- newConfig.carouselPreviewsConfig.width = 100 / newConfig.carouselPreviewsConfig.number + '%';
335
- }
336
- if (obj.carouselDotsConfig) {
337
- newConfig.carouselDotsConfig = Object.assign({}, DEFAULT_CONFIG.carouselDotsConfig, obj.carouselDotsConfig);
338
- }
339
- if (obj.enableCloseOutside === undefined) {
340
- newConfig.enableCloseOutside = DEFAULT_CONFIG.enableCloseOutside;
341
- }
342
- else {
343
- newConfig.enableCloseOutside = obj.enableCloseOutside;
344
- }
345
- if (obj.keyboardServiceConfig) {
346
- newConfig.keyboardServiceConfig = Object.assign({}, DEFAULT_KEYBOARD_SERVICE_CONFIG, obj.keyboardServiceConfig);
347
- }
348
- this.configMap.set(id, newConfig);
349
- }
350
- initIfNotExists(id) {
351
- if (!this.configMap.has(id)) {
352
- this.configMap.set(id, DEFAULT_CONFIG);
353
- }
354
- }
355
- }
356
- ConfigService.decorators = [
357
- { type: Injectable }
358
- ];
359
- /**
360
- * Function to build and return a `PlainGalleryConfig` object, proving also default values and validating the input object.
361
- * @param plainGalleryConfig object with the config requested by user
362
- * @returns PlainGalleryConfig the plain gallery configuration
363
- * @throws an Error if layout and strategy aren't compatible
364
- */
365
- function initPlainGalleryConfig(plainGalleryConfig) {
366
- const newPlayGalleryConfig = Object.assign({}, DEFAULT_CONFIG.plainGalleryConfig, plainGalleryConfig);
367
- if (newPlayGalleryConfig.layout instanceof LineLayout) {
368
- if (newPlayGalleryConfig.strategy !== PlainGalleryStrategy.ROW && newPlayGalleryConfig.strategy !== PlainGalleryStrategy.COLUMN) {
369
- throw new Error('LineLayout requires either ROW or COLUMN strategy');
370
- }
371
- if (!newPlayGalleryConfig.layout || !newPlayGalleryConfig.layout.breakConfig) {
372
- throw new Error('Both layout and breakConfig must be valid');
373
- }
374
- }
375
- if (newPlayGalleryConfig.layout instanceof GridLayout) {
376
- if (newPlayGalleryConfig.strategy !== PlainGalleryStrategy.GRID) {
377
- throw new Error('GridLayout requires GRID strategy');
378
- }
379
- if (!newPlayGalleryConfig.layout || !newPlayGalleryConfig.layout.breakConfig) {
380
- throw new Error('Both layout and breakConfig must be valid');
381
- }
382
- // force wrap for grid layout
383
- newPlayGalleryConfig.layout.breakConfig.wrap = true;
384
- }
385
- if (newPlayGalleryConfig.layout instanceof AdvancedLayout) {
386
- if (newPlayGalleryConfig.strategy !== PlainGalleryStrategy.CUSTOM) {
387
- throw new Error('AdvancedLayout requires CUSTOM strategy');
388
- }
389
- }
390
- return newPlayGalleryConfig;
391
- }
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMva3M4OS9hbmd1bGFyLW1vZGFsLWdhbGxlcnkvc3JjLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUd0RixPQUFPLEVBQWlCLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBc0Isb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzSSxPQUFPLEVBQWlCLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQy9FLE9BQU8sRUFBZSxtQkFBbUIsRUFBb0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQU9wRyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZSxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDMUgsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQXVCO0lBQ3RELFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHO0lBQ2xDLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFO0NBQ2xFLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxlQUFl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LE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztTQUN0RTtRQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUM5RDtLQUNGO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLFlBQVksVUFBVSxFQUFFO1FBQ3JELElBQUksb0JBQW9CLENBQUMsUUFBUSxLQUFLLG9CQUFvQixDQUFDLElBQUksRUFBRTtZQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCw2QkFBNkI7UUFDN0Isb0JBQW9CLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ3JEO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLFlBQVksY0FBYyxFQUFFO1FBQ3pELElBQUksb0JBQW9CLENBQUMsUUFBUSxLQUFLLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtZQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDNUQ7S0FDRjtJQUNELE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBTdGVmYW5vIENhcHBhIChLczg5KVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04gSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNpZGVQcmV2aWV3c0NvbmZpZywgU2xpZGVDb25maWcgfSBmcm9tICcuLi9tb2RlbC9zbGlkZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBsYXlDb25maWcgfSBmcm9tICcuLi9tb2RlbC9wbGF5LWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS1NfREVGQVVMVF9BQ0NFU1NJQklMSVRZX0NPTkZJRyB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWNjZXNzaWJpbGl0eS1kZWZhdWx0JztcbmltcG9ydCB7IFByZXZpZXdDb25maWcgfSBmcm9tICcuLi9tb2RlbC9wcmV2aWV3LWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2l6ZSB9IGZyb20gJy4uL21vZGVsL3NpemUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEJ1dHRvbnNDb25maWcsIEJ1dHRvbnNTdHJhdGVneSB9IGZyb20gJy4uL21vZGVsL2J1dHRvbnMtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEb3RzQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWwvZG90cy1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEFkdmFuY2VkTGF5b3V0LCBHcmlkTGF5b3V0LCBMaW5lTGF5b3V0LCBQbGFpbkdhbGxlcnlDb25maWcsIFBsYWluR2FsbGVyeVN0cmF0ZWd5IH0gZnJvbSAnLi4vbW9kZWwvcGxhaW4tZ2FsbGVyeS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEN1cnJlbnRJbWFnZUNvbmZpZyB9IGZyb20gJy4uL21vZGVsL2N1cnJlbnQtaW1hZ2UtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMb2FkaW5nQ29uZmlnLCBMb2FkaW5nVHlwZSB9IGZyb20gJy4uL21vZGVsL2xvYWRpbmctY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbiwgRGVzY3JpcHRpb25TdHJhdGVneSwgRGVzY3JpcHRpb25TdHlsZSB9IGZyb20gJy4uL21vZGVsL2Rlc2NyaXB0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDYXJvdXNlbENvbmZpZyB9IGZyb20gJy4uL21vZGVsL2Nhcm91c2VsLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2Fyb3VzZWxJbWFnZUNvbmZpZyB9IGZyb20gJy4uL21vZGVsL2Nhcm91c2VsLWltYWdlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQnJlYWtwb2ludHNDb25maWcsIENhcm91c2VsUHJldmlld0NvbmZpZyB9IGZyb20gJy4uL21vZGVsL2Nhcm91c2VsLXByZXZpZXctY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLZXlib2FyZFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi9tb2RlbC9rZXlib2FyZC1zZXJ2aWNlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGliQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWwvbGliLWNvbmZpZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9QUkVWSUVXX1NJWkU6IFNpemUgPSB7IGhlaWdodDogJzUwcHgnLCB3aWR0aDogJ2F1dG8nIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9MQVlPVVQ6IExpbmVMYXlvdXQgPSBuZXcgTGluZUxheW91dChERUZBVUxUX1BSRVZJRVdfU0laRSwgeyBsZW5ndGg6IC0xLCB3cmFwOiBmYWxzZSB9LCAnZmxleC1zdGFydCcpO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExBSU5fQ09ORklHOiBQbGFpbkdhbGxlcnlDb25maWcgPSB7XG4gIHN0cmF0ZWd5OiBQbGFpbkdhbGxlcnlTdHJhdGVneS5ST1csXG4gIGxheW91dDogREVGQVVMVF9MQVlPVVQsXG4gIGFkdmFuY2VkOiB7IGFUYWdzOiBmYWxzZSwgYWRkaXRpb25hbEJhY2tncm91bmQ6ICc1MCUgNTAlL2NvdmVyJyB9XG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTE9BRElORzogTG9hZGluZ0NvbmZpZyA9IHsgZW5hYmxlOiB0cnVlLCB0eXBlOiBMb2FkaW5nVHlwZS5TVEFOREFSRCB9O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfREVTQ1JJUFRJT05fU1RZTEU6IERlc2NyaXB0aW9uU3R5bGUgPSB7XG4gIGJnQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIC41KScsXG4gIHRleHRDb2xvcjogJ3doaXRlJyxcbiAgbWFyZ2luVG9wOiAnMHB4JyxcbiAgbWFyZ2luQm90dG9tOiAnMHB4JyxcbiAgbWFyZ2luTGVmdDogJzBweCcsXG4gIG1hcmdpblJpZ2h0OiAnMHB4J1xufTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0RFU0NSSVBUSU9OOiBEZXNjcmlwdGlvbiA9IHtcbiAgc3RyYXRlZ3k6IERlc2NyaXB0aW9uU3RyYXRlZ3kuQUxXQVlTX1ZJU0lCTEUsXG4gIGltYWdlVGV4dDogJ0ltYWdlICcsXG4gIG51bWJlclNlcGFyYXRvcjogJy8nLFxuICBiZWZvcmVUZXh0RGVzY3JpcHRpb246ICcgLSAnLFxuICBzdHlsZTogREVGQVVMVF9ERVNDUklQVElPTl9TVFlMRVxufTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0NBUk9VU0VMX0RFU0NSSVBUSU9OOiBEZXNjcmlwdGlvbiA9IHtcbiAgc3RyYXRlZ3k6IERlc2NyaXB0aW9uU3RyYXRlZ3kuQUxXQVlTX0hJRERFTixcbiAgaW1hZ2VUZXh0OiAnSW1hZ2UgJyxcbiAgbnVtYmVyU2VwYXJhdG9yOiAnLycsXG4gIGJlZm9yZVRleHREZXNjcmlwdGlvbjogJyAtICcsXG4gIHN0eWxlOiBERUZBVUxUX0RFU0NSSVBUSU9OX1NUWUxFXG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ1VSUkVOVF9JTUFHRV9DT05GSUc6IEN1cnJlbnRJbWFnZUNvbmZpZyA9IHtcbiAgbmF2aWdhdGVPbkNsaWNrOiB0cnVlLFxuICBsb2FkaW5nQ29uZmlnOiBERUZBVUxUX0xPQURJTkcsXG4gIGRlc2NyaXB0aW9uOiBERUZBVUxUX0RFU0NSSVBUSU9OLFxuICBkb3dubG9hZGFibGU6IGZhbHNlLFxuICBpbnZlcnRTd2lwZTogZmFsc2Vcbn07XG5leHBvcnQgY29uc3QgREVGQVVMVF9DQVJPVVNFTF9JTUFHRV9DT05GSUc6IENhcm91c2VsSW1hZ2VDb25maWcgPSB7XG4gIGRlc2NyaXB0aW9uOiBERUZBVUxUX0NBUk9VU0VMX0RFU0NSSVBUSU9OLFxuICBpbnZlcnRTd2lwZTogZmFsc2Vcbn07XG5leHBvcnQgY29uc3QgREVGQVVMVF9DVVJSRU5UX0NBUk9VU0VMX0NPTkZJRzogQ2Fyb3VzZWxDb25maWcgPSB7XG4gIG1heFdpZHRoOiAnMTAwJScsXG4gIG1heEhlaWdodDogJzQwMHB4JyxcbiAgc2hvd0Fycm93czogdHJ1ZSxcbiAgb2JqZWN0Rml0OiAnY292ZXInLFxuICBrZXlib2FyZEVuYWJsZTogdHJ1ZSxcbiAgbW9kYWxHYWxsZXJ5RW5hYmxlOiBmYWxzZSxcbiAgbGVnYWN5SUUxMU1vZGU6IGZhbHNlXG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ1VSUkVOVF9DQVJPVVNFTF9QTEFZOiBQbGF5Q29uZmlnID0ge1xuICBhdXRvUGxheTogdHJ1ZSxcbiAgaW50ZXJ2YWw6IDUwMDAsXG4gIHBhdXNlT25Ib3ZlcjogdHJ1ZVxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0FST1VTRUxfQlJFQUtQT0lOVFM6IEJyZWFrcG9pbnRzQ29uZmlnID0geyB4U21hbGw6IDEwMCwgc21hbGw6IDEwMCwgbWVkaXVtOiAxNTAsIGxhcmdlOiAyMDAsIHhMYXJnZTogMjAwIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9DQVJPVVNFTF9QUkVWSUVXU19DT05GSUc6IENhcm91c2VsUHJldmlld0NvbmZpZyA9IHtcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgbnVtYmVyOiA0LFxuICBhcnJvd3M6IHRydWUsXG4gIGNsaWNrYWJsZTogdHJ1ZSxcbiAgd2lkdGg6IDEwMCAvIDQgKyAnJScsXG4gIG1heEhlaWdodDogJzIwMHB4JyxcbiAgYnJlYWtwb2ludHM6IERFRkFVTFRfQ0FST1VTRUxfQlJFQUtQT0lOVFNcbn07XG5leHBvcnQgY29uc3QgREVGQVVMVF9LRVlCT0FSRF9TRVJWSUNFX0NPTkZJRzogS2V5Ym9hcmRTZXJ2aWNlQ29uZmlnID0ge1xuICBzaG9ydGN1dHM6IFsnY3RybCtzJywgJ21ldGErcyddLFxuICBkaXNhYmxlU3NyV29ya2Fyb3VuZDogZmFsc2Vcbn07XG5leHBvcnQgY29uc3QgREVGQVVMVF9TTElERV9DT05GSUc6IFNsaWRlQ29uZmlnID0ge1xuICBpbmZpbml0ZTogZmFsc2UsXG4gIHBsYXlDb25maWc6IHsgYXV0b1BsYXk6IGZhbHNlLCBpbnRlcnZhbDogNTAwMCwgcGF1c2VPbkhvdmVyOiB0cnVlIH0gYXMgUGxheUNvbmZpZyxcbiAgc2lkZVByZXZpZXdzOiB7IHNob3c6IHRydWUsIHNpemU6IHsgd2lkdGg6ICcxMDBweCcsIGhlaWdodDogJ2F1dG8nIH0gfSBhcyBTaWRlUHJldmlld3NDb25maWdcbn07XG5leHBvcnQgY29uc3QgREVGQVVMVF9QUkVWSUVXX0NPTkZJRzogUHJldmlld0NvbmZpZyA9IHtcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgbnVtYmVyOiAzLFxuICBhcnJvd3M6IHRydWUsXG4gIGNsaWNrYWJsZTogdHJ1ZSxcbiAgLy8gYWx3YXlzQ2VudGVyOiBmYWxzZSwgLy8gVE9ETyBzdGlsbCBub3QgaW1wbGVtZW50ZWRcbiAgc2l6ZTogREVGQVVMVF9QUkVWSUVXX1NJWkVcbn07XG5cbmNvbnN0IERFRkFVTFRfQ09ORklHOiBMaWJDb25maWcgPSBPYmplY3QuZnJlZXplKHtcbiAgc2xpZGVDb25maWc6IERFRkFVTFRfU0xJREVfQ09ORklHLFxuICBhY2Nlc3NpYmlsaXR5Q29uZmlnOiBLU19ERUZBVUxUX0FDQ0VTU0lCSUxJVFlfQ09ORklHLFxuICBwcmV2aWV3Q29uZmlnOiBERUZBVUxUX1BSRVZJRVdfQ09ORklHLFxuICBidXR0b25zQ29uZmlnOiB7IHZpc2libGU6IHRydWUsIHN0cmF0ZWd5OiBCdXR0b25zU3RyYXRlZ3kuREVGQVVMVCB9IGFzIEJ1dHRvbnNDb25maWcsXG4gIGRvdHNDb25maWc6IHsgdmlzaWJsZTogdHJ1ZSB9IGFzIERvdHNDb25maWcsXG4gIHBsYWluR2FsbGVyeUNvbmZpZzogREVGQVVMVF9QTEFJTl9DT05GSUcsXG4gIGN1cnJlbnRJbWFnZUNvbmZpZzogREVGQVVMVF9DVVJSRU5UX0lNQUdFX0NPTkZJRyxcbiAga2V5Ym9hcmRDb25maWc6IHVuZGVmaW5lZCwgLy8gYnkgZGVmYXVsdCBub3RoaW5nLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IHVzZXMgZGVmYXVsdCBidXR0b25zIGF1dG9tYXRpY2FsbHlcbiAgY2Fyb3VzZWxDb25maWc6IERFRkFVTFRfQ1VSUkVOVF9DQVJPVVNFTF9DT05GSUcsXG4gIGNhcm91c2VsSW1hZ2VDb25maWc6IERFRkFVTFRfQ0FST1VTRUxfSU1BR0VfQ09ORklHLFxuICBjYXJvdXNlbFByZXZpZXdzQ29uZmlnOiBERUZBVUxUX0NBUk9VU0VMX1BSRVZJRVdTX0NPTkZJRyxcbiAgY2Fyb3VzZWxQbGF5Q29uZmlnOiBERUZBVUxUX0NVUlJFTlRfQ0FST1VTRUxfUExBWSxcbiAgY2Fyb3VzZWxEb3RzQ29uZmlnOiB7IHZpc2libGU6IHRydWUgfSBhcyBEb3RzQ29uZmlnLFxuICBlbmFibGVDbG9zZU91dHNpZGU6IHRydWUsXG4gIGtleWJvYXJkU2VydmljZUNvbmZpZzogREVGQVVMVF9LRVlCT0FSRF9TRVJWSUNFX0NPTkZJR1xufSk7XG5cbi8qKlxuICogU2VydmljZSB0byBoYW5kbGUgbGlicmFyeSBjb25maWd1cmF0aW9uIGluIGEgdW5pcXVlIHBsYWNlXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgY29uZmlnTWFwOiBNYXA8bnVtYmVyLCBMaWJDb25maWc+ID0gbmV3IE1hcDxudW1iZXIsIExpYkNvbmZpZz4oKTtcblxuICBnZXRDb25maWcoaWQ6IG51bWJlcik6IExpYkNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5pbml0SWZOb3RFeGlzdHMoaWQpO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ01hcC5nZXQoaWQpO1xuICB9XG5cbiAgc2V0Q29uZmlnKGlkOiBudW1iZXIsIG9iajogTGliQ29uZmlnIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5pbml0SWZOb3RFeGlzdHMoaWQpO1xuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIURFRkFVTFRfQ09ORklHIHx8XG4gICAgICAhREVGQVVMVF9DT05GSUcuc2xpZGVDb25maWcgfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5zbGlkZUNvbmZpZy5zaWRlUHJldmlld3MgfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5wcmV2aWV3Q29uZmlnIHx8XG4gICAgICAhREVGQVVMVF9DT05GSUcucHJldmlld0NvbmZpZy5zaXplIHx8XG4gICAgICAhREVGQVVMVF9DT05GSUcucHJldmlld0NvbmZpZy5udW1iZXIgfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5wbGFpbkdhbGxlcnlDb25maWcgfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5jdXJyZW50SW1hZ2VDb25maWcgfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5jdXJyZW50SW1hZ2VDb25maWcgfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5jdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24gfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5jYXJvdXNlbEltYWdlQ29uZmlnIHx8XG4gICAgICAhREVGQVVMVF9DT05GSUcuY2Fyb3VzZWxJbWFnZUNvbmZpZy5kZXNjcmlwdGlvbiB8fFxuICAgICAgIURFRkFVTFRfQ09ORklHLmNhcm91c2VsUHJldmlld3NDb25maWcgfHxcbiAgICAgICFERUZBVUxUX0NPTkZJRy5jYXJvdXNlbFByZXZpZXdzQ29uZmlnLmJyZWFrcG9pbnRzIHx8XG4gICAgICAhREVGQVVMVF9DQVJPVVNFTF9QUkVWSUVXU19DT05GSUcubnVtYmVyXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGxpYnJhcnkgZXJyb3IgLSBERUZBVUxUX0NPTkZJRyBtdXN0IGJlIGZ1bGx5IGluaXRpYWxpemVkISEhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29uZmlnOiBMaWJDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZ01hcC5nZXQoaWQpKTtcbiAgICBpZiAob2JqLnNsaWRlQ29uZmlnKSB7XG4gICAgICBsZXQgcGxheUNvbmZpZztcbiAgICAgIGxldCBzaWRlUHJldmlld3M7XG4gICAgICBsZXQgc2l6ZTtcbiAgICAgIGlmIChvYmouc2xpZGVDb25maWcucGxheUNvbmZpZykge1xuICAgICAgICBwbGF5Q29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcuc2xpZGVDb25maWcucGxheUNvbmZpZywgb2JqLnNsaWRlQ29uZmlnLnBsYXlDb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGxheUNvbmZpZyA9IERFRkFVTFRfQ09ORklHLnNsaWRlQ29uZmlnLnBsYXlDb25maWc7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnNsaWRlQ29uZmlnLnNpZGVQcmV2aWV3cykge1xuICAgICAgICBpZiAob2JqLnNsaWRlQ29uZmlnLnNpZGVQcmV2aWV3cy5zaXplKSB7XG4gICAgICAgICAgc2l6ZSA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLnNsaWRlQ29uZmlnLnNpZGVQcmV2aWV3cy5zaXplLCBvYmouc2xpZGVDb25maWcuc2lkZVByZXZpZXdzLnNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNpemUgPSBERUZBVUxUX0NPTkZJRy5zbGlkZUNvbmZpZy5zaWRlUHJldmlld3Muc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBzaWRlUHJldmlld3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5zbGlkZUNvbmZpZy5zaWRlUHJldmlld3MsIG9iai5zbGlkZUNvbmZpZy5zaWRlUHJldmlld3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2lkZVByZXZpZXdzID0gREVGQVVMVF9DT05GSUcuc2xpZGVDb25maWcuc2lkZVByZXZpZXdzO1xuICAgICAgICBzaXplID0gREVGQVVMVF9DT05GSUcuc2xpZGVDb25maWcuc2lkZVByZXZpZXdzLnNpemU7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdTbGlkZUNvbmZpZzogU2xpZGVDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5zbGlkZUNvbmZpZywgb2JqLnNsaWRlQ29uZmlnKTtcbiAgICAgIG5ld1NsaWRlQ29uZmlnLnBsYXlDb25maWcgPSBwbGF5Q29uZmlnO1xuICAgICAgbmV3U2xpZGVDb25maWcuc2lkZVByZXZpZXdzID0gc2lkZVByZXZpZXdzO1xuICAgICAgbmV3U2xpZGVDb25maWcuc2lkZVByZXZpZXdzLnNpemUgPSBzaXplO1xuICAgICAgbmV3Q29uZmlnLnNsaWRlQ29uZmlnID0gbmV3U2xpZGVDb25maWc7XG4gICAgfVxuICAgIGlmIChvYmouYWNjZXNzaWJpbGl0eUNvbmZpZykge1xuICAgICAgbmV3Q29uZmlnLmFjY2Vzc2liaWxpdHlDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5hY2Nlc3NpYmlsaXR5Q29uZmlnLCBvYmouYWNjZXNzaWJpbGl0eUNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChvYmoucHJldmlld0NvbmZpZykge1xuICAgICAgbGV0IHNpemU6IFNpemU7XG4gICAgICBsZXQgbnVtOiBudW1iZXI7XG4gICAgICBpZiAob2JqLnByZXZpZXdDb25maWcuc2l6ZSkge1xuICAgICAgICBzaXplID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcucHJldmlld0NvbmZpZy5zaXplLCBvYmoucHJldmlld0NvbmZpZy5zaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBERUZBVUxUX0NPTkZJRy5wcmV2aWV3Q29uZmlnLnNpemU7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnByZXZpZXdDb25maWcubnVtYmVyKSB7XG4gICAgICAgIGlmIChvYmoucHJldmlld0NvbmZpZy5udW1iZXIgPD0gMCkge1xuICAgICAgICAgIC8vIGlmIG51bWJlciBpcyA8PSAwIHJlc2V0IHRvIGRlZmF1bHRcbiAgICAgICAgICBudW0gPSBERUZBVUxUX0NPTkZJRy5wcmV2aWV3Q29uZmlnLm51bWJlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBudW0gPSBvYmoucHJldmlld0NvbmZpZy5udW1iZXI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bSA9IERFRkFVTFRfQ09ORklHLnByZXZpZXdDb25maWcubnVtYmVyO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3UHJldmlld0NvbmZpZzogUHJldmlld0NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLnByZXZpZXdDb25maWcsIG9iai5wcmV2aWV3Q29uZmlnKTtcbiAgICAgIG5ld1ByZXZpZXdDb25maWcuc2l6ZSA9IHNpemU7XG4gICAgICBuZXdQcmV2aWV3Q29uZmlnLm51bWJlciA9IG51bTtcbiAgICAgIG5ld0NvbmZpZy5wcmV2aWV3Q29uZmlnID0gbmV3UHJldmlld0NvbmZpZztcbiAgICB9XG4gICAgaWYgKG9iai5idXR0b25zQ29uZmlnKSB7XG4gICAgICBuZXdDb25maWcuYnV0dG9uc0NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmJ1dHRvbnNDb25maWcsIG9iai5idXR0b25zQ29uZmlnKTtcbiAgICB9XG4gICAgaWYgKG9iai5kb3RzQ29uZmlnKSB7XG4gICAgICBuZXdDb25maWcuZG90c0NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmRvdHNDb25maWcsIG9iai5kb3RzQ29uZmlnKTtcbiAgICB9XG4gICAgaWYgKG9iai5wbGFpbkdhbGxlcnlDb25maWcpIHtcbiAgICAgIGxldCBhZHZhbmNlZDtcbiAgICAgIGxldCBsYXlvdXQ7XG4gICAgICBpZiAob2JqLnBsYWluR2FsbGVyeUNvbmZpZy5hZHZhbmNlZCkge1xuICAgICAgICBhZHZhbmNlZCA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLnBsYWluR2FsbGVyeUNvbmZpZy5hZHZhbmNlZCwgb2JqLnBsYWluR2FsbGVyeUNvbmZpZy5hZHZhbmNlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZHZhbmNlZCA9IERFRkFVTFRfQ09ORklHLnBsYWluR2FsbGVyeUNvbmZpZy5hZHZhbmNlZDtcbiAgICAgIH1cbiAgICAgIGlmIChvYmoucGxhaW5HYWxsZXJ5Q29uZmlnLmxheW91dCkge1xuICAgICAgICAvLyBpdCBpc24ndCBtYW5kYXRvcnkgdG8gdXNlIGFzc2lnbiwgYmVjYXVzZSBvYmoucGxhaW5HYWxsZXJ5Q29uZmlnLmxheW91dCBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzcyAoTGluZWFMYXlvdXQsIEdyaWRMYXlvdXQsIEFkdmFuY2VkTGF5b3V0KVxuICAgICAgICBsYXlvdXQgPSBvYmoucGxhaW5HYWxsZXJ5Q29uZmlnLmxheW91dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dCA9IERFRkFVTFRfQ09ORklHLnBsYWluR2FsbGVyeUNvbmZpZy5sYXlvdXQ7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdQbGFpbkdhbGxlcnlDb25maWc6IFBsYWluR2FsbGVyeUNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLnBsYWluR2FsbGVyeUNvbmZpZywgb2JqLnBsYWluR2FsbGVyeUNvbmZpZyk7XG4gICAgICBuZXdQbGFpbkdhbGxlcnlDb25maWcubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgbmV3UGxhaW5HYWxsZXJ5Q29uZmlnLmFkdmFuY2VkID0gYWR2YW5jZWQ7XG4gICAgICBuZXdDb25maWcucGxhaW5HYWxsZXJ5Q29uZmlnID0gaW5pdFBsYWluR2FsbGVyeUNvbmZpZyhuZXdQbGFpbkdhbGxlcnlDb25maWcpO1xuICAgIH1cbiAgICBpZiAob2JqLmN1cnJlbnRJbWFnZUNvbmZpZykge1xuICAgICAgbGV0IGxvYWRpbmc7XG4gICAgICBsZXQgZGVzY3JpcHRpb247XG4gICAgICBsZXQgZGVzY3JpcHRpb25TdHlsZTtcbiAgICAgIGlmIChvYmouY3VycmVudEltYWdlQ29uZmlnLmxvYWRpbmdDb25maWcpIHtcbiAgICAgICAgbG9hZGluZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmN1cnJlbnRJbWFnZUNvbmZpZy5sb2FkaW5nQ29uZmlnLCBvYmouY3VycmVudEltYWdlQ29uZmlnLmxvYWRpbmdDb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZGluZyA9IERFRkFVTFRfQ09ORklHLmN1cnJlbnRJbWFnZUNvbmZpZy5sb2FkaW5nQ29uZmlnO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5jdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5jdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24sIG9iai5jdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24pO1xuICAgICAgICBpZiAob2JqLmN1cnJlbnRJbWFnZUNvbmZpZy5kZXNjcmlwdGlvbi5zdHlsZSkge1xuICAgICAgICAgIGRlc2NyaXB0aW9uU3R5bGUgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5jdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24uc3R5bGUsIG9iai5jdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24uc3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlc2NyaXB0aW9uU3R5bGUgPSBERUZBVUxUX0NPTkZJRy5jdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24uc3R5bGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gREVGQVVMVF9DT05GSUcuY3VycmVudEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uO1xuICAgICAgICBkZXNjcmlwdGlvblN0eWxlID0gREVGQVVMVF9DT05GSUcuY3VycmVudEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uLnN0eWxlO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3Q3VycmVudEltYWdlQ29uZmlnOiBDdXJyZW50SW1hZ2VDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5jdXJyZW50SW1hZ2VDb25maWcsIG9iai5jdXJyZW50SW1hZ2VDb25maWcpO1xuICAgICAgbmV3Q3VycmVudEltYWdlQ29uZmlnLmxvYWRpbmdDb25maWcgPSBsb2FkaW5nO1xuICAgICAgbmV3Q3VycmVudEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICBuZXdDdXJyZW50SW1hZ2VDb25maWcuZGVzY3JpcHRpb24uc3R5bGUgPSBkZXNjcmlwdGlvblN0eWxlO1xuICAgICAgbmV3Q29uZmlnLmN1cnJlbnRJbWFnZUNvbmZpZyA9IG5ld0N1cnJlbnRJbWFnZUNvbmZpZztcbiAgICB9XG4gICAgaWYgKG9iai5rZXlib2FyZENvbmZpZykge1xuICAgICAgbmV3Q29uZmlnLmtleWJvYXJkQ29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcua2V5Ym9hcmRDb25maWcsIG9iai5rZXlib2FyZENvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gY2Fyb3VzZWxcbiAgICBpZiAob2JqLmNhcm91c2VsQ29uZmlnKSB7XG4gICAgICBuZXdDb25maWcuY2Fyb3VzZWxDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5jYXJvdXNlbENvbmZpZywgb2JqLmNhcm91c2VsQ29uZmlnKTtcbiAgICB9XG4gICAgaWYgKG9iai5jYXJvdXNlbEltYWdlQ29uZmlnKSB7XG4gICAgICBsZXQgZGVzY3JpcHRpb247XG4gICAgICBsZXQgZGVzY3JpcHRpb25TdHlsZTtcbiAgICAgIGlmIChvYmouY2Fyb3VzZWxJbWFnZUNvbmZpZy5kZXNjcmlwdGlvbikge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmNhcm91c2VsSW1hZ2VDb25maWcuZGVzY3JpcHRpb24sIG9iai5jYXJvdXNlbEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgaWYgKG9iai5jYXJvdXNlbEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uLnN0eWxlKSB7XG4gICAgICAgICAgZGVzY3JpcHRpb25TdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmNhcm91c2VsSW1hZ2VDb25maWcuZGVzY3JpcHRpb24uc3R5bGUsIG9iai5jYXJvdXNlbEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uLnN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXNjcmlwdGlvblN0eWxlID0gREVGQVVMVF9DT05GSUcuY2Fyb3VzZWxJbWFnZUNvbmZpZy5kZXNjcmlwdGlvbi5zdHlsZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzY3JpcHRpb24gPSBERUZBVUxUX0NPTkZJRy5jYXJvdXNlbEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uO1xuICAgICAgICBkZXNjcmlwdGlvblN0eWxlID0gREVGQVVMVF9DT05GSUcuY2Fyb3VzZWxJbWFnZUNvbmZpZy5kZXNjcmlwdGlvbi5zdHlsZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0Nhcm91c2VsSW1hZ2VDb25maWc6IENhcm91c2VsSW1hZ2VDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5jYXJvdXNlbEltYWdlQ29uZmlnLCBvYmouY2Fyb3VzZWxJbWFnZUNvbmZpZyk7XG4gICAgICBuZXdDYXJvdXNlbEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICBuZXdDYXJvdXNlbEltYWdlQ29uZmlnLmRlc2NyaXB0aW9uLnN0eWxlID0gZGVzY3JpcHRpb25TdHlsZTtcbiAgICAgIG5ld0NvbmZpZy5jYXJvdXNlbEltYWdlQ29uZmlnID0gbmV3Q2Fyb3VzZWxJbWFnZUNvbmZpZztcbiAgICB9XG4gICAgaWYgKG9iai5jYXJvdXNlbFBsYXlDb25maWcpIHtcbiAgICAgIC8vIGNoZWNrIHZhbHVlc1xuICAgICAgaWYgKG9iai5jYXJvdXNlbFBsYXlDb25maWcuaW50ZXJ2YWwgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhcm91c2VsJ3MgaW50ZXJ2YWwgbXVzdCBiZSBhIG51bWJlciA+PSAwYCk7XG4gICAgICB9XG4gICAgICBuZXdDb25maWcuY2Fyb3VzZWxQbGF5Q29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcuY2Fyb3VzZWxQbGF5Q29uZmlnLCBvYmouY2Fyb3VzZWxQbGF5Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKG9iai5jYXJvdXNlbFByZXZpZXdzQ29uZmlnKSB7XG4gICAgICAvLyBjaGVjayB2YWx1ZXNcbiAgICAgIGxldCBudW06IG51bWJlcjtcbiAgICAgIGxldCBicmVha3BvaW50czogQnJlYWtwb2ludHNDb25maWc7XG4gICAgICBpZiAoIW9iai5jYXJvdXNlbFByZXZpZXdzQ29uZmlnLm51bWJlciB8fCBvYmouY2Fyb3VzZWxQcmV2aWV3c0NvbmZpZy5udW1iZXIgPD0gMCkge1xuICAgICAgICBudW0gPSBERUZBVUxUX0NBUk9VU0VMX1BSRVZJRVdTX0NPTkZJRy5udW1iZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW0gPSBvYmouY2Fyb3VzZWxQcmV2aWV3c0NvbmZpZy5udW1iZXI7XG4gICAgICB9XG4gICAgICBpZiAob2JqLmNhcm91c2VsUHJldmlld3NDb25maWcuYnJlYWtwb2ludHMpIHtcbiAgICAgICAgYnJlYWtwb2ludHMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5jYXJvdXNlbFByZXZpZXdzQ29uZmlnLmJyZWFrcG9pbnRzLCBvYmouY2Fyb3VzZWxQcmV2aWV3c0NvbmZpZy5icmVha3BvaW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVha3BvaW50cyA9IERFRkFVTFRfQ09ORklHLmNhcm91c2VsUHJldmlld3NDb25maWcuYnJlYWtwb2ludHM7XG4gICAgICB9XG4gICAgICBuZXdDb25maWcuY2Fyb3VzZWxQcmV2aWV3c0NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmNhcm91c2VsUHJldmlld3NDb25maWcsIG9iai5jYXJvdXNlbFByZXZpZXdzQ29uZmlnKTtcbiAgICAgIG5ld0NvbmZpZy5jYXJvdXNlbFByZXZpZXdzQ29uZmlnLm51bWJlciA9IG51bTtcbiAgICAgIG5ld0NvbmZpZy5jYXJvdXNlbFByZXZpZXdzQ29uZmlnLmJyZWFrcG9pbnRzID0gYnJlYWtwb2ludHM7XG4gICAgICAvLyBJbml0IHByZXZpZXcgaW1hZ2Ugd2lkdGggYmFzZWQgb24gdGhlIG51bWJlciBvZiBwcmV2aWV3cyBpbiBQcmV2aWV3Q29uZmlnXG4gICAgICAvLyBEb24ndCBtb3ZlIHRoaXMgbGluZSBhYm92ZSwgYmVjYXVzZSBJIG5lZWQgdG8gYmUgc3VyZSB0aGF0IGJvdGggY29uZmlnUHJldmlldy5udW1iZXJcbiAgICAgIC8vIGFuZCBjb25maWdQcmV2aWV3LnNpemUgYXJlIGluaXRpYWxpemVkXG4gICAgICBuZXdDb25maWcuY2Fyb3VzZWxQcmV2aWV3c0NvbmZpZy53aWR0aCA9IDEwMCAvIG5ld0NvbmZpZy5jYXJvdXNlbFByZXZpZXdzQ29uZmlnLm51bWJlciArICclJztcbiAgICB9XG4gICAgaWYgKG9iai5jYXJvdXNlbERvdHNDb25maWcpIHtcbiAgICAgIG5ld0NvbmZpZy5jYXJvdXNlbERvdHNDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5jYXJvdXNlbERvdHNDb25maWcsIG9iai5jYXJvdXNlbERvdHNDb25maWcpO1xuICAgIH1cbiAgICBpZiAob2JqLmVuYWJsZUNsb3NlT3V0c2lkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdDb25maWcuZW5hYmxlQ2xvc2VPdXRzaWRlID0gREVGQVVMVF9DT05GSUcuZW5hYmxlQ2xvc2VPdXRzaWRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDb25maWcuZW5hYmxlQ2xvc2VPdXRzaWRlID0gb2JqLmVuYWJsZUNsb3NlT3V0c2lkZTtcbiAgICB9XG4gICAgaWYgKG9iai5rZXlib2FyZFNlcnZpY2VDb25maWcpIHtcbiAgICAgIG5ld0NvbmZpZy5rZXlib2FyZFNlcnZpY2VDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0tFWUJPQVJEX1NFUlZJQ0VfQ09ORklHLCBvYmoua2V5Ym9hcmRTZXJ2aWNlQ29uZmlnKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWdNYXAuc2V0KGlkLCBuZXdDb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0SWZOb3RFeGlzdHMoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWdNYXAuaGFzKGlkKSkge1xuICAgICAgdGhpcy5jb25maWdNYXAuc2V0KGlkLCBERUZBVUxUX0NPTkZJRyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gYnVpbGQgYW5kIHJldHVybiBhIGBQbGFpbkdhbGxlcnlDb25maWdgIG9iamVjdCwgcHJvdmluZyBhbHNvIGRlZmF1bHQgdmFsdWVzIGFuZCB2YWxpZGF0aW5nIHRoZSBpbnB1dCBvYmplY3QuXG4gKiBAcGFyYW0gcGxhaW5HYWxsZXJ5Q29uZmlnIG9iamVjdCB3aXRoIHRoZSBjb25maWcgcmVxdWVzdGVkIGJ5IHVzZXJcbiAqIEByZXR1cm5zIFBsYWluR2FsbGVyeUNvbmZpZyB0aGUgcGxhaW4gZ2FsbGVyeSBjb25maWd1cmF0aW9uXG4gKiBAdGhyb3dzIGFuIEVycm9yIGlmIGxheW91dCBhbmQgc3RyYXRlZ3kgYXJlbid0IGNvbXBhdGlibGVcbiAqL1xuZnVuY3Rpb24gaW5pdFBsYWluR2FsbGVyeUNvbmZpZyhwbGFpbkdhbGxlcnlDb25maWc6IFBsYWluR2FsbGVyeUNvbmZpZyk6IFBsYWluR2FsbGVyeUNvbmZpZyB7XG4gIGNvbnN0IG5ld1BsYXlHYWxsZXJ5Q29uZmlnOiBQbGFpbkdhbGxlcnlDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5wbGFpbkdhbGxlcnlDb25maWcsIHBsYWluR2FsbGVyeUNvbmZpZyk7XG5cbiAgaWYgKG5ld1BsYXlHYWxsZXJ5Q29uZmlnLmxheW91dCBpbnN0YW5jZW9mIExpbmVMYXlvdXQpIHtcbiAgICBpZiAobmV3UGxheUdhbGxlcnlDb25maWcuc3RyYXRlZ3kgIT09IFBsYWluR2FsbGVyeVN0cmF0ZWd5LlJPVyAmJiBuZXdQbGF5R2FsbGVyeUNvbmZpZy5zdHJhdGVneSAhPT0gUGxhaW5HYWxsZXJ5U3RyYXRlZ3kuQ09MVU1OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xpbmVMYXlvdXQgcmVxdWlyZXMgZWl0aGVyIFJPVyBvciBDT0xVTU4gc3RyYXRlZ3knKTtcbiAgICB9XG4gICAgaWYgKCFuZXdQbGF5R2FsbGVyeUNvbmZpZy5sYXlvdXQgfHwgIW5ld1BsYXlHYWxsZXJ5Q29uZmlnLmxheW91dC5icmVha0NvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGxheW91dCBhbmQgYnJlYWtDb25maWcgbXVzdCBiZSB2YWxpZCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChuZXdQbGF5R2FsbGVyeUNvbmZpZy5sYXlvdXQgaW5zdGFuY2VvZiBHcmlkTGF5b3V0KSB7XG4gICAgaWYgKG5ld1BsYXlHYWxsZXJ5Q29uZmlnLnN0cmF0ZWd5ICE9PSBQbGFpbkdhbGxlcnlTdHJhdGVneS5HUklEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyaWRMYXlvdXQgcmVxdWlyZXMgR1JJRCBzdHJhdGVneScpO1xuICAgIH1cbiAgICBpZiAoIW5ld1BsYXlHYWxsZXJ5Q29uZmlnLmxheW91dCB8fCAhbmV3UGxheUdhbGxlcnlDb25maWcubGF5b3V0LmJyZWFrQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggbGF5b3V0IGFuZCBicmVha0NvbmZpZyBtdXN0IGJlIHZhbGlkJyk7XG4gICAgfVxuICAgIC8vIGZvcmNlIHdyYXAgZm9yIGdyaWQgbGF5b3V0XG4gICAgbmV3UGxheUdhbGxlcnlDb25maWcubGF5b3V0LmJyZWFrQ29uZmlnLndyYXAgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG5ld1BsYXlHYWxsZXJ5Q29uZmlnLmxheW91dCBpbnN0YW5jZW9mIEFkdmFuY2VkTGF5b3V0KSB7XG4gICAgaWYgKG5ld1BsYXlHYWxsZXJ5Q29uZmlnLnN0cmF0ZWd5ICE9PSBQbGFpbkdhbGxlcnlTdHJhdGVneS5DVVNUT00pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWR2YW5jZWRMYXlvdXQgcmVxdWlyZXMgQ1VTVE9NIHN0cmF0ZWd5Jyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdQbGF5R2FsbGVyeUNvbmZpZztcbn1cbiJdfQ==
@@ -1,71 +0,0 @@
1
- /*
2
- The MIT License (MIT)
3
-
4
- Copyright (c) 2017-2020 Stefano Cappa (Ks89)
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in all
14
- copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- SOFTWARE.
23
- */
24
- import { Injectable } from '@angular/core';
25
- import * as i0 from "@angular/core";
26
- /**
27
- * Service to check if the provided id is unique
28
- */
29
- export class IdValidatorService {
30
- constructor() {
31
- this.ids = new Map();
32
- }
33
- /**
34
- * Method to check and reserve an id for the current instance of the library.
35
- * In this way, no other instances can use the same id.
36
- * @param galleryId number or undefined that represents the unique id of the gallery.
37
- * @return boolean true if success. false is never returned, instead an exception is thrown
38
- * @throws a error with a message if galleryId is neither unique, < 0 or an integer
39
- */
40
- checkAndAdd(galleryId) {
41
- if (galleryId === undefined || !Number.isInteger(galleryId) || galleryId < 0) {
42
- throw new Error('You must provide a valid [id]="unique integer > 0 here" to the gallery/carousel in your template');
43
- }
44
- if (this.ids.get(galleryId)) {
45
- throw new Error(`Cannot create gallery with id=${galleryId} because already used in your application. This must be a unique integer >= 0`);
46
- }
47
- this.ids.set(galleryId, galleryId);
48
- return true;
49
- }
50
- /**
51
- * Method to remove a reserved id. In this way you are able to use the id again for another instance of the library.
52
- * @param galleryId number or undefined that represents the unique id of the gallery.
53
- * @return boolean true if success. false is never returned, instead an exception is thrown
54
- * @throws a error with a message if galleryId is neither integer or < 0
55
- */
56
- remove(galleryId) {
57
- if (galleryId === undefined || !Number.isInteger(galleryId) || galleryId < 0) {
58
- throw new Error('You must provide a valid [id]="unique integer > 0 here" to the gallery/carousel in your template');
59
- }
60
- // if (this.ids.find(id => id === galleryId)) {
61
- // throw new Error(`Cannot create gallery with id=${galleryId} because already used in your application. This must be a unique number >= 0.`);
62
- // }
63
- this.ids.delete(galleryId);
64
- return true;
65
- }
66
- }
67
- IdValidatorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function IdValidatorService_Factory() { return new IdValidatorService(); }, token: IdValidatorService, providedIn: "root" });
68
- IdValidatorService.decorators = [
69
- { type: Injectable, args: [{ providedIn: 'root' },] }
70
- ];
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtdmFsaWRhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMva3M4OS9hbmd1bGFyLW1vZGFsLWdhbGxlcnkvc3JjLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2lkLXZhbGlkYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFM0M7O0dBRUc7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBRUUsUUFBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7S0FvQ2pCO0lBbENDOzs7Ozs7T0FNRztJQUNILFdBQVcsQ0FBQyxTQUE2QjtRQUN2QyxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrR0FBa0csQ0FBQyxDQUFDO1NBQ3JIO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxTQUFTLCtFQUErRSxDQUFDLENBQUM7U0FDNUk7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsU0FBNkI7UUFDbEMsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0dBQWtHLENBQUMsQ0FBQztTQUNySDtRQUNELCtDQUErQztRQUMvQyxnSkFBZ0o7UUFDaEosSUFBSTtRQUNKLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7OztZQXJDRixVQUFVLFNBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcblxuIENvcHlyaWdodCAoYykgMjAxNy0yMDIwIFN0ZWZhbm8gQ2FwcGEgKEtzODkpXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTiBJTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFNlcnZpY2UgdG8gY2hlY2sgaWYgdGhlIHByb3ZpZGVkIGlkIGlzIHVuaXF1ZVxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIElkVmFsaWRhdG9yU2VydmljZSB7XG4gIGlkcyA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNoZWNrIGFuZCByZXNlcnZlIGFuIGlkIGZvciB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgbGlicmFyeS5cbiAgICogSW4gdGhpcyB3YXksIG5vIG90aGVyIGluc3RhbmNlcyBjYW4gdXNlIHRoZSBzYW1lIGlkLlxuICAgKiBAcGFyYW0gZ2FsbGVyeUlkIG51bWJlciBvciB1bmRlZmluZWQgdGhhdCByZXByZXNlbnRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIGdhbGxlcnkuXG4gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHN1Y2Nlc3MuIGZhbHNlIGlzIG5ldmVyIHJldHVybmVkLCBpbnN0ZWFkIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd25cbiAgICogQHRocm93cyBhIGVycm9yIHdpdGggYSBtZXNzYWdlIGlmIGdhbGxlcnlJZCBpcyBuZWl0aGVyIHVuaXF1ZSwgPCAwIG9yIGFuIGludGVnZXJcbiAgICovXG4gIGNoZWNrQW5kQWRkKGdhbGxlcnlJZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKGdhbGxlcnlJZCA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGdhbGxlcnlJZCkgfHwgZ2FsbGVyeUlkIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgW2lkXT1cInVuaXF1ZSBpbnRlZ2VyID4gMCBoZXJlXCIgdG8gdGhlIGdhbGxlcnkvY2Fyb3VzZWwgaW4geW91ciB0ZW1wbGF0ZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pZHMuZ2V0KGdhbGxlcnlJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBnYWxsZXJ5IHdpdGggaWQ9JHtnYWxsZXJ5SWR9IGJlY2F1c2UgYWxyZWFkeSB1c2VkIGluIHlvdXIgYXBwbGljYXRpb24uIFRoaXMgbXVzdCBiZSBhIHVuaXF1ZSBpbnRlZ2VyID49IDBgKTtcbiAgICB9XG4gICAgdGhpcy5pZHMuc2V0KGdhbGxlcnlJZCwgZ2FsbGVyeUlkKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcmVtb3ZlIGEgcmVzZXJ2ZWQgaWQuIEluIHRoaXMgd2F5IHlvdSBhcmUgYWJsZSB0byB1c2UgdGhlIGlkIGFnYWluIGZvciBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBsaWJyYXJ5LlxuICAgKiBAcGFyYW0gZ2FsbGVyeUlkIG51bWJlciBvciB1bmRlZmluZWQgdGhhdCByZXByZXNlbnRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIGdhbGxlcnkuXG4gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHN1Y2Nlc3MuIGZhbHNlIGlzIG5ldmVyIHJldHVybmVkLCBpbnN0ZWFkIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd25cbiAgICogQHRocm93cyBhIGVycm9yIHdpdGggYSBtZXNzYWdlIGlmIGdhbGxlcnlJZCBpcyBuZWl0aGVyIGludGVnZXIgb3IgPCAwXG4gICAqL1xuICByZW1vdmUoZ2FsbGVyeUlkOiBudW1iZXIgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAoZ2FsbGVyeUlkID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0ludGVnZXIoZ2FsbGVyeUlkKSB8fCBnYWxsZXJ5SWQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSB2YWxpZCBbaWRdPVwidW5pcXVlIGludGVnZXIgPiAwIGhlcmVcIiB0byB0aGUgZ2FsbGVyeS9jYXJvdXNlbCBpbiB5b3VyIHRlbXBsYXRlJyk7XG4gICAgfVxuICAgIC8vIGlmICh0aGlzLmlkcy5maW5kKGlkID0+IGlkID09PSBnYWxsZXJ5SWQpKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgZ2FsbGVyeSB3aXRoIGlkPSR7Z2FsbGVyeUlkfSBiZWNhdXNlIGFscmVhZHkgdXNlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLiBUaGlzIG11c3QgYmUgYSB1bmlxdWUgbnVtYmVyID49IDAuYCk7XG4gICAgLy8gfVxuICAgIHRoaXMuaWRzLmRlbGV0ZShnYWxsZXJ5SWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=