@sapphire-ion/framework 0.30.26 → 0.30.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build.ps1 +39 -0
- package/ng-package.json +10 -0
- package/package.json +37 -41
- package/src/lib/classes/comparison/comparison-operator.ts +17 -0
- package/src/lib/classes/comparison/comparison-value-type.ts +34 -0
- package/src/lib/classes/comparison/comparison.ts +45 -0
- package/src/lib/classes/comparison/properties/bool-property.ts +16 -0
- package/src/lib/classes/comparison/properties/date-property.ts +28 -0
- package/src/lib/classes/comparison/properties/datetime-property.ts +28 -0
- package/src/lib/classes/comparison/properties/decimal-property.ts +28 -0
- package/src/lib/classes/comparison/properties/enum-property.ts +28 -0
- package/src/lib/classes/comparison/properties/implicit-property.ts +13 -0
- package/src/lib/classes/comparison/properties/int-property.ts +28 -0
- package/src/lib/classes/comparison/properties/long-property.ts +28 -0
- package/src/lib/classes/comparison/properties/string-property.ts +16 -0
- package/src/lib/classes/comparison/properties/time-property.ts +28 -0
- package/{lib/classes/credentials.d.ts → src/lib/classes/credentials.ts} +5 -5
- package/src/lib/classes/environment.ts +35 -0
- package/src/lib/classes/filters/view-filtros.ts +18 -0
- package/src/lib/classes/infinite-scroll.ts +112 -0
- package/src/lib/classes/inputs/table-field-form-builder.ts +12 -0
- package/src/lib/classes/inputs/table-field.ts +58 -0
- package/src/lib/classes/page-option.ts +8 -0
- package/src/lib/classes/routes/default-routing-factory.ts +24 -0
- package/src/lib/classes/routes/id-preloader-configuration.ts +21 -0
- package/src/lib/classes/routes/route-data.ts +9 -0
- package/{themes → src/lib}/compiled-styles.scss +2338 -2338
- package/src/lib/components/_inputs_new/classes/input-control-base.ts +85 -0
- package/src/lib/components/_inputs_new/classes/input-provider-factory.ts +16 -0
- package/src/lib/components/_inputs_new/input-string/input-string.component.html +4 -0
- package/src/lib/components/_inputs_new/input-string/input-string.component.ts +15 -0
- package/src/lib/components/_inputs_new/inputs.module.ts +16 -0
- package/src/lib/components/carousel/carousel-image/carousel-image.component.html +4 -0
- package/src/lib/components/carousel/carousel-image/carousel-image.component.ts +15 -0
- package/src/lib/components/carousel/carousel-item/carousel-item.component.html +3 -0
- package/src/lib/components/carousel/carousel-item/carousel-item.component.ts +14 -0
- package/src/lib/components/carousel/carousel.component.html +22 -0
- package/src/lib/components/carousel/carousel.component.ts +83 -0
- package/src/lib/components/carousel/carousel.module.ts +20 -0
- package/src/lib/components/carousel/i-carousel-item.component.ts +8 -0
- package/src/lib/components/content-block/content-block.component.html +6 -0
- package/src/lib/components/content-block/content-block.component.ts +25 -0
- package/src/lib/components/default/default-list/abstract-list.ts +56 -0
- package/src/lib/components/default/default-list/default-list.component.html +60 -0
- package/src/lib/components/default/default-list/default-list.component.ts +71 -0
- package/src/lib/components/default/default-list/header-list/header-list.component.html +32 -0
- package/src/lib/components/default/default-list/header-list/header-list.component.ts +85 -0
- package/src/lib/components/default/default-list/list.ts +121 -0
- package/src/lib/components/default/default-pagination/default-pagination.component.html +52 -0
- package/src/lib/components/default/default-pagination/default-pagination.component.ts +118 -0
- package/src/lib/components/default/default-table/default-table.component.html +105 -0
- package/src/lib/components/default/default-table/default-table.component.ts +197 -0
- package/src/lib/components/default/default-table/th-filter/th-filter.component.html +61 -0
- package/src/lib/components/default/default-table/th-filter/th-filter.component.ts +178 -0
- package/src/lib/components/default/default-view/abstract-view.ts +25 -0
- package/src/lib/components/default/default-view/default-view.component.html +81 -0
- package/src/lib/components/default/default-view/default-view.component.ts +34 -0
- package/src/lib/components/default/default-view/header-view/header-view.component.html +64 -0
- package/src/lib/components/default/default-view/header-view/header-view.component.ts +54 -0
- package/src/lib/components/default/default-view/view.ts +171 -0
- package/src/lib/components/default/default.module.ts +55 -0
- package/src/lib/components/default-page/default.page.html +53 -0
- package/src/lib/components/default-page/default.page.ts +77 -0
- package/src/lib/components/drag-drop-file/drag-drop-file.directive.ts +44 -0
- package/src/lib/components/drag-drop-file/drag-drop-file.module.ts +21 -0
- package/src/lib/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.html +5 -0
- package/src/lib/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.ts +17 -0
- package/src/lib/components/drawer/default-drawer-end/default-drawer-end.component.html +12 -0
- package/src/lib/components/drawer/default-drawer-end/default-drawer-end.component.ts +35 -0
- package/src/lib/components/drawer/drawer-group/drawer-group.component.html +61 -0
- package/src/lib/components/drawer/drawer-group/drawer-group.component.ts +44 -0
- package/src/lib/components/drawer/drawer.component.html +56 -0
- package/src/lib/components/drawer/drawer.component.ts +119 -0
- package/src/lib/components/drawer/menu.ts +20 -0
- package/src/lib/components/filter/filter.component.html +31 -0
- package/src/lib/components/filter/filter.component.ts +133 -0
- package/src/lib/components/http-responses-pages/forbidden-403/forbidden-403.component.html +35 -0
- package/src/lib/components/http-responses-pages/forbidden-403/forbidden-403.component.ts +19 -0
- package/src/lib/components/image/image.component.html +17 -0
- package/src/lib/components/image/image.component.ts +95 -0
- package/src/lib/components/info-popover/info-popover.component.html +23 -0
- package/src/lib/components/info-popover/info-popover.component.ts +75 -0
- package/src/lib/components/inputs/custom-input.ts +67 -0
- package/src/lib/components/inputs/custom-signal-input.ts +70 -0
- package/src/lib/components/inputs/input-bool/input-bool.component.html +18 -0
- package/src/lib/components/inputs/input-bool/input-bool.component.ts +36 -0
- package/src/lib/components/inputs/input-bool/input-bool.configuration.ts +14 -0
- package/src/lib/components/inputs/input-color/input-color.component.html +132 -0
- package/src/lib/components/inputs/input-color/input-color.component.ts +561 -0
- package/{lib/components/inputs/input-configuration.d.ts → src/lib/components/inputs/input-configuration.ts} +18 -8
- package/src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.html +26 -0
- package/src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.ts +78 -0
- package/src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.configuration.ts +4 -0
- package/src/lib/components/inputs/input-date/input-date.component.html +40 -0
- package/src/lib/components/inputs/input-date/input-date.component.ts +98 -0
- package/src/lib/components/inputs/input-date/input-date.configuration.ts +6 -0
- package/src/lib/components/inputs/input-decimal/input-decimal.component.html +24 -0
- package/src/lib/components/inputs/input-decimal/input-decimal.component.ts +296 -0
- package/src/lib/components/inputs/input-decimal/input-decimal.configuration.ts +42 -0
- package/src/lib/components/inputs/input-default-configurations.ts +15 -0
- package/src/lib/components/inputs/input-file/download-button/download-button.component.html +56 -0
- package/src/lib/components/inputs/input-file/download-button/download-button.component.ts +85 -0
- package/src/lib/components/inputs/input-file/input-file.component.html +101 -0
- package/src/lib/components/inputs/input-file/input-file.component.ts +120 -0
- package/src/lib/components/inputs/input-file/input-file.configuration.ts +8 -0
- package/src/lib/components/inputs/input-loading/input-loading.component.html +3 -0
- package/src/lib/components/inputs/input-loading/input-loading.component.ts +13 -0
- package/src/lib/components/inputs/input-provider-factory.ts +15 -0
- package/src/lib/components/inputs/input-select/ISelect.ts +26 -0
- package/src/lib/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.html +16 -0
- package/src/lib/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.ts +38 -0
- package/src/lib/components/inputs/input-select/input-select-option/input-select-option.component.html +15 -0
- package/src/lib/components/inputs/input-select/input-select-option/input-select-option.component.ts +47 -0
- package/src/lib/components/inputs/input-select/input-select-template.directive.ts +8 -0
- package/src/lib/components/inputs/input-select/input-select.component.html +66 -0
- package/src/lib/components/inputs/input-select/input-select.component.ts +323 -0
- package/src/lib/components/inputs/input-select/input.select.configuration.ts +188 -0
- package/src/lib/components/inputs/input-string/input-string.component.html +22 -0
- package/src/lib/components/inputs/input-string/input-string.component.ts +36 -0
- package/src/lib/components/inputs/input-string/input-string.configuration.ts +18 -0
- package/src/lib/components/inputs/input-textarea/input-textarea.component.html +25 -0
- package/src/lib/components/inputs/input-textarea/input-textarea.component.ts +35 -0
- package/src/lib/components/inputs/input-type.ts +16 -0
- package/src/lib/components/inputs/input-validators.ts +76 -0
- package/src/lib/components/inputs/inputs.module.ts +64 -0
- package/src/lib/components/loading/loading.component.html +28 -0
- package/src/lib/components/loading/loading.component.ts +29 -0
- package/src/lib/components/login/login-admin/login-admin.component.html +28 -0
- package/src/lib/components/login/login-admin/login-admin.component.ts +51 -0
- package/src/lib/components/login/login.component.html +104 -0
- package/src/lib/components/login/login.component.ts +97 -0
- package/src/lib/components/main-content/main-content.component.html +61 -0
- package/src/lib/components/main-content/main-content.component.ts +55 -0
- package/src/lib/components/stepper/step/step.component.html +11 -0
- package/src/lib/components/stepper/step/step.component.ts +44 -0
- package/src/lib/components/stepper/stepper.component.html +3 -0
- package/src/lib/components/stepper/stepper.component.ts +36 -0
- package/src/lib/components/stepper/stepper.module.ts +15 -0
- package/src/lib/components/tabs/tab/tab.component.html +8 -0
- package/src/lib/components/tabs/tab/tab.component.scss +0 -0
- package/src/lib/components/tabs/tab/tab.component.ts +28 -0
- package/src/lib/components/tabs/tabs/tabs.component.html +14 -0
- package/src/lib/components/tabs/tabs/tabs.component.ts +42 -0
- package/src/lib/components/tabs/tabs.module.ts +15 -0
- package/src/lib/components/text-tooltip/text-tooltip.component.html +8 -0
- package/src/lib/components/text-tooltip/text-tooltip.component.scss +0 -0
- package/src/lib/components/text-tooltip/text-tooltip.component.ts +45 -0
- package/src/lib/components/tooltip/tooltip.component.html +53 -0
- package/src/lib/components/tooltip/tooltip.component.ts +16 -0
- package/src/lib/core.module.ts +26 -0
- package/src/lib/directives/ng-var.directive.ts +26 -0
- package/src/lib/guards/auth.guard.ts +19 -0
- package/src/lib/guards/error.interceptor.ts +107 -0
- package/src/lib/guards/token.interceptor.ts +28 -0
- package/src/lib/index.ts +175 -0
- package/src/lib/pipes/secure.pipe.ts +39 -0
- package/src/lib/services/auth.service.ts +150 -0
- package/src/lib/services/crypto.service.ts +164 -0
- package/src/lib/services/environment.service.ts +17 -0
- package/src/lib/services/generics.service.ts +85 -0
- package/src/lib/services/route/route.cache.service.ts +17 -0
- package/src/lib/services/route/route.provider.service.ts +49 -0
- package/src/lib/services/usuario.service.ts +44 -0
- package/src/lib/services/utils.service.ts +161 -0
- package/src/lib/services/web/api-url-provider.service.ts +48 -0
- package/src/lib/services/web/http.ativo.service.ts +52 -0
- package/src/lib/services/web/http.service.ts +184 -0
- package/src/lib/services/web/storage.service.ts +131 -0
- package/{themes → src/lib}/styles/core.styles.scss +4 -0
- package/src/public-api.ts +5 -0
- package/tailwind.config.js +27 -0
- package/tsconfig.lib.json +29 -0
- package/tsconfig.lib.prod.json +23 -0
- package/tsconfig.spec.json +27 -0
- package/esm2022/lib/classes/comparison/comparison-operator.mjs +0 -18
- package/esm2022/lib/classes/comparison/comparison-value-type.mjs +0 -25
- package/esm2022/lib/classes/comparison/comparison.mjs +0 -41
- package/esm2022/lib/classes/comparison/properties/bool-property.mjs +0 -15
- package/esm2022/lib/classes/comparison/properties/date-property.mjs +0 -27
- package/esm2022/lib/classes/comparison/properties/datetime-property.mjs +0 -27
- package/esm2022/lib/classes/comparison/properties/decimal-property.mjs +0 -27
- package/esm2022/lib/classes/comparison/properties/enum-property.mjs +0 -27
- package/esm2022/lib/classes/comparison/properties/implicit-property.mjs +0 -12
- package/esm2022/lib/classes/comparison/properties/int-property.mjs +0 -27
- package/esm2022/lib/classes/comparison/properties/long-property.mjs +0 -27
- package/esm2022/lib/classes/comparison/properties/string-property.mjs +0 -15
- package/esm2022/lib/classes/comparison/properties/time-property.mjs +0 -27
- package/esm2022/lib/classes/credentials.mjs +0 -2
- package/esm2022/lib/classes/environment.mjs +0 -32
- package/esm2022/lib/classes/filters/view-filtros.mjs +0 -18
- package/esm2022/lib/classes/infinite-scroll.mjs +0 -90
- package/esm2022/lib/classes/inputs/table-field-form-builder.mjs +0 -10
- package/esm2022/lib/classes/inputs/table-field.mjs +0 -69
- package/esm2022/lib/classes/page-option.mjs +0 -2
- package/esm2022/lib/classes/routes/default-routing-factory.mjs +0 -23
- package/esm2022/lib/classes/routes/id-preloader-configuration.mjs +0 -22
- package/esm2022/lib/classes/routes/route-data.mjs +0 -9
- package/esm2022/lib/components/carousel/carousel-image/carousel-image.component.mjs +0 -18
- package/esm2022/lib/components/carousel/carousel-item/carousel-item.component.mjs +0 -15
- package/esm2022/lib/components/carousel/carousel.component.mjs +0 -79
- package/esm2022/lib/components/carousel/carousel.module.mjs +0 -31
- package/esm2022/lib/components/carousel/i-carousel-item.component.mjs +0 -16
- package/esm2022/lib/components/content-block/content-block.component.mjs +0 -27
- package/esm2022/lib/components/default/default-list/abstract-list.mjs +0 -49
- package/esm2022/lib/components/default/default-list/default-list.component.mjs +0 -99
- package/esm2022/lib/components/default/default-list/header-list/header-list.component.mjs +0 -98
- package/esm2022/lib/components/default/default-list/list.mjs +0 -110
- package/esm2022/lib/components/default/default-pagination/default-pagination.component.mjs +0 -123
- package/esm2022/lib/components/default/default-table/default-table.component.mjs +0 -222
- package/esm2022/lib/components/default/default-table/th-filter/th-filter.component.mjs +0 -186
- package/esm2022/lib/components/default/default-view/abstract-view.mjs +0 -22
- package/esm2022/lib/components/default/default-view/default-view.component.mjs +0 -51
- package/esm2022/lib/components/default/default-view/header-view/header-view.component.mjs +0 -75
- package/esm2022/lib/components/default/default-view/view.mjs +0 -175
- package/esm2022/lib/components/default/default.module.mjs +0 -87
- package/esm2022/lib/components/default-page/default.page.mjs +0 -73
- package/esm2022/lib/components/drag-drop-file/drag-drop-file.directive.mjs +0 -60
- package/esm2022/lib/components/drag-drop-file/drag-drop-file.module.mjs +0 -31
- package/esm2022/lib/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.mjs +0 -15
- package/esm2022/lib/components/drawer/default-drawer-end/default-drawer-end.component.mjs +0 -34
- package/esm2022/lib/components/drawer/drawer-group/drawer-group.component.mjs +0 -49
- package/esm2022/lib/components/drawer/drawer.component.mjs +0 -117
- package/esm2022/lib/components/drawer/menu.mjs +0 -15
- package/esm2022/lib/components/filter/filter.component.mjs +0 -127
- package/esm2022/lib/components/http-responses-pages/forbidden-403/forbidden-403.component.mjs +0 -17
- package/esm2022/lib/components/image/image.component.mjs +0 -91
- package/esm2022/lib/components/info-popover/info-popover.component.mjs +0 -91
- package/esm2022/lib/components/inputs/custom-input.mjs +0 -77
- package/esm2022/lib/components/inputs/custom-signal-input.mjs +0 -74
- package/esm2022/lib/components/inputs/input-bool/input-bool.component.mjs +0 -43
- package/esm2022/lib/components/inputs/input-bool/input-bool.configuration.mjs +0 -16
- package/esm2022/lib/components/inputs/input-color/input-color.component.mjs +0 -487
- package/esm2022/lib/components/inputs/input-configuration.mjs +0 -2
- package/esm2022/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.mjs +0 -93
- package/esm2022/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.configuration.mjs +0 -6
- package/esm2022/lib/components/inputs/input-date/input-date.component.mjs +0 -122
- package/esm2022/lib/components/inputs/input-date/input-date.configuration.mjs +0 -8
- package/esm2022/lib/components/inputs/input-decimal/input-decimal.component.mjs +0 -269
- package/esm2022/lib/components/inputs/input-decimal/input-decimal.configuration.mjs +0 -45
- package/esm2022/lib/components/inputs/input-default-configurations.mjs +0 -14
- package/esm2022/lib/components/inputs/input-file/download-button/download-button.component.mjs +0 -91
- package/esm2022/lib/components/inputs/input-file/input-file.component.mjs +0 -131
- package/esm2022/lib/components/inputs/input-file/input-file.configuration.mjs +0 -11
- package/esm2022/lib/components/inputs/input-loading/input-loading.component.mjs +0 -16
- package/esm2022/lib/components/inputs/input-provider-factory.mjs +0 -15
- package/esm2022/lib/components/inputs/input-select/ISelect.mjs +0 -11
- package/esm2022/lib/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.mjs +0 -42
- package/esm2022/lib/components/inputs/input-select/input-select-option/input-select-option.component.mjs +0 -46
- package/esm2022/lib/components/inputs/input-select/input-select-template.directive.mjs +0 -16
- package/esm2022/lib/components/inputs/input-select/input-select.component.mjs +0 -322
- package/esm2022/lib/components/inputs/input-select/input.select.configuration.mjs +0 -164
- package/esm2022/lib/components/inputs/input-string/input-string.component.mjs +0 -50
- package/esm2022/lib/components/inputs/input-string/input-string.configuration.mjs +0 -18
- package/esm2022/lib/components/inputs/input-textarea/input-textarea.component.mjs +0 -47
- package/esm2022/lib/components/inputs/input-type.mjs +0 -18
- package/esm2022/lib/components/inputs/input-validators.mjs +0 -90
- package/esm2022/lib/components/inputs/inputs.module.mjs +0 -105
- package/esm2022/lib/components/loading/loading.component.mjs +0 -34
- package/esm2022/lib/components/login/login-admin/login-admin.component.mjs +0 -52
- package/esm2022/lib/components/login/login.component.mjs +0 -102
- package/esm2022/lib/components/main-content/main-content.component.mjs +0 -62
- package/esm2022/lib/components/stepper/step/step.component.mjs +0 -43
- package/esm2022/lib/components/stepper/stepper.component.mjs +0 -36
- package/esm2022/lib/components/stepper/stepper.module.mjs +0 -25
- package/esm2022/lib/components/tabs/tab/tab.component.mjs +0 -41
- package/esm2022/lib/components/tabs/tabs/tabs.component.mjs +0 -56
- package/esm2022/lib/components/tabs/tabs.module.mjs +0 -22
- package/esm2022/lib/components/text-tooltip/text-tooltip.component.mjs +0 -51
- package/esm2022/lib/components/tooltip/tooltip.component.mjs +0 -21
- package/esm2022/lib/core.module.mjs +0 -29
- package/esm2022/lib/directives/ng-var.directive.mjs +0 -29
- package/esm2022/lib/guards/auth.guard.mjs +0 -26
- package/esm2022/lib/guards/error.interceptor.mjs +0 -106
- package/esm2022/lib/guards/token.interceptor.mjs +0 -25
- package/esm2022/lib/index.mjs +0 -173
- package/esm2022/lib/pipes/secure.pipe.mjs +0 -42
- package/esm2022/lib/services/auth.service.mjs +0 -146
- package/esm2022/lib/services/environment.service.mjs +0 -26
- package/esm2022/lib/services/generics.service.mjs +0 -84
- package/esm2022/lib/services/route/route.cache.service.mjs +0 -15
- package/esm2022/lib/services/route/route.provider.service.mjs +0 -42
- package/esm2022/lib/services/usuario.service.mjs +0 -49
- package/esm2022/lib/services/utils.service.mjs +0 -149
- package/esm2022/lib/services/web/api-url-provider.service.mjs +0 -29
- package/esm2022/lib/services/web/http.ativo.service.mjs +0 -55
- package/esm2022/lib/services/web/http.service.mjs +0 -169
- package/esm2022/lib/services/web/storage.service.mjs +0 -128
- package/esm2022/public-api.mjs +0 -5
- package/esm2022/sapphire-ion-framework.mjs +0 -5
- package/fesm2022/sapphire-ion-framework.mjs +0 -6237
- package/fesm2022/sapphire-ion-framework.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/classes/comparison/comparison-operator.d.ts +0 -9
- package/lib/classes/comparison/comparison-value-type.d.ts +0 -23
- package/lib/classes/comparison/comparison.d.ts +0 -25
- package/lib/classes/comparison/properties/bool-property.d.ts +0 -7
- package/lib/classes/comparison/properties/date-property.d.ts +0 -11
- package/lib/classes/comparison/properties/datetime-property.d.ts +0 -11
- package/lib/classes/comparison/properties/decimal-property.d.ts +0 -11
- package/lib/classes/comparison/properties/enum-property.d.ts +0 -11
- package/lib/classes/comparison/properties/implicit-property.d.ts +0 -6
- package/lib/classes/comparison/properties/int-property.d.ts +0 -11
- package/lib/classes/comparison/properties/long-property.d.ts +0 -11
- package/lib/classes/comparison/properties/string-property.d.ts +0 -7
- package/lib/classes/comparison/properties/time-property.d.ts +0 -11
- package/lib/classes/environment.d.ts +0 -13
- package/lib/classes/filters/view-filtros.d.ts +0 -10
- package/lib/classes/infinite-scroll.d.ts +0 -26
- package/lib/classes/inputs/table-field-form-builder.d.ts +0 -5
- package/lib/classes/inputs/table-field.d.ts +0 -20
- package/lib/classes/page-option.d.ts +0 -7
- package/lib/classes/routes/default-routing-factory.d.ts +0 -8
- package/lib/classes/routes/id-preloader-configuration.d.ts +0 -28
- package/lib/classes/routes/route-data.d.ts +0 -5
- package/lib/components/carousel/carousel-image/carousel-image.component.d.ts +0 -10
- package/lib/components/carousel/carousel-item/carousel-item.component.d.ts +0 -9
- package/lib/components/carousel/carousel.component.d.ts +0 -32
- package/lib/components/carousel/carousel.module.d.ts +0 -12
- package/lib/components/carousel/i-carousel-item.component.d.ts +0 -9
- package/lib/components/content-block/content-block.component.d.ts +0 -15
- package/lib/components/default/default-list/abstract-list.d.ts +0 -21
- package/lib/components/default/default-list/default-list.component.d.ts +0 -44
- package/lib/components/default/default-list/header-list/header-list.component.d.ts +0 -45
- package/lib/components/default/default-list/list.d.ts +0 -38
- package/lib/components/default/default-pagination/default-pagination.component.d.ts +0 -36
- package/lib/components/default/default-table/default-table.component.d.ts +0 -72
- package/lib/components/default/default-table/th-filter/th-filter.component.d.ts +0 -20
- package/lib/components/default/default-view/abstract-view.d.ts +0 -18
- package/lib/components/default/default-view/default-view.component.d.ts +0 -26
- package/lib/components/default/default-view/header-view/header-view.component.d.ts +0 -26
- package/lib/components/default/default-view/view.d.ts +0 -56
- package/lib/components/default/default.module.d.ts +0 -28
- package/lib/components/default-page/default.page.d.ts +0 -35
- package/lib/components/drag-drop-file/drag-drop-file.directive.d.ts +0 -14
- package/lib/components/drag-drop-file/drag-drop-file.module.d.ts +0 -10
- package/lib/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.d.ts +0 -9
- package/lib/components/drawer/default-drawer-end/default-drawer-end.component.d.ts +0 -13
- package/lib/components/drawer/drawer-group/drawer-group.component.d.ts +0 -22
- package/lib/components/drawer/drawer.component.d.ts +0 -23
- package/lib/components/drawer/menu.d.ts +0 -9
- package/lib/components/filter/filter.component.d.ts +0 -29
- package/lib/components/http-responses-pages/forbidden-403/forbidden-403.component.d.ts +0 -8
- package/lib/components/image/image.component.d.ts +0 -23
- package/lib/components/info-popover/info-popover.component.d.ts +0 -15
- package/lib/components/inputs/custom-input.d.ts +0 -36
- package/lib/components/inputs/custom-signal-input.d.ts +0 -38
- package/lib/components/inputs/input-bool/input-bool.component.d.ts +0 -19
- package/lib/components/inputs/input-bool/input-bool.configuration.d.ts +0 -17
- package/lib/components/inputs/input-color/input-color.component.d.ts +0 -80
- package/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.d.ts +0 -24
- package/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.configuration.d.ts +0 -5
- package/lib/components/inputs/input-date/input-date.component.d.ts +0 -30
- package/lib/components/inputs/input-date/input-date.configuration.d.ts +0 -7
- package/lib/components/inputs/input-decimal/input-decimal.component.d.ts +0 -41
- package/lib/components/inputs/input-decimal/input-decimal.configuration.d.ts +0 -25
- package/lib/components/inputs/input-default-configurations.d.ts +0 -13
- package/lib/components/inputs/input-file/download-button/download-button.component.d.ts +0 -36
- package/lib/components/inputs/input-file/input-file.component.d.ts +0 -39
- package/lib/components/inputs/input-file/input-file.configuration.d.ts +0 -11
- package/lib/components/inputs/input-loading/input-loading.component.d.ts +0 -7
- package/lib/components/inputs/input-provider-factory.d.ts +0 -4
- package/lib/components/inputs/input-select/ISelect.d.ts +0 -21
- package/lib/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.d.ts +0 -18
- package/lib/components/inputs/input-select/input-select-option/input-select-option.component.d.ts +0 -24
- package/lib/components/inputs/input-select/input-select-template.directive.d.ts +0 -8
- package/lib/components/inputs/input-select/input-select.component.d.ts +0 -66
- package/lib/components/inputs/input-select/input.select.configuration.d.ts +0 -87
- package/lib/components/inputs/input-string/input-string.component.d.ts +0 -19
- package/lib/components/inputs/input-string/input-string.configuration.d.ts +0 -14
- package/lib/components/inputs/input-textarea/input-textarea.component.d.ts +0 -18
- package/lib/components/inputs/input-type.d.ts +0 -16
- package/lib/components/inputs/input-validators.d.ts +0 -19
- package/lib/components/inputs/inputs.module.d.ts +0 -29
- package/lib/components/loading/loading.component.d.ts +0 -18
- package/lib/components/login/login-admin/login-admin.component.d.ts +0 -20
- package/lib/components/login/login.component.d.ts +0 -29
- package/lib/components/main-content/main-content.component.d.ts +0 -17
- package/lib/components/stepper/step/step.component.d.ts +0 -15
- package/lib/components/stepper/stepper.component.d.ts +0 -17
- package/lib/components/stepper/stepper.module.d.ts +0 -10
- package/lib/components/tabs/tab/tab.component.d.ts +0 -19
- package/lib/components/tabs/tabs/tabs.component.d.ts +0 -18
- package/lib/components/tabs/tabs.module.d.ts +0 -12
- package/lib/components/text-tooltip/text-tooltip.component.d.ts +0 -16
- package/lib/components/tooltip/tooltip.component.d.ts +0 -7
- package/lib/core.module.d.ts +0 -11
- package/lib/directives/ng-var.directive.d.ts +0 -12
- package/lib/guards/auth.guard.d.ts +0 -11
- package/lib/guards/error.interceptor.d.ts +0 -32
- package/lib/guards/token.interceptor.d.ts +0 -11
- package/lib/index.d.ts +0 -109
- package/lib/pipes/secure.pipe.d.ts +0 -15
- package/lib/services/auth.service.d.ts +0 -47
- package/lib/services/environment.service.d.ts +0 -10
- package/lib/services/generics.service.d.ts +0 -22
- package/lib/services/route/route.cache.service.d.ts +0 -7
- package/lib/services/route/route.provider.service.d.ts +0 -13
- package/lib/services/usuario.service.d.ts +0 -21
- package/lib/services/utils.service.d.ts +0 -36
- package/lib/services/web/api-url-provider.service.d.ts +0 -13
- package/lib/services/web/http.ativo.service.d.ts +0 -31
- package/lib/services/web/http.service.d.ts +0 -50
- package/lib/services/web/storage.service.d.ts +0 -25
- package/public-api.d.ts +0 -1
- /package/{themes → src/lib}/components/_inputs_new/input-string/input-string.component.scss +0 -0
- /package/{themes → src/lib}/components/_inputs_new/inputs.scss +0 -0
- /package/{themes → src/lib}/components/carousel/carousel-image/carousel-image.component.scss +0 -0
- /package/{themes → src/lib}/components/carousel/carousel-item/carousel-item.component.scss +0 -0
- /package/{themes → src/lib}/components/carousel/carousel.component.scss +0 -0
- /package/{themes → src/lib}/components/content-block/content-block.component.scss +0 -0
- /package/{themes → src/lib}/components/default/default-list/default-list.component.scss +0 -0
- /package/{themes → src/lib}/components/default/default-list/header-list/header-list.component.scss +0 -0
- /package/{themes → src/lib}/components/default/default-pagination/default-pagination.component.scss +0 -0
- /package/{themes → src/lib}/components/default/default-table/default-table.component.scss +0 -0
- /package/{themes → src/lib}/components/default/default-table/th-filter/th-filter.component.scss +0 -0
- /package/{themes → src/lib}/components/default/default-view/default-view.component.scss +0 -0
- /package/{themes → src/lib}/components/default/default-view/header-view/header-view.component.scss +0 -0
- /package/{themes → src/lib}/components/default-page/default.page.scss +0 -0
- /package/{themes → src/lib}/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.scss +0 -0
- /package/{themes → src/lib}/components/drawer/default-drawer-end/default-drawer-end.component.scss +0 -0
- /package/{themes → src/lib}/components/drawer/drawer-group/drawer-group.component.scss +0 -0
- /package/{themes → src/lib}/components/drawer/drawer.component.scss +0 -0
- /package/{themes → src/lib}/components/filter/filter.component.scss +0 -0
- /package/{themes → src/lib}/components/http-responses-pages/forbidden-403/forbidden-403.component.scss +0 -0
- /package/{themes → src/lib}/components/image/image.component.scss +0 -0
- /package/{themes → src/lib}/components/info-popover/info-popover.component.scss +0 -0
- /package/{themes → src/lib}/components/inputs/input-bool/input-bool.component.scss +0 -0
- /package/{themes → src/lib}/components/inputs/input-color/input-color.component.scss +0 -0
- /package/{themes/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.scss → src/lib/components/inputs/input-color/input-color.configuration.ts} +0 -0
- /package/{themes/components/inputs/input-loading/input-loading.component.scss → src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.scss} +0 -0
- /package/{themes → src/lib}/components/inputs/input-date/input-date.component.scss +0 -0
- /package/{themes → src/lib}/components/inputs/input-decimal/input-decimal.component.scss +0 -0
- /package/{themes → src/lib}/components/inputs/input-file/download-button/download-button.component.scss +0 -0
- /package/{themes → src/lib}/components/inputs/input-file/input-file.component.scss +0 -0
- /package/{themes/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.scss → src/lib/components/inputs/input-loading/input-bool.configuration.ts} +0 -0
- /package/{themes/components/inputs/input-select/input-select-option/input-select-option.component.scss → src/lib/components/inputs/input-loading/input-loading.component.scss} +0 -0
- /package/{themes/components/inputs/input-string/input-string.component.scss → src/lib/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.scss} +0 -0
- /package/{themes/components/inputs/input-textarea/input-textarea.component.scss → src/lib/components/inputs/input-select/input-select-option/input-select-option.component.scss} +0 -0
- /package/{themes → src/lib}/components/inputs/input-select/input-select.component.scss +0 -0
- /package/{themes/components/loading/loading.component.scss → src/lib/components/inputs/input-string/input-string.component.scss} +0 -0
- /package/{themes/components/stepper/stepper.component.scss → src/lib/components/inputs/input-textarea/input-textarea.component.scss} +0 -0
- /package/{themes → src/lib}/components/inputs/inputs.scss +0 -0
- /package/{themes/components/tabs/tab/tab.component.scss → src/lib/components/loading/loading.component.scss} +0 -0
- /package/{themes → src/lib}/components/login/login-admin/login-admin.component.scss +0 -0
- /package/{themes → src/lib}/components/login/login.component.scss +0 -0
- /package/{themes → src/lib}/components/main-content/main-content.component.scss +0 -0
- /package/{themes → src/lib}/components/stepper/step/step.component.scss +0 -0
- /package/{themes/components/text-tooltip/text-tooltip.component.scss → src/lib/components/stepper/stepper.component.scss} +0 -0
- /package/{themes → src/lib}/components/tabs/tabs/tabs.component.scss +0 -0
- /package/{themes → src/lib}/components/tooltip/tooltip.component.scss +0 -0
- /package/{themes → src/lib}/styles/components.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-action-sheet.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-alert.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-button.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-card.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-content.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-datetime.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-item.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-list.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-modal.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-popover.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-progress-bar.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-searchbar.scss +0 -0
- /package/{themes → src/lib}/styles/ionic/ion-toast.scss +0 -0
- /package/{themes → src/lib}/styles/ionic.scss +0 -0
- /package/{themes → src/lib}/styles/login-default.scss +0 -0
- /package/{themes → src/lib}/styles/mixins.scss +0 -0
- /package/{themes → src/lib}/styles/styles.scss +0 -0
- /package/{themes → src/lib}/styles/translucid.scss +0 -0
|
@@ -1,487 +0,0 @@
|
|
|
1
|
-
import { Component, ElementRef, ViewChild } from '@angular/core';
|
|
2
|
-
import { Clipboard } from '@capacitor/clipboard';
|
|
3
|
-
import { IonPopover } from '@ionic/angular';
|
|
4
|
-
import { InputProviderFactory } from '../input-provider-factory';
|
|
5
|
-
import { CustomSignalInput } from '../custom-signal-input';
|
|
6
|
-
import { GenericService } from '../../../services/generics.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "../../../services/generics.service";
|
|
9
|
-
import * as i2 from "@angular/common";
|
|
10
|
-
import * as i3 from "@ionic/angular";
|
|
11
|
-
import * as i4 from "@angular/forms";
|
|
12
|
-
import * as i5 from "../../loading/loading.component";
|
|
13
|
-
import * as i6 from "../input-loading/input-loading.component";
|
|
14
|
-
export class InputColorComponent extends CustomSignalInput {
|
|
15
|
-
constructor(genericService) {
|
|
16
|
-
super();
|
|
17
|
-
this.genericService = genericService;
|
|
18
|
-
this.rendering = true;
|
|
19
|
-
this.canvasWidth = 0;
|
|
20
|
-
this.canvasHeight = 0;
|
|
21
|
-
this.hueSliderWidth = 0;
|
|
22
|
-
this.hueSliderHeight = 0;
|
|
23
|
-
this.alphaSliderWidth = 0;
|
|
24
|
-
this.alphaSliderHeight = 0;
|
|
25
|
-
this.isDragging = false;
|
|
26
|
-
this.isHueDragging = false;
|
|
27
|
-
this.isAlphaDragging = false;
|
|
28
|
-
this.rgbColor = { r: 255, g: 0, b: 0 };
|
|
29
|
-
this.hslColor = { h: 0, s: 100, l: 50 };
|
|
30
|
-
this.alpha = 0;
|
|
31
|
-
this.indicatorX = 100;
|
|
32
|
-
this.indicatorY = 0;
|
|
33
|
-
}
|
|
34
|
-
writeValue(value) { this.setModel(value, true); }
|
|
35
|
-
get model() { return this._model; }
|
|
36
|
-
set model(value) { this.setModel(value); this.propagateChange(this._model); }
|
|
37
|
-
setModel(value, redraw = false) {
|
|
38
|
-
if (value) {
|
|
39
|
-
this.setColorFromHex(value, false);
|
|
40
|
-
if (this.canvasCtx && redraw) {
|
|
41
|
-
this.updateSelectedColor();
|
|
42
|
-
this.updateIndicatorPositions();
|
|
43
|
-
this.drawColorGradient();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
async Present($event) {
|
|
48
|
-
this.rendering = true;
|
|
49
|
-
await this.Popover.present($event);
|
|
50
|
-
this.initCanvas();
|
|
51
|
-
this.initHueSlider();
|
|
52
|
-
this.initAlphaSlider();
|
|
53
|
-
this.drawColorGradient();
|
|
54
|
-
this.drawHueSlider();
|
|
55
|
-
this.drawAlphaSlider();
|
|
56
|
-
this.rendering = false;
|
|
57
|
-
}
|
|
58
|
-
initCanvas() {
|
|
59
|
-
const canvas = this.canvas.nativeElement;
|
|
60
|
-
this.canvasWidth = canvas.width;
|
|
61
|
-
this.canvasHeight = canvas.height;
|
|
62
|
-
this.canvasCtx = canvas.getContext('2d');
|
|
63
|
-
canvas.addEventListener('mousedown', this.startDrag.bind(this));
|
|
64
|
-
canvas.addEventListener('mousemove', this.drag.bind(this));
|
|
65
|
-
canvas.addEventListener('mouseup', this.endDrag.bind(this));
|
|
66
|
-
canvas.addEventListener('mouseleave', this.endDrag.bind(this));
|
|
67
|
-
// Touch events
|
|
68
|
-
canvas.addEventListener('touchstart', this.handleTouch.bind(this));
|
|
69
|
-
canvas.addEventListener('touchmove', this.handleTouch.bind(this));
|
|
70
|
-
canvas.addEventListener('touchend', this.endDrag.bind(this));
|
|
71
|
-
}
|
|
72
|
-
initHueSlider() {
|
|
73
|
-
const hueSlider = this.hueSlider.nativeElement;
|
|
74
|
-
this.hueSliderWidth = hueSlider.width;
|
|
75
|
-
this.hueSliderHeight = hueSlider.height;
|
|
76
|
-
this.hueCtx = hueSlider.getContext("2d");
|
|
77
|
-
hueSlider.addEventListener("mousedown", this.startHueDrag.bind(this));
|
|
78
|
-
hueSlider.addEventListener("mousemove", this.hueDrag.bind(this));
|
|
79
|
-
hueSlider.addEventListener("mouseup", this.endHueDrag.bind(this));
|
|
80
|
-
hueSlider.addEventListener("mouseleave", this.endHueDrag.bind(this));
|
|
81
|
-
// Touch events
|
|
82
|
-
hueSlider.addEventListener("touchstart", this.handleHueTouch.bind(this));
|
|
83
|
-
hueSlider.addEventListener("touchmove", this.handleHueTouch.bind(this));
|
|
84
|
-
hueSlider.addEventListener("touchend", this.endHueDrag.bind(this));
|
|
85
|
-
}
|
|
86
|
-
initAlphaSlider() {
|
|
87
|
-
const alphaSlider = this.alphaSlider.nativeElement;
|
|
88
|
-
this.alphaSliderHeight = alphaSlider.height;
|
|
89
|
-
this.alphaSliderWidth = alphaSlider.width;
|
|
90
|
-
this.alphaCtx = alphaSlider.getContext("2d");
|
|
91
|
-
alphaSlider.addEventListener("mousedown", this.startAlphaDrag.bind(this));
|
|
92
|
-
alphaSlider.addEventListener("mousemove", this.alphaDrag.bind(this));
|
|
93
|
-
alphaSlider.addEventListener("mouseup", this.endAlphaDrag.bind(this));
|
|
94
|
-
alphaSlider.addEventListener("mouseleave", this.endAlphaDrag.bind(this));
|
|
95
|
-
// Touch events
|
|
96
|
-
alphaSlider.addEventListener("touchstart", this.handleAlphaTouch.bind(this));
|
|
97
|
-
alphaSlider.addEventListener("touchmove", this.handleAlphaTouch.bind(this));
|
|
98
|
-
alphaSlider.addEventListener("touchend", this.endAlphaDrag.bind(this));
|
|
99
|
-
}
|
|
100
|
-
drawColorGradient() {
|
|
101
|
-
const ctx = this.canvasCtx;
|
|
102
|
-
// Clear canvas
|
|
103
|
-
ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
|
|
104
|
-
// Draw the pure hue color at the top-right corner
|
|
105
|
-
ctx.fillStyle = `hsl(${this.hslColor.h}, 100%, 50%)`;
|
|
106
|
-
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
|
|
107
|
-
// White gradient (horizontal - saturation)
|
|
108
|
-
const whiteGradient = ctx.createLinearGradient(0, 0, this.canvasWidth, 0);
|
|
109
|
-
whiteGradient.addColorStop(0, "white");
|
|
110
|
-
whiteGradient.addColorStop(1, "rgba(255, 255, 255, 0)");
|
|
111
|
-
ctx.fillStyle = whiteGradient;
|
|
112
|
-
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
|
|
113
|
-
// Black gradient (vertical - brightness)
|
|
114
|
-
const blackGradient = ctx.createLinearGradient(0, 0, 0, this.canvasHeight);
|
|
115
|
-
blackGradient.addColorStop(0, "rgba(0, 0, 0, 0)");
|
|
116
|
-
blackGradient.addColorStop(1, "black");
|
|
117
|
-
ctx.fillStyle = blackGradient;
|
|
118
|
-
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
|
|
119
|
-
}
|
|
120
|
-
drawHueSlider() {
|
|
121
|
-
const ctx = this.hueCtx;
|
|
122
|
-
// Create hue gradient
|
|
123
|
-
const gradient = ctx.createLinearGradient(0, 0, this.hueSliderWidth, 0);
|
|
124
|
-
for (let i = 0; i <= 360; i += 60) {
|
|
125
|
-
gradient.addColorStop(i / 360, `hsl(${i}, 100%, 50%)`);
|
|
126
|
-
}
|
|
127
|
-
ctx.fillStyle = gradient;
|
|
128
|
-
ctx.fillRect(0, 0, this.hueSliderWidth, this.hueSliderHeight);
|
|
129
|
-
}
|
|
130
|
-
drawAlphaSlider() {
|
|
131
|
-
const ctx = this.alphaCtx;
|
|
132
|
-
const width = this.alphaSliderWidth;
|
|
133
|
-
const height = this.alphaSliderHeight;
|
|
134
|
-
// Clear canvas
|
|
135
|
-
ctx.clearRect(0, 0, width, height);
|
|
136
|
-
// Create checkerboard pattern for transparency
|
|
137
|
-
const squareSize = 8;
|
|
138
|
-
for (let i = 0; i < width; i += squareSize) {
|
|
139
|
-
for (let j = 0; j < height; j += squareSize) {
|
|
140
|
-
const isEven = (i / squareSize + j / squareSize) % 2 === 0;
|
|
141
|
-
ctx.fillStyle = isEven ? "#ffffff" : "#cccccc";
|
|
142
|
-
ctx.fillRect(i, j, squareSize, squareSize);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Create alpha gradient
|
|
146
|
-
const gradient = ctx.createLinearGradient(0, 0, width, 0);
|
|
147
|
-
const rgb = this.hslToRgb(this.hslColor);
|
|
148
|
-
gradient.addColorStop(0, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0)`);
|
|
149
|
-
gradient.addColorStop(1, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 1)`);
|
|
150
|
-
ctx.fillStyle = gradient;
|
|
151
|
-
ctx.fillRect(0, 0, width, height);
|
|
152
|
-
}
|
|
153
|
-
startDrag(e) {
|
|
154
|
-
this.isDragging = true;
|
|
155
|
-
this.handleColorSelection(e.offsetX, e.offsetY);
|
|
156
|
-
}
|
|
157
|
-
drag(e) {
|
|
158
|
-
if (this.isDragging) {
|
|
159
|
-
this.handleColorSelection(e.offsetX, e.offsetY);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
endDrag() {
|
|
163
|
-
this.isDragging = false;
|
|
164
|
-
}
|
|
165
|
-
handleTouch(e) {
|
|
166
|
-
e.preventDefault();
|
|
167
|
-
if (e.type === "touchstart") {
|
|
168
|
-
this.isDragging = true;
|
|
169
|
-
}
|
|
170
|
-
if (this.isDragging) {
|
|
171
|
-
const rect = this.canvas.nativeElement.getBoundingClientRect();
|
|
172
|
-
const touch = e.touches[0];
|
|
173
|
-
const x = touch.clientX - rect.left;
|
|
174
|
-
const y = touch.clientY - rect.top;
|
|
175
|
-
this.handleColorSelection(x, y);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
startHueDrag(e) {
|
|
179
|
-
this.isHueDragging = true;
|
|
180
|
-
this.handleHueSelection(e.offsetX);
|
|
181
|
-
}
|
|
182
|
-
hueDrag(e) {
|
|
183
|
-
if (this.isHueDragging) {
|
|
184
|
-
this.handleHueSelection(e.offsetX);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
endHueDrag() {
|
|
188
|
-
this.isHueDragging = false;
|
|
189
|
-
}
|
|
190
|
-
startAlphaDrag(e) {
|
|
191
|
-
this.isAlphaDragging = true;
|
|
192
|
-
this.handleAlphaSelection(e.offsetX);
|
|
193
|
-
}
|
|
194
|
-
alphaDrag(e) {
|
|
195
|
-
if (this.isAlphaDragging) {
|
|
196
|
-
this.handleAlphaSelection(e.offsetX);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
endAlphaDrag() {
|
|
200
|
-
this.isAlphaDragging = false;
|
|
201
|
-
}
|
|
202
|
-
handleAlphaTouch(e) {
|
|
203
|
-
e.preventDefault();
|
|
204
|
-
if (e.type === "touchstart") {
|
|
205
|
-
this.isAlphaDragging = true;
|
|
206
|
-
}
|
|
207
|
-
if (this.isAlphaDragging) {
|
|
208
|
-
const rect = this.alphaSlider.nativeElement.getBoundingClientRect();
|
|
209
|
-
const touch = e.touches[0];
|
|
210
|
-
const x = touch.clientX - rect.left;
|
|
211
|
-
this.handleAlphaSelection(x);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
handleHueTouch(e) {
|
|
215
|
-
e.preventDefault();
|
|
216
|
-
if (e.type === "touchstart") {
|
|
217
|
-
this.isHueDragging = true;
|
|
218
|
-
}
|
|
219
|
-
if (this.isHueDragging) {
|
|
220
|
-
const rect = this.hueSlider.nativeElement.getBoundingClientRect();
|
|
221
|
-
const touch = e.touches[0];
|
|
222
|
-
const x = touch.clientX - rect.left;
|
|
223
|
-
this.handleHueSelection(x);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
handleHueSelection(x) {
|
|
227
|
-
// Constrain x to canvas bounds
|
|
228
|
-
x = Math.max(0, Math.min(x, this.hueSliderWidth));
|
|
229
|
-
// Calculate hue based on x position (0-360)
|
|
230
|
-
this.hslColor.h = Math.round((x / this.hueSliderWidth) * 360);
|
|
231
|
-
// Redraw color gradient with new hue
|
|
232
|
-
this.drawColorGradient();
|
|
233
|
-
// Redraw alpha slider with new color
|
|
234
|
-
this.drawAlphaSlider();
|
|
235
|
-
// Update selected color
|
|
236
|
-
this.updateSelectedColor(this.hslColor.s, this.hslColor.l, true);
|
|
237
|
-
}
|
|
238
|
-
handleAlphaSelection(x) {
|
|
239
|
-
// Constrain x to canvas bounds
|
|
240
|
-
x = Math.max(0, Math.min(x, this.alphaSliderWidth));
|
|
241
|
-
// Calculate alpha based on x position (0-100)
|
|
242
|
-
this.alpha = Math.round((x / this.alphaSliderWidth) * 100);
|
|
243
|
-
// Update selected color
|
|
244
|
-
this.updateSelectedColor(this.hslColor.s, this.hslColor.l, true);
|
|
245
|
-
}
|
|
246
|
-
handleColorSelection(x, y) {
|
|
247
|
-
// Constrain coordinates to canvas bounds
|
|
248
|
-
x = Math.max(0, Math.min(x, this.canvasWidth));
|
|
249
|
-
y = Math.max(0, Math.min(y, this.canvasHeight));
|
|
250
|
-
// Store the raw position percentage for the indicator
|
|
251
|
-
this.indicatorX = (x / this.canvasWidth) * 100;
|
|
252
|
-
this.indicatorY = (y / this.canvasHeight) * 100;
|
|
253
|
-
// Calculate saturation and lightness based on position
|
|
254
|
-
this.hslColor.s = Math.round(this.indicatorX);
|
|
255
|
-
// Adjust lightness calculation:
|
|
256
|
-
// - Top of canvas (y=0) should be white (lightness=100) on the left and pure color (lightness=50) on the right
|
|
257
|
-
// - Bottom of canvas (y=height) should be black (lightness=0)
|
|
258
|
-
if (this.hslColor.s === 0) {
|
|
259
|
-
// Left edge is always white to black, regardless of y position
|
|
260
|
-
this.hslColor.l = Math.round(100 - this.indicatorY);
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
// For other saturation values, top is 50-100% lightness (based on saturation), bottom is 0%
|
|
264
|
-
const maxLightness = 100 - this.hslColor.s / 2;
|
|
265
|
-
this.hslColor.l = Math.round(maxLightness - (this.indicatorY / 100) * maxLightness);
|
|
266
|
-
}
|
|
267
|
-
// Update selected color
|
|
268
|
-
this.updateSelectedColor(this.hslColor.s, this.hslColor.l, true);
|
|
269
|
-
// Redraw alpha slider with new color
|
|
270
|
-
this.drawAlphaSlider();
|
|
271
|
-
}
|
|
272
|
-
updateSelectedColor(saturation = null, lightness = null, emitChanges = false) {
|
|
273
|
-
// Update HSL values
|
|
274
|
-
if (saturation != null) {
|
|
275
|
-
this.hslColor.s = saturation;
|
|
276
|
-
}
|
|
277
|
-
if (lightness != null) {
|
|
278
|
-
this.hslColor.l = lightness;
|
|
279
|
-
}
|
|
280
|
-
// Convert HSL to RGB
|
|
281
|
-
const rgb = this.hslToRgb(this.hslColor);
|
|
282
|
-
this.rgbColor = rgb;
|
|
283
|
-
// Convert RGB to HEX
|
|
284
|
-
const hex = this.rgbToHex(rgb, this.alpha / 100);
|
|
285
|
-
if (emitChanges) {
|
|
286
|
-
this.model = hex;
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
this._model = hex;
|
|
290
|
-
}
|
|
291
|
-
// Emit color change event
|
|
292
|
-
// this.colorChange.emit(this.selectedColor)
|
|
293
|
-
}
|
|
294
|
-
updateIndicatorPositions() {
|
|
295
|
-
// Set X position directly from saturation (0-100)
|
|
296
|
-
this.indicatorX = this.hslColor.s;
|
|
297
|
-
// Set Y position based on lightness
|
|
298
|
-
// When lightness is 50, Y should be 0 (top)
|
|
299
|
-
// When lightness is 0, Y should be 100 (bottom)
|
|
300
|
-
this.indicatorY = (50 - this.hslColor.l) * 2;
|
|
301
|
-
}
|
|
302
|
-
hslToRgb(hsl) {
|
|
303
|
-
var h = hsl.h / 360;
|
|
304
|
-
var s = hsl.s / 100;
|
|
305
|
-
var l = hsl.l / 100;
|
|
306
|
-
let r, g, b;
|
|
307
|
-
if (s === 0) {
|
|
308
|
-
r = g = b = l; // achromatic
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
const hue2rgb = (p, q, t) => {
|
|
312
|
-
if (t < 0)
|
|
313
|
-
t += 1;
|
|
314
|
-
if (t > 1)
|
|
315
|
-
t -= 1;
|
|
316
|
-
if (t < 1 / 6)
|
|
317
|
-
return p + (q - p) * 6 * t;
|
|
318
|
-
if (t < 1 / 2)
|
|
319
|
-
return q;
|
|
320
|
-
if (t < 2 / 3)
|
|
321
|
-
return p + (q - p) * (2 / 3 - t) * 6;
|
|
322
|
-
return p;
|
|
323
|
-
};
|
|
324
|
-
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
325
|
-
const p = 2 * l - q;
|
|
326
|
-
r = hue2rgb(p, q, h + 1 / 3);
|
|
327
|
-
g = hue2rgb(p, q, h);
|
|
328
|
-
b = hue2rgb(p, q, h - 1 / 3);
|
|
329
|
-
}
|
|
330
|
-
return {
|
|
331
|
-
r: Math.round(r * 255),
|
|
332
|
-
g: Math.round(g * 255),
|
|
333
|
-
b: Math.round(b * 255),
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
setColorFromHex(hexColor, updateCanvas = true, emitChanges = false) {
|
|
337
|
-
// Remove # if present
|
|
338
|
-
hexColor = hexColor.replace(/^#/, "");
|
|
339
|
-
let r, g, b, a = 1;
|
|
340
|
-
// Parse hex values based on string length
|
|
341
|
-
if (hexColor.length === 3) {
|
|
342
|
-
// Short hex (#RGB)
|
|
343
|
-
r = Number.parseInt(hexColor.charAt(0) + hexColor.charAt(0), 16);
|
|
344
|
-
g = Number.parseInt(hexColor.charAt(1) + hexColor.charAt(1), 16);
|
|
345
|
-
b = Number.parseInt(hexColor.charAt(2) + hexColor.charAt(2), 16);
|
|
346
|
-
}
|
|
347
|
-
else if (hexColor.length === 6) {
|
|
348
|
-
// Standard hex (#RRGGBB)
|
|
349
|
-
r = Number.parseInt(hexColor.substring(0, 2), 16);
|
|
350
|
-
g = Number.parseInt(hexColor.substring(2, 4), 16);
|
|
351
|
-
b = Number.parseInt(hexColor.substring(4, 6), 16);
|
|
352
|
-
}
|
|
353
|
-
else if (hexColor.length === 8) {
|
|
354
|
-
// Hex with alpha (#RRGGBBAA)
|
|
355
|
-
r = Number.parseInt(hexColor.substring(0, 2), 16);
|
|
356
|
-
g = Number.parseInt(hexColor.substring(2, 4), 16);
|
|
357
|
-
b = Number.parseInt(hexColor.substring(4, 6), 16);
|
|
358
|
-
a = Number.parseInt(hexColor.substring(6, 8), 16) / 255;
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
// Invalid hex, use default
|
|
362
|
-
console.error("Invalid hex color format");
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
// Update RGB color
|
|
366
|
-
this.rgbColor = { r, g, b };
|
|
367
|
-
// Convert RGB to HSL
|
|
368
|
-
this.hslColor = this.rgbToHsl(this.rgbColor);
|
|
369
|
-
// Update alpha
|
|
370
|
-
this.alpha = Math.round(a * 100);
|
|
371
|
-
// Update selected color
|
|
372
|
-
const hex = this.rgbToHex(this.rgbColor, a);
|
|
373
|
-
if (emitChanges) {
|
|
374
|
-
this.model = hex;
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
this._model = hex;
|
|
378
|
-
}
|
|
379
|
-
if (updateCanvas) {
|
|
380
|
-
// Calculate indicator position
|
|
381
|
-
this.updateIndicatorPosition();
|
|
382
|
-
// Redraw components
|
|
383
|
-
this.drawColorGradient();
|
|
384
|
-
this.drawAlphaSlider();
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
updateIndicatorPosition() {
|
|
388
|
-
// Set X position based on saturation (0-100%)
|
|
389
|
-
this.indicatorX = this.hslColor.s;
|
|
390
|
-
// Calculate Y position based on lightness and saturation
|
|
391
|
-
if (this.hslColor.s == 0) {
|
|
392
|
-
// Left edge: lightness determines position
|
|
393
|
-
this.indicatorY = 100 - this.hslColor.l;
|
|
394
|
-
}
|
|
395
|
-
else {
|
|
396
|
-
// Rest of canvas: calculate based on max lightness for this saturation
|
|
397
|
-
const maxLightness = 100 - this.hslColor.s / 2;
|
|
398
|
-
// Ensure lightness is within valid range for this saturation
|
|
399
|
-
const adjustedLightness = Math.min(this.hslColor.l, maxLightness);
|
|
400
|
-
// Calculate Y position (0% at top, 100% at bottom)
|
|
401
|
-
if (maxLightness == 0) {
|
|
402
|
-
this.indicatorY = 100; // Avoid division by zero
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
this.indicatorY = ((maxLightness - adjustedLightness) / maxLightness) * 100;
|
|
406
|
-
}
|
|
407
|
-
// Constrain to canvas bounds
|
|
408
|
-
this.indicatorY = Math.max(0, Math.min(100, this.indicatorY));
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
rgbToHsl(rgb) {
|
|
412
|
-
var r = rgb.r / 255;
|
|
413
|
-
var g = rgb.g / 255;
|
|
414
|
-
var b = rgb.b / 255;
|
|
415
|
-
const max = Math.max(r, g, b);
|
|
416
|
-
const min = Math.min(r, g, b);
|
|
417
|
-
let h = 0, s = 0;
|
|
418
|
-
const l = (max + min) / 2;
|
|
419
|
-
if (max !== min) {
|
|
420
|
-
const d = max - min;
|
|
421
|
-
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
422
|
-
switch (max) {
|
|
423
|
-
case r:
|
|
424
|
-
h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
|
|
425
|
-
break;
|
|
426
|
-
case g:
|
|
427
|
-
h = ((b - r) / d + 2) / 6;
|
|
428
|
-
break;
|
|
429
|
-
case b:
|
|
430
|
-
h = ((r - g) / d + 4) / 6;
|
|
431
|
-
break;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
return {
|
|
435
|
-
h: Math.round(h * 360),
|
|
436
|
-
s: Math.round(s * 100),
|
|
437
|
-
l: Math.round(l * 100),
|
|
438
|
-
};
|
|
439
|
-
}
|
|
440
|
-
rgbToHex(rgb, a = 1) {
|
|
441
|
-
var { r, g, b } = rgb;
|
|
442
|
-
const alphaHex = Math.round(a * 255)
|
|
443
|
-
.toString(16)
|
|
444
|
-
.padStart(2, "0");
|
|
445
|
-
return ("#" +
|
|
446
|
-
[r, g, b]
|
|
447
|
-
.map((x) => {
|
|
448
|
-
const hex = x.toString(16);
|
|
449
|
-
return hex.length === 1 ? "0" + hex : hex;
|
|
450
|
-
})
|
|
451
|
-
.join("") +
|
|
452
|
-
(a < 1 ? alphaHex : "")).toUpperCase();
|
|
453
|
-
}
|
|
454
|
-
getRgbaString() {
|
|
455
|
-
const { r, g, b } = this.rgbColor;
|
|
456
|
-
const a = this.alpha / 100;
|
|
457
|
-
return `rgba(${r}, ${g}, ${b}, ${a})`;
|
|
458
|
-
}
|
|
459
|
-
getHslaString() {
|
|
460
|
-
return `hsla(${this.hslColor.h}, ${this.hslColor.s}%, ${this.hslColor.l}%, ${this.alpha / 100})`;
|
|
461
|
-
}
|
|
462
|
-
async CopyToClipboard() {
|
|
463
|
-
await Clipboard.write({
|
|
464
|
-
string: this.model
|
|
465
|
-
});
|
|
466
|
-
await this.genericService.PresentToastSuccess(`${this.model} copiada para a área de transferência!`);
|
|
467
|
-
}
|
|
468
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputColorComponent, deps: [{ token: i1.GenericService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
469
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: InputColorComponent, selector: "input-color", providers: InputProviderFactory.GetProvider(InputColorComponent), viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }, { propertyName: "hueSlider", first: true, predicate: ["hueSlider"], descendants: true }, { propertyName: "alphaSlider", first: true, predicate: ["alphaSlider"], descendants: true }, { propertyName: "Popover", first: true, predicate: IonPopover, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card class=\"focus-within:on-focus ion-card-input !rounded-r-none\" [disabled]=\"loading || disabled\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <div class=\"flex\">\r\n <ion-item class=\"w-full\" [ngClass]=\"{'submitted': submitted, 'invalid': invalid, 'required': required}\" lines=\"none\">\r\n <ion-input (ionBlur)=\"blur.emit(model)\" [maxlength]=\"9\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n @if (label) {\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n }\r\n </ion-input>\r\n </ion-item>\r\n </div>\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12 shrink-0\" > \r\n <ion-button (click)=\"Present($event)\" [disabled]=\"loading || disabled\" class=\"m-0 h-full w-full rounded-r-2xl on-hover [--border-radius:0rem_1rem_1rem_0rem]\" style=\"--border-width: 1px 1px 2px 1px;\" size=\"small\" color=\"medium\" fill=\"outline\"> \r\n <ion-icon class=\"fill-rainbow\" slot=\"icon-only\" name=\"color-palette\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n</div>\r\n\r\n<ion-popover #popover [keepContentsMounted]=\"true\">\r\n <ng-template>\r\n <ion-card class=\"m-0\">\r\n <ion-card-content class=\"p-0 relative\">\r\n <loading [type]=\"3\" [loading]=\"rendering\" text=\"\"></loading>\r\n <div class=\"size-full p-3 flex gap-2\">\r\n <div class=\"h-[12.5rem] flex flex-col gap-1 w-44\">\r\n <div class=\"w-full h-32 relative\">\r\n <canvas #canvas width=\"176\" height=\"128\" class=\"size-full rounded-sm translucid-border\"></canvas>\r\n \r\n <div class=\"color-indicator quick-transition\" [style.left.%]=\"indicatorX\" [style.top.%]=\"indicatorY\"></div>\r\n </div>\r\n \r\n <div class=\"w-full flex shrink-0\">\r\n <div class=\"w-full grid grid-cols-5 gap-1\">\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#000000FF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#3880ffff' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#2dd36fff' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#ffc409ff' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#eb445aff' }\"></ng-container>\r\n \r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#FFFFFFFF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#59168bFF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#c6005cFF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#fb2c36FF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#314158FF' }\"></ng-container>\r\n \r\n <ng-template #templateColor let-color>\r\n <div class=\"size-8 rounded translucid-border cursor-pointer\" (click)=\"setColorFromHex(color, true, true)\" [style]=\"{ 'background': color }\"></div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"h-[12.5rem] flex flex-col gap-2 w-44\">\r\n <div class=\"w-full relative\">\r\n <canvas #hueSlider class=\"w-full rounded h-[22px]\" width=\"176\" height=\"22\"></canvas>\r\n <div class=\"indicator quick-transition\" [style.left.%]=\"hslColor.h / 3.6\"></div>\r\n </div>\r\n <div class=\"w-full relative\">\r\n <canvas #alphaSlider class=\"w-full rounded h-[22px]\" width=\"176\" height=\"22\"></canvas>\r\n <div class=\"indicator quick-transition\" [style.left.%]=\"alpha\"></div>\r\n </div>\r\n \r\n <div class=\"flex flex-col gap-1\">\r\n <div class=\"flex items-center justify-center w-full h-fit gap-1 overflow-hidden\">\r\n <div class=\"size-10 relative z-10 shrink-0 flex items-center justify-center\">\r\n <div class=\"size-full z-10 rounded translucid-border absolute left-0 top-0\" [style.background]=\"getRgbaString()\"></div>\r\n <ion-icon class=\"z-0 opacity-50\" color=\"dark\" name=\"color-fill\"></ion-icon>\r\n </div>\r\n \r\n <div class=\"h-full shrink text-sm flex flex-col items-start justify-center\">\r\n <ion-text>Hex</ion-text>\r\n <input [value]=\"model\" (change)=\"setColorFromHex($event.target['value'])\" class=\"w-full\"/>\r\n </div>\r\n \r\n <ion-button (click)=\"CopyToClipboard()\" class=\"aspect-square\" style=\"--border-radius: .25rem\" size=\"small\">\r\n <ion-icon slot=\"icon-only\" name=\"clipboard\"></ion-icon>\r\n </ion-button>\r\n </div> \r\n \r\n <div class=\"w-full flex gap-1 overflow-hidden text-sm\">\r\n <div class=\"w-full shrink\">\r\n <ion-text>R</ion-text>\r\n <input [(ngModel)]=\"rgbColor.r\" (change)=\"updateSelectedColor(); updateIndicatorPositions(); this.drawColorGradient()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>G</ion-text>\r\n <input [(ngModel)]=\"rgbColor.g\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>B</ion-text>\r\n <input [(ngModel)]=\"rgbColor.b\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>A</ion-text>\r\n <input [(ngModel)]=\"alpha\" class=\"w-full\"/>\r\n </div>\r\n </div>\r\n \r\n <div class=\"w-full flex gap-1 overflow-hidden text-sm\">\r\n <div class=\"w-full shrink\">\r\n <ion-text>H</ion-text>\r\n <input [(ngModel)]=\"hslColor.h\" (change)=\"updateSelectedColor(); updateIndicatorPositions(); this.drawColorGradient()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>L</ion-text>\r\n <input [(ngModel)]=\"hslColor.l\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>S</ion-text>\r\n <input [(ngModel)]=\"hslColor.s\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>A</ion-text>\r\n <input [(ngModel)]=\"alpha\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ion-card-content>\r\n </ion-card>\r\n </ng-template>\r\n</ion-popover>\r\n", styles: ["input:focus{outline:solid 1px color-mix(in srgb,var(--ion-color-primary) 30%,transparent)}input{height:1.25rem;border-radius:.25rem;outline:1px solid transparent;transition-property:outline;transition-duration:.2s}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none}input[type=number]{-moz-appearance:textfield}.color-indicator{position:absolute;width:12px;height:12px;border-radius:50%;border:2px solid white;box-shadow:0 0 2px #00000080;transform:translate(-50%,-50%);pointer-events:none}.indicator{position:absolute;top:50%;width:6px;height:24px;background-color:#fff;border-radius:3px;box-shadow:0 0 2px #00000080;transform:translate(-50%,-50%);pointer-events:none}.quick-transition{transition:all 75ms}ion-popover{--width: fit-content;--height: fit-content}\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i3.TextValueAccessor, selector: "ion-input:not([type=number]),ion-input-otp[type=text],ion-textarea,ion-searchbar" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.LoadingComponent, selector: "loading", inputs: ["text", "type", "loading"] }, { kind: "component", type: i6.InputLoadingComponent, selector: "input-loading", inputs: ["loading"] }] }); }
|
|
470
|
-
}
|
|
471
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputColorComponent, decorators: [{
|
|
472
|
-
type: Component,
|
|
473
|
-
args: [{ selector: 'input-color', providers: InputProviderFactory.GetProvider(InputColorComponent), template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card class=\"focus-within:on-focus ion-card-input !rounded-r-none\" [disabled]=\"loading || disabled\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <div class=\"flex\">\r\n <ion-item class=\"w-full\" [ngClass]=\"{'submitted': submitted, 'invalid': invalid, 'required': required}\" lines=\"none\">\r\n <ion-input (ionBlur)=\"blur.emit(model)\" [maxlength]=\"9\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n @if (label) {\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n }\r\n </ion-input>\r\n </ion-item>\r\n </div>\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12 shrink-0\" > \r\n <ion-button (click)=\"Present($event)\" [disabled]=\"loading || disabled\" class=\"m-0 h-full w-full rounded-r-2xl on-hover [--border-radius:0rem_1rem_1rem_0rem]\" style=\"--border-width: 1px 1px 2px 1px;\" size=\"small\" color=\"medium\" fill=\"outline\"> \r\n <ion-icon class=\"fill-rainbow\" slot=\"icon-only\" name=\"color-palette\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n</div>\r\n\r\n<ion-popover #popover [keepContentsMounted]=\"true\">\r\n <ng-template>\r\n <ion-card class=\"m-0\">\r\n <ion-card-content class=\"p-0 relative\">\r\n <loading [type]=\"3\" [loading]=\"rendering\" text=\"\"></loading>\r\n <div class=\"size-full p-3 flex gap-2\">\r\n <div class=\"h-[12.5rem] flex flex-col gap-1 w-44\">\r\n <div class=\"w-full h-32 relative\">\r\n <canvas #canvas width=\"176\" height=\"128\" class=\"size-full rounded-sm translucid-border\"></canvas>\r\n \r\n <div class=\"color-indicator quick-transition\" [style.left.%]=\"indicatorX\" [style.top.%]=\"indicatorY\"></div>\r\n </div>\r\n \r\n <div class=\"w-full flex shrink-0\">\r\n <div class=\"w-full grid grid-cols-5 gap-1\">\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#000000FF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#3880ffff' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#2dd36fff' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#ffc409ff' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#eb445aff' }\"></ng-container>\r\n \r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#FFFFFFFF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#59168bFF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#c6005cFF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#fb2c36FF' }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"templateColor; context: { $implicit: '#314158FF' }\"></ng-container>\r\n \r\n <ng-template #templateColor let-color>\r\n <div class=\"size-8 rounded translucid-border cursor-pointer\" (click)=\"setColorFromHex(color, true, true)\" [style]=\"{ 'background': color }\"></div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"h-[12.5rem] flex flex-col gap-2 w-44\">\r\n <div class=\"w-full relative\">\r\n <canvas #hueSlider class=\"w-full rounded h-[22px]\" width=\"176\" height=\"22\"></canvas>\r\n <div class=\"indicator quick-transition\" [style.left.%]=\"hslColor.h / 3.6\"></div>\r\n </div>\r\n <div class=\"w-full relative\">\r\n <canvas #alphaSlider class=\"w-full rounded h-[22px]\" width=\"176\" height=\"22\"></canvas>\r\n <div class=\"indicator quick-transition\" [style.left.%]=\"alpha\"></div>\r\n </div>\r\n \r\n <div class=\"flex flex-col gap-1\">\r\n <div class=\"flex items-center justify-center w-full h-fit gap-1 overflow-hidden\">\r\n <div class=\"size-10 relative z-10 shrink-0 flex items-center justify-center\">\r\n <div class=\"size-full z-10 rounded translucid-border absolute left-0 top-0\" [style.background]=\"getRgbaString()\"></div>\r\n <ion-icon class=\"z-0 opacity-50\" color=\"dark\" name=\"color-fill\"></ion-icon>\r\n </div>\r\n \r\n <div class=\"h-full shrink text-sm flex flex-col items-start justify-center\">\r\n <ion-text>Hex</ion-text>\r\n <input [value]=\"model\" (change)=\"setColorFromHex($event.target['value'])\" class=\"w-full\"/>\r\n </div>\r\n \r\n <ion-button (click)=\"CopyToClipboard()\" class=\"aspect-square\" style=\"--border-radius: .25rem\" size=\"small\">\r\n <ion-icon slot=\"icon-only\" name=\"clipboard\"></ion-icon>\r\n </ion-button>\r\n </div> \r\n \r\n <div class=\"w-full flex gap-1 overflow-hidden text-sm\">\r\n <div class=\"w-full shrink\">\r\n <ion-text>R</ion-text>\r\n <input [(ngModel)]=\"rgbColor.r\" (change)=\"updateSelectedColor(); updateIndicatorPositions(); this.drawColorGradient()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>G</ion-text>\r\n <input [(ngModel)]=\"rgbColor.g\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>B</ion-text>\r\n <input [(ngModel)]=\"rgbColor.b\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>A</ion-text>\r\n <input [(ngModel)]=\"alpha\" class=\"w-full\"/>\r\n </div>\r\n </div>\r\n \r\n <div class=\"w-full flex gap-1 overflow-hidden text-sm\">\r\n <div class=\"w-full shrink\">\r\n <ion-text>H</ion-text>\r\n <input [(ngModel)]=\"hslColor.h\" (change)=\"updateSelectedColor(); updateIndicatorPositions(); this.drawColorGradient()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>L</ion-text>\r\n <input [(ngModel)]=\"hslColor.l\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>S</ion-text>\r\n <input [(ngModel)]=\"hslColor.s\" (change)=\"updateSelectedColor(); updateIndicatorPositions()\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n <div class=\"w-full shrink\">\r\n <ion-text>A</ion-text>\r\n <input [(ngModel)]=\"alpha\" type=\"number\" class=\"w-full\"/>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ion-card-content>\r\n </ion-card>\r\n </ng-template>\r\n</ion-popover>\r\n", styles: ["input:focus{outline:solid 1px color-mix(in srgb,var(--ion-color-primary) 30%,transparent)}input{height:1.25rem;border-radius:.25rem;outline:1px solid transparent;transition-property:outline;transition-duration:.2s}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none}input[type=number]{-moz-appearance:textfield}.color-indicator{position:absolute;width:12px;height:12px;border-radius:50%;border:2px solid white;box-shadow:0 0 2px #00000080;transform:translate(-50%,-50%);pointer-events:none}.indicator{position:absolute;top:50%;width:6px;height:24px;background-color:#fff;border-radius:3px;box-shadow:0 0 2px #00000080;transform:translate(-50%,-50%);pointer-events:none}.quick-transition{transition:all 75ms}ion-popover{--width: fit-content;--height: fit-content}\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"] }]
|
|
474
|
-
}], ctorParameters: () => [{ type: i1.GenericService }], propDecorators: { canvas: [{
|
|
475
|
-
type: ViewChild,
|
|
476
|
-
args: ['canvas']
|
|
477
|
-
}], hueSlider: [{
|
|
478
|
-
type: ViewChild,
|
|
479
|
-
args: ["hueSlider"]
|
|
480
|
-
}], alphaSlider: [{
|
|
481
|
-
type: ViewChild,
|
|
482
|
-
args: ["alphaSlider"]
|
|
483
|
-
}], Popover: [{
|
|
484
|
-
type: ViewChild,
|
|
485
|
-
args: [IonPopover]
|
|
486
|
-
}] } });
|
|
487
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtY29sb3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2lucHV0cy9pbnB1dC1jb2xvci9pbnB1dC1jb2xvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXRzL2lucHV0LWNvbG9yL2lucHV0LWNvbG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7QUFXcEUsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGlCQUF5QjtJQUVoRSxZQUNVLGNBQThCO1FBQ3BDLEtBQUssRUFBRSxDQUFDO1FBREYsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBd0J4QyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBY2xCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBR3pCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBRzVCLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUM3QixzQkFBaUIsR0FBVyxDQUFDLENBQUM7UUFFOUIsZUFBVSxHQUFHLEtBQUssQ0FBQTtRQUNsQixrQkFBYSxHQUFHLEtBQUssQ0FBQTtRQUNyQixvQkFBZSxHQUFHLEtBQUssQ0FBQTtRQUUvQixhQUFRLEdBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hDLGFBQVEsR0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDekMsVUFBSyxHQUFlLENBQUMsQ0FBQTtRQUVyQixlQUFVLEdBQVcsR0FBRyxDQUFBO1FBQ3hCLGVBQVUsR0FBVyxDQUFDLENBQUE7SUF6RFQsQ0FBQztJQU9MLFVBQVUsQ0FBQyxLQUFhLElBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ2hFLElBQWEsS0FBSyxLQUFrQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBRSxDQUFDO0lBQzFELElBQWEsS0FBSyxDQUFDLEtBQWEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTlGLFFBQVEsQ0FBQyxLQUFhLEVBQUUsU0FBa0IsS0FBSztRQUM3QyxJQUFHLEtBQUssRUFBQyxDQUFDO1lBQ1IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBRyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sRUFBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQzFCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUlELEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTTtRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDcEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQXdCRCxVQUFVO1FBQ1IsTUFBTSxNQUFNLEdBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsR0FBSSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRS9ELGVBQWU7UUFDZixNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sU0FBUyxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFBO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUksU0FBUyxDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXhDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN0RSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBSyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3BFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUVwRSxlQUFlO1FBQ2YsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3hFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN4RSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdEUsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLFdBQVcsR0FBUSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUN4RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUksV0FBVyxDQUFDLEtBQUssQ0FBQztRQUUzQyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFNUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQzFFLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNyRSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDeEUsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRXhFLGVBQWU7UUFDZixXQUFXLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM1RSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDMUUsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFM0IsZUFBZTtRQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUV4RCxrREFBa0Q7UUFDbEQsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLENBQUE7UUFDcEQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRXZELDJDQUEyQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3pFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3RDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUE7UUFDdkQsR0FBRyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUE7UUFDN0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRXZELHlDQUF5QztRQUN6QyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUE7UUFDakQsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdEMsR0FBRyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUE7UUFDN0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUV2QixzQkFBc0I7UUFDdEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUN2RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3hELENBQUM7UUFFRCxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQTtRQUN4QixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFBO1FBQ3pCLE1BQU0sS0FBSyxHQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7UUFFckMsZUFBZTtRQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFFbEMsK0NBQStDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQTtRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUMxRCxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7Z0JBQzlDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFDNUMsQ0FBQztRQUNILENBQUM7UUFHRCx3QkFBd0I7UUFDeEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2pFLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWpFLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO1FBQ3hCLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFhO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsSUFBSSxDQUFDLENBQWE7UUFDaEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBYTtRQUN2QixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1lBQzlELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1lBQ25DLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQTtZQUNsQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLENBQWE7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsT0FBTyxDQUFDLENBQWE7UUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtJQUM1QixDQUFDO0lBRUQsY0FBYyxDQUFDLENBQWE7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7UUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsU0FBUyxDQUFDLENBQWE7UUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQTtJQUM5QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsQ0FBYTtRQUM1QixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1FBQzdCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1lBQ25FLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1lBQ25DLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxDQUFhO1FBQzFCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDM0IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUE7WUFDakUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMxQixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsQ0FBUztRQUMxQiwrQkFBK0I7UUFDL0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO1FBRWpELDRDQUE0QztRQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUU3RCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFeEIscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUV0Qix3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxDQUFTO1FBQzVCLCtCQUErQjtRQUMvQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQTtRQUVuRCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO1FBRTFELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVELG9CQUFvQixDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ3ZDLHlDQUF5QztRQUN6QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO1FBRS9DLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFBO1FBRS9DLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM3QyxnQ0FBZ0M7UUFDaEMsK0dBQStHO1FBQy9HLDhEQUE4RDtRQUM5RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLCtEQUErRDtZQUMvRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDckQsQ0FBQzthQUFNLENBQUM7WUFDTiw0RkFBNEY7WUFDNUYsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUE7UUFDckYsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFaEUscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0lBRUQsbUJBQW1CLENBQUMsYUFBNEIsSUFBSSxFQUFFLFlBQTJCLElBQUksRUFBRSxjQUF1QixLQUFLO1FBRWpILG9CQUFvQjtRQUNwQixJQUFHLFVBQVUsSUFBSSxJQUFJLEVBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUE7UUFDOUIsQ0FBQztRQUNELElBQUcsU0FBUyxJQUFJLElBQUksRUFBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUM3QixDQUFDO1FBQ0QscUJBQXFCO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFBO1FBRW5CLHFCQUFxQjtRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELElBQUcsV0FBVyxFQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQTtRQUFDLENBQUM7YUFBSSxDQUFDO1lBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUE7UUFBQyxDQUFDO1FBRTVELDBCQUEwQjtRQUMxQiw0Q0FBNEM7SUFDOUMsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVsQyxvQ0FBb0M7UUFDcEMsNENBQTRDO1FBQzVDLGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBUTtRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXBCLElBQUksQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLENBQUE7UUFFbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDWixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxhQUFhO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFO2dCQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTyxDQUFDLENBQUE7Z0JBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ25ELE9BQU8sQ0FBQyxDQUFBO1lBQ1YsQ0FBQyxDQUFBO1lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFbkIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDNUIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3BCLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQzlCLENBQUM7UUFFRCxPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUN0QixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDdkIsQ0FBQTtJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsUUFBZ0IsRUFBRSxlQUF3QixJQUFJLEVBQUUsY0FBdUIsS0FBSztRQUMxRixzQkFBc0I7UUFDdEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRXJDLElBQUksQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUUxQywwQ0FBMEM7UUFDMUMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLG1CQUFtQjtZQUNuQixDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDaEUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ2hFLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNsRSxDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLHlCQUF5QjtZQUN6QixDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNqRCxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNqRCxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNuRCxDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLDZCQUE2QjtZQUM3QixDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNqRCxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNqRCxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNqRCxDQUFDLEdBQUcsTUFBTSxDQUFDLFFB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UUFBUSxDQUFBO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFBO1FBQzFCLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2xHLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ25CLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLHdDQUF3QyxDQUFDLENBQUM7SUFDdkcsQ0FBQzsrR0E5aEJVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHNDQUZuQixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsNFVBNEJyRCxVQUFVLHVFQzNDdkIsZ3hQQW9JQTs7NEZEbkhhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxhQUFhLGFBR1osb0JBQW9CLENBQUMsV0FBVyxxQkFBcUI7bUZBU3RDLE1BQU07c0JBQS9CLFNBQVM7dUJBQUMsUUFBUTtnQkFDTyxTQUFTO3NCQUFsQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0ksV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQWlCRCxPQUFPO3NCQUE3QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkJztcclxuaW1wb3J0IHsgSW9uUG9wb3ZlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuXHJcbmltcG9ydCB7IElucHV0UHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi4vaW5wdXQtcHJvdmlkZXItZmFjdG9yeSc7XHJcbmltcG9ydCB7IEN1c3RvbVNpZ25hbElucHV0IH0gZnJvbSAnLi4vY3VzdG9tLXNpZ25hbC1pbnB1dCc7XHJcbmltcG9ydCB7IEdlbmVyaWNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2VuZXJpY3Muc2VydmljZSc7XHJcblxyXG50eXBlIFJHQiA9IHsgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciB9O1xyXG50eXBlIEhTTCA9IHsgaDogbnVtYmVyLCBsOiBudW1iZXIsIHM6IG51bWJlciB9O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpbnB1dC1jb2xvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LWNvbG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pbnB1dC1jb2xvci5jb21wb25lbnQuc2NzcycsICcuLi9pbnB1dHMuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogSW5wdXRQcm92aWRlckZhY3RvcnkuR2V0UHJvdmlkZXIoSW5wdXRDb2xvckNvbXBvbmVudClcclxufSlcclxuZXhwb3J0IGNsYXNzIElucHV0Q29sb3JDb21wb25lbnQgZXh0ZW5kcyBDdXN0b21TaWduYWxJbnB1dDxzdHJpbmc+IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGdlbmVyaWNTZXJ2aWNlOiBHZW5lcmljU2VydmljZVxyXG4gICkgeyBzdXBlcigpOyB9XHJcblxyXG4gIFxyXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycgICAgICkgY2FudmFzOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKFwiaHVlU2xpZGVyXCIgICkgaHVlU2xpZGVyOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PlxyXG4gIEBWaWV3Q2hpbGQoXCJhbHBoYVNsaWRlclwiKSBhbHBoYVNsaWRlcjogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD5cclxuXHJcbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKXsgdGhpcy5zZXRNb2RlbCh2YWx1ZSwgdHJ1ZSkgfVxyXG4gIG92ZXJyaWRlIGdldCBtb2RlbCgpOiBzdHJpbmcgICAgICB7IHJldHVybiB0aGlzLl9tb2RlbDsgIH1cclxuICBvdmVycmlkZSBzZXQgbW9kZWwodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldE1vZGVsKHZhbHVlKTsgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5fbW9kZWwpOyB9XHJcblxyXG4gIHNldE1vZGVsKHZhbHVlOiBzdHJpbmcsIHJlZHJhdzogYm9vbGVhbiA9IGZhbHNlKXtcclxuICAgIGlmKHZhbHVlKXtcclxuICAgICAgdGhpcy5zZXRDb2xvckZyb21IZXgodmFsdWUsIGZhbHNlKTtcclxuICAgICAgaWYodGhpcy5jYW52YXNDdHggJiYgcmVkcmF3KXtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQ29sb3IoKTsgXHJcbiAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JQb3NpdGlvbnMoKTsgXHJcbiAgICAgICAgdGhpcy5kcmF3Q29sb3JHcmFkaWVudCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoSW9uUG9wb3ZlcikgUG9wb3ZlcjogSW9uUG9wb3ZlcjtcclxuICByZW5kZXJpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGFzeW5jIFByZXNlbnQoJGV2ZW50KXtcclxuICAgIHRoaXMucmVuZGVyaW5nID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMuUG9wb3Zlci5wcmVzZW50KCRldmVudCk7XHJcbiAgICBcclxuICAgIHRoaXMuaW5pdENhbnZhcygpXHJcbiAgICB0aGlzLmluaXRIdWVTbGlkZXIoKVxyXG4gICAgdGhpcy5pbml0QWxwaGFTbGlkZXIoKVxyXG4gICAgdGhpcy5kcmF3Q29sb3JHcmFkaWVudCgpXHJcbiAgICB0aGlzLmRyYXdIdWVTbGlkZXIoKVxyXG4gICAgdGhpcy5kcmF3QWxwaGFTbGlkZXIoKVxyXG4gICAgdGhpcy5yZW5kZXJpbmcgPSBmYWxzZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBjYW52YXNDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICBwcml2YXRlIGNhbnZhc1dpZHRoOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgY2FudmFzSGVpZ2h0OiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIGh1ZUN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xyXG4gIHByaXZhdGUgaHVlU2xpZGVyV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBodWVTbGlkZXJIZWlnaHQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgYWxwaGFDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICBwcml2YXRlIGFscGhhU2xpZGVyV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBhbHBoYVNsaWRlckhlaWdodDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2VcclxuICBwcml2YXRlIGlzSHVlRHJhZ2dpbmcgPSBmYWxzZVxyXG4gIHByaXZhdGUgaXNBbHBoYURyYWdnaW5nID0gZmFsc2VcclxuXHJcbiAgcmdiQ29sb3IgOiBSR0IgPSB7IHI6IDI1NSwgZzogMCwgYjogMCB9O1xyXG4gIGhzbENvbG9yIDogSFNMID0geyBoOiAwLCBzOiAxMDAsIGw6IDUwIH07XHJcbiAgYWxwaGEgICAgOiBudW1iZXIgPSAwXHJcblxyXG4gIGluZGljYXRvclg6IG51bWJlciA9IDEwMFxyXG4gIGluZGljYXRvclk6IG51bWJlciA9IDBcclxuXHJcbiAgaW5pdENhbnZhcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNhbnZhcyAgICAgID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuY2FudmFzV2lkdGggID0gY2FudmFzLndpZHRoOyBcclxuICAgIHRoaXMuY2FudmFzSGVpZ2h0ID0gY2FudmFzLmhlaWdodDsgXHJcbiAgICB0aGlzLmNhbnZhc0N0eCAgICA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nICwgdGhpcy5zdGFydERyYWcuYmluZCh0aGlzKSk7XHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyAsIHRoaXMuZHJhZy5iaW5kKHRoaXMpKTtcclxuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyAgICwgdGhpcy5lbmREcmFnLmJpbmQodGhpcykpO1xyXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmVuZERyYWcuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgLy8gVG91Y2ggZXZlbnRzXHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2guYmluZCh0aGlzKSk7XHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJyAsIHRoaXMuaGFuZGxlVG91Y2guYmluZCh0aGlzKSk7XHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnICAsIHRoaXMuZW5kRHJhZy5iaW5kKHRoaXMpKTtcclxuICB9XHJcblxyXG4gIGluaXRIdWVTbGlkZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBodWVTbGlkZXIgID0gdGhpcy5odWVTbGlkZXIubmF0aXZlRWxlbWVudFxyXG4gICAgdGhpcy5odWVTbGlkZXJXaWR0aCAgPSBodWVTbGlkZXIud2lkdGg7XHJcbiAgICB0aGlzLmh1ZVNsaWRlckhlaWdodCA9IGh1ZVNsaWRlci5oZWlnaHQ7XHJcbiAgICB0aGlzLmh1ZUN0eCA9IGh1ZVNsaWRlci5nZXRDb250ZXh0KFwiMmRcIilcclxuXHJcbiAgICBodWVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiICwgdGhpcy5zdGFydEh1ZURyYWcuYmluZCh0aGlzKSlcclxuICAgIGh1ZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIgLCB0aGlzLmh1ZURyYWcuYmluZCh0aGlzKSlcclxuICAgIGh1ZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiICAgLCB0aGlzLmVuZEh1ZURyYWcuYmluZCh0aGlzKSlcclxuICAgIGh1ZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLmVuZEh1ZURyYWcuYmluZCh0aGlzKSlcclxuXHJcbiAgICAvLyBUb3VjaCBldmVudHNcclxuICAgIGh1ZVNsaWRlci5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCB0aGlzLmhhbmRsZUh1ZVRvdWNoLmJpbmQodGhpcykpXHJcbiAgICBodWVTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiICwgdGhpcy5oYW5kbGVIdWVUb3VjaC5iaW5kKHRoaXMpKVxyXG4gICAgaHVlU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiICAsIHRoaXMuZW5kSHVlRHJhZy5iaW5kKHRoaXMpKVxyXG4gIH1cclxuXHJcbiAgaW5pdEFscGhhU2xpZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWxwaGFTbGlkZXIgICAgICA9IHRoaXMuYWxwaGFTbGlkZXIubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuYWxwaGFTbGlkZXJIZWlnaHQgPSBhbHBoYVNsaWRlci5oZWlnaHQ7XHJcbiAgICB0aGlzLmFscGhhU2xpZGVyV2lkdGggID0gYWxwaGFTbGlkZXIud2lkdGg7XHJcblxyXG4gICAgdGhpcy5hbHBoYUN0eCA9IGFscGhhU2xpZGVyLmdldENvbnRleHQoXCIyZFwiKVxyXG5cclxuICAgIGFscGhhU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiAsIHRoaXMuc3RhcnRBbHBoYURyYWcuYmluZCh0aGlzKSlcclxuICAgIGFscGhhU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiAsIHRoaXMuYWxwaGFEcmFnLmJpbmQodGhpcykpXHJcbiAgICBhbHBoYVNsaWRlci5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiICAgLCB0aGlzLmVuZEFscGhhRHJhZy5iaW5kKHRoaXMpKVxyXG4gICAgYWxwaGFTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy5lbmRBbHBoYURyYWcuYmluZCh0aGlzKSlcclxuXHJcbiAgICAvLyBUb3VjaCBldmVudHNcclxuICAgIGFscGhhU2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIHRoaXMuaGFuZGxlQWxwaGFUb3VjaC5iaW5kKHRoaXMpKVxyXG4gICAgYWxwaGFTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiICwgdGhpcy5oYW5kbGVBbHBoYVRvdWNoLmJpbmQodGhpcykpXHJcbiAgICBhbHBoYVNsaWRlci5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiAgLCB0aGlzLmVuZEFscGhhRHJhZy5iaW5kKHRoaXMpKVxyXG4gIH1cclxuXHJcbiAgZHJhd0NvbG9yR3JhZGllbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjdHggPSB0aGlzLmNhbnZhc0N0eDtcclxuXHJcbiAgICAvLyBDbGVhciBjYW52YXNcclxuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXNXaWR0aCwgdGhpcy5jYW52YXNIZWlnaHQpXHJcblxyXG4gICAgLy8gRHJhdyB0aGUgcHVyZSBodWUgY29sb3IgYXQgdGhlIHRvcC1yaWdodCBjb3JuZXJcclxuICAgIGN0eC5maWxsU3R5bGUgPSBgaHNsKCR7dGhpcy5oc2xDb2xvci5ofSwgMTAwJSwgNTAlKWBcclxuICAgIGN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhc1dpZHRoLCB0aGlzLmNhbnZhc0hlaWdodClcclxuXHJcbiAgICAvLyBXaGl0ZSBncmFkaWVudCAoaG9yaXpvbnRhbCAtIHNhdHVyYXRpb24pXHJcbiAgICBjb25zdCB3aGl0ZUdyYWRpZW50ID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIHRoaXMuY2FudmFzV2lkdGgsIDApXHJcbiAgICB3aGl0ZUdyYWRpZW50LmFkZENvbG9yU3RvcCgwLCBcIndoaXRlXCIpXHJcbiAgICB3aGl0ZUdyYWRpZW50LmFkZENvbG9yU3RvcCgxLCBcInJnYmEoMjU1LCAyNTUsIDI1NSwgMClcIilcclxuICAgIGN0eC5maWxsU3R5bGUgPSB3aGl0ZUdyYWRpZW50XHJcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXNXaWR0aCwgdGhpcy5jYW52YXNIZWlnaHQpXHJcblxyXG4gICAgLy8gQmxhY2sgZ3JhZGllbnQgKHZlcnRpY2FsIC0gYnJpZ2h0bmVzcylcclxuICAgIGNvbnN0IGJsYWNrR3JhZGllbnQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMCwgdGhpcy5jYW52YXNIZWlnaHQpXHJcbiAgICBibGFja0dyYWRpZW50LmFkZENvbG9yU3RvcCgwLCBcInJnYmEoMCwgMCwgMCwgMClcIilcclxuICAgIGJsYWNrR3JhZGllbnQuYWRkQ29sb3JTdG9wKDEsIFwiYmxhY2tcIilcclxuICAgIGN0eC5maWxsU3R5bGUgPSBibGFja0dyYWRpZW50XHJcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXNXaWR0aCwgdGhpcy5jYW52YXNIZWlnaHQpXHJcbiAgfVxyXG5cclxuICBkcmF3SHVlU2xpZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3R4ID0gdGhpcy5odWVDdHhcclxuXHJcbiAgICAvLyBDcmVhdGUgaHVlIGdyYWRpZW50XHJcbiAgICBjb25zdCBncmFkaWVudCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCB0aGlzLmh1ZVNsaWRlcldpZHRoLCAwKVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMzYwOyBpICs9IDYwKSB7XHJcbiAgICAgIGdyYWRpZW50LmFkZENvbG9yU3RvcChpIC8gMzYwLCBgaHNsKCR7aX0sIDEwMCUsIDUwJSlgKVxyXG4gICAgfVxyXG5cclxuICAgIGN0eC5maWxsU3R5bGUgPSBncmFkaWVudFxyXG4gICAgY3R4LmZpbGxSZWN0KDAsIDAsIHRoaXMuaHVlU2xpZGVyV2lkdGgsIHRoaXMuaHVlU2xpZGVySGVpZ2h0KVxyXG4gIH1cclxuXHJcbiAgZHJhd0FscGhhU2xpZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3R4ID0gdGhpcy5hbHBoYUN0eFxyXG4gICAgY29uc3Qgd2lkdGggID0gdGhpcy5hbHBoYVNsaWRlcldpZHRoXHJcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmFscGhhU2xpZGVySGVpZ2h0XHJcblxyXG4gICAgLy8gQ2xlYXIgY2FudmFzXHJcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXHJcblxyXG4gICAgLy8gQ3JlYXRlIGNoZWNrZXJib2FyZCBwYXR0ZXJuIGZvciB0cmFuc3BhcmVuY3lcclxuICAgIGNvbnN0IHNxdWFyZVNpemUgPSA4XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpICs9IHNxdWFyZVNpemUpIHtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWlnaHQ7IGogKz0gc3F1YXJlU2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IGlzRXZlbiA9IChpIC8gc3F1YXJlU2l6ZSArIGogLyBzcXVhcmVTaXplKSAlIDIgPT09IDBcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gaXNFdmVuID8gXCIjZmZmZmZmXCIgOiBcIiNjY2NjY2NcIlxyXG4gICAgICAgIGN0eC5maWxsUmVjdChpLCBqLCBzcXVhcmVTaXplLCBzcXVhcmVTaXplKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICAvLyBDcmVhdGUgYWxwaGEgZ3JhZGllbnRcclxuICAgIGNvbnN0IGdyYWRpZW50ID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIHdpZHRoLCAwKVxyXG4gICAgY29uc3QgcmdiID0gdGhpcy5oc2xUb1JnYih0aGlzLmhzbENvbG9yKTtcclxuXHJcbiAgICBncmFkaWVudC5hZGRDb2xvclN0b3AoMCwgYHJnYmEoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSwgMClgKVxyXG4gICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDEsIGByZ2JhKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0sIDEpYClcclxuXHJcbiAgICBjdHguZmlsbFN0eWxlID0gZ3JhZGllbnRcclxuICAgIGN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KVxyXG4gIH1cclxuXHJcbiAgc3RhcnREcmFnKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWVcclxuICAgIHRoaXMuaGFuZGxlQ29sb3JTZWxlY3Rpb24oZS5vZmZzZXRYLCBlLm9mZnNldFkpXHJcbiAgfVxyXG5cclxuICBkcmFnKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcclxuICAgICAgdGhpcy5oYW5kbGVDb2xvclNlbGVjdGlvbihlLm9mZnNldFgsIGUub2Zmc2V0WSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuZERyYWcoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlVG91Y2goZTogVG91Y2hFdmVudCk6IHZvaWQge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICBpZiAoZS50eXBlID09PSBcInRvdWNoc3RhcnRcIikge1xyXG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xyXG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXVxyXG4gICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdFxyXG4gICAgICBjb25zdCB5ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wXHJcbiAgICAgIHRoaXMuaGFuZGxlQ29sb3JTZWxlY3Rpb24oeCwgeSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0SHVlRHJhZyhlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzSHVlRHJhZ2dpbmcgPSB0cnVlXHJcbiAgICB0aGlzLmhhbmRsZUh1ZVNlbGVjdGlvbihlLm9mZnNldFgpXHJcbiAgfVxyXG5cclxuICBodWVEcmFnKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzSHVlRHJhZ2dpbmcpIHtcclxuICAgICAgdGhpcy5oYW5kbGVIdWVTZWxlY3Rpb24oZS5vZmZzZXRYKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW5kSHVlRHJhZygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNIdWVEcmFnZ2luZyA9IGZhbHNlXHJcbiAgfVxyXG5cclxuICBzdGFydEFscGhhRHJhZyhlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzQWxwaGFEcmFnZ2luZyA9IHRydWVcclxuICAgIHRoaXMuaGFuZGxlQWxwaGFTZWxlY3Rpb24oZS5vZmZzZXRYKVxyXG4gIH1cclxuXHJcbiAgYWxwaGFEcmFnKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzQWxwaGFEcmFnZ2luZykge1xyXG4gICAgICB0aGlzLmhhbmRsZUFscGhhU2VsZWN0aW9uKGUub2Zmc2V0WClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVuZEFscGhhRHJhZygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNBbHBoYURyYWdnaW5nID0gZmFsc2VcclxuICB9XHJcblxyXG4gIGhhbmRsZUFscGhhVG91Y2goZTogVG91Y2hFdmVudCk6IHZvaWQge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICBpZiAoZS50eXBlID09PSBcInRvdWNoc3RhcnRcIikge1xyXG4gICAgICB0aGlzLmlzQWxwaGFEcmFnZ2luZyA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0FscGhhRHJhZ2dpbmcpIHtcclxuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuYWxwaGFTbGlkZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXVxyXG4gICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdFxyXG4gICAgICB0aGlzLmhhbmRsZUFscGhhU2VsZWN0aW9uKHgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVIdWVUb3VjaChlOiBUb3VjaEV2ZW50KTogdm9pZCB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgIGlmIChlLnR5cGUgPT09IFwidG91Y2hzdGFydFwiKSB7XHJcbiAgICAgIHRoaXMuaXNIdWVEcmFnZ2luZyA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0h1ZURyYWdnaW5nKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmh1ZVNsaWRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdXHJcbiAgICAgIGNvbnN0IHggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0XHJcbiAgICAgIHRoaXMuaGFuZGxlSHVlU2VsZWN0aW9uKHgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVIdWVTZWxlY3Rpb24oeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAvLyBDb25zdHJhaW4geCB0byBjYW52YXMgYm91bmRzXHJcbiAgICB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oeCwgdGhpcy5odWVTbGlkZXJXaWR0aCkpXHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIGh1ZSBiYXNlZCBvbiB4IHBvc2l0aW9uICgwLTM2MClcclxuICAgIHRoaXMuaHNsQ29sb3IuaCA9IE1hdGgucm91bmQoKHggLyB0aGlzLmh1ZVNsaWRlcldpZHRoKSAqIDM2MClcclxuXHJcbiAgICAvLyBSZWRyYXcgY29sb3IgZ3JhZGllbnQgd2l0aCBuZXcgaHVlXHJcbiAgICB0aGlzLmRyYXdDb2xvckdyYWRpZW50KClcclxuXHJcbiAgICAvLyBSZWRyYXcgYWxwaGEgc2xpZGVyIHdpdGggbmV3IGNvbG9yXHJcbiAgICB0aGlzLmRyYXdBbHBoYVNsaWRlcigpXHJcblxyXG4gICAgLy8gVXBkYXRlIHNlbGVjdGVkIGNvbG9yXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQ29sb3IodGhpcy5oc2xDb2xvci5zLCB0aGlzLmhzbENvbG9yLmwsIHRydWUpXHJcbiAgfVxyXG5cclxuICBoYW5kbGVBbHBoYVNlbGVjdGlvbih4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIENvbnN0cmFpbiB4IHRvIGNhbnZhcyBib3VuZHNcclxuICAgIHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih4LCB0aGlzLmFscGhhU2xpZGVyV2lkdGgpKVxyXG5cclxuICAgIC8vIENhbGN1bGF0ZSBhbHBoYSBiYXNlZCBvbiB4IHBvc2l0aW9uICgwLTEwMClcclxuICAgIHRoaXMuYWxwaGEgPSBNYXRoLnJvdW5kKCh4IC8gdGhpcy5hbHBoYVNsaWRlcldpZHRoKSAqIDEwMClcclxuXHJcbiAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgY29sb3JcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb2xvcih0aGlzLmhzbENvbG9yLnMsIHRoaXMuaHNsQ29sb3IubCwgdHJ1ZSlcclxuICB9XHJcblxyXG4gIGhhbmRsZUNvbG9yU2VsZWN0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAvLyBDb25zdHJhaW4gY29vcmRpbmF0ZXMgdG8gY2FudmFzIGJvdW5kc1xyXG4gICAgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHgsIHRoaXMuY2FudmFzV2lkdGgpKVxyXG4gICAgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHksIHRoaXMuY2FudmFzSGVpZ2h0KSlcclxuXHJcbiAgICAvLyBTdG9yZSB0aGUgcmF3IHBvc2l0aW9uIHBlcmNlbnRhZ2UgZm9yIHRoZSBpbmRpY2F0b3JcclxuICAgIHRoaXMuaW5kaWNhdG9yWCA9ICh4IC8gdGhpcy5jYW52YXNXaWR0aCkgKiAxMDBcclxuICAgIHRoaXMuaW5kaWNhdG9yWSA9ICh5IC8gdGhpcy5jYW52YXNIZWlnaHQpICogMTAwXHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIHNhdHVyYXRpb24gYW5kIGxpZ2h0bmVzcyBiYXNlZCBvbiBwb3NpdGlvblxyXG4gICAgdGhpcy5oc2xDb2xvci5zID0gTWF0aC5yb3VuZCh0aGlzLmluZGljYXRvclgpXHJcbiAgICAvLyBBZGp1c3QgbGlnaHRuZXNzIGNhbGN1bGF0aW9uOlxyXG4gICAgLy8gLSBUb3Agb2YgY2FudmFzICh5PTApIHNob3VsZCBiZSB3aGl0ZSAobGlnaHRuZXNzPTEwMCkgb24gdGhlIGxlZnQgYW5kIHB1cmUgY29sb3IgKGxpZ2h0bmVzcz01MCkgb24gdGhlIHJpZ2h0XHJcbiAgICAvLyAtIEJvdHRvbSBvZiBjYW52YXMgKHk9aGVpZ2h0KSBzaG91bGQgYmUgYmxhY2sgKGxpZ2h0bmVzcz0wKVxyXG4gICAgaWYgKHRoaXMuaHNsQ29sb3IucyA9PT0gMCkge1xyXG4gICAgICAvLyBMZWZ0IGVkZ2UgaXMgYWx3YXlzIHdoaXRlIHRvIGJsYWNrLCByZWdhcmRsZXNzIG9mIHkgcG9zaXRpb25cclxuICAgICAgdGhpcy5oc2xDb2xvci5sID0gTWF0aC5yb3VuZCgxMDAgLSB0aGlzLmluZGljYXRvclkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBGb3Igb3RoZXIgc2F0dXJhdGlvbiB2YWx1ZXMsIHRvcCBpcyA1MC0xMDAlIGxpZ2h0bmVzcyAoYmFzZWQgb24gc2F0dXJhdGlvbiksIGJvdHRvbSBpcyAwJVxyXG4gICAgICBjb25zdCBtYXhMaWdodG5lc3MgPSAxMDAgLSB0aGlzLmhzbENvbG9yLnMgLyAyXHJcbiAgICAgIHRoaXMuaHNsQ29sb3IubCA9IE1hdGgucm91bmQobWF4TGlnaHRuZXNzIC0gKHRoaXMuaW5kaWNhdG9yWSAvIDEwMCkgKiBtYXhMaWdodG5lc3MpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIHNlbGVjdGVkIGNvbG9yXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQ29sb3IodGhpcy5oc2xDb2xvci5zLCB0aGlzLmhzbENvbG9yLmwsIHRydWUpXHJcblxyXG4gICAgLy8gUmVkcmF3IGFscGhhIHNsaWRlciB3aXRoIG5ldyBjb2xvclxyXG4gICAgdGhpcy5kcmF3QWxwaGFTbGlkZXIoKVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0ZWRDb2xvcihzYXR1cmF0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCwgbGlnaHRuZXNzOiBudW1iZXIgfCBudWxsID0gbnVsbCwgZW1pdENoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG5cclxuICAgIC8vIFVwZGF0ZSBIU0wgdmFsdWVzXHJcbiAgICBpZihzYXR1cmF0aW9uICE9IG51bGwpe1xyXG4gICAgICB0aGlzLmhzbENvbG9yLnMgPSBzYXR1cmF0aW9uXHJcbiAgICB9XHJcbiAgICBpZihsaWdodG5lc3MgIT0gbnVsbCl7XHJcbiAgICAgIHRoaXMuaHNsQ29sb3IubCA9IGxpZ2h0bmVzc1xyXG4gICAgfVxyXG4gICAgLy8gQ29udmVydCBIU0wgdG8gUkdCXHJcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhzbFRvUmdiKHRoaXMuaHNsQ29sb3IpO1xyXG5cclxuICAgIHRoaXMucmdiQ29sb3IgPSByZ2JcclxuXHJcbiAgICAvLyBDb252ZXJ0IFJHQiB0byBIRVhcclxuICAgIGNvbnN0IGhleCA9IHRoaXMucmdiVG9IZXgocmdiLCB0aGlzLmFscGhhIC8gMTAwKTtcclxuICAgIGlmKGVtaXRDaGFuZ2VzKXsgdGhpcy5tb2RlbCA9IGhleCB9ZWxzZXsgdGhpcy5fbW9kZWwgPSBoZXggfVxyXG5cclxuICAgIC8vIEVtaXQgY29sb3IgY2hhbmdlIGV2ZW50XHJcbiAgICAvLyB0aGlzLmNvbG9yQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZENvbG9yKVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlSW5kaWNhdG9yUG9zaXRpb25zKCk6IHZvaWQge1xyXG4gICAgLy8gU2V0IFggcG9zaXRpb24gZGlyZWN0bHkgZnJvbSBzYXR1cmF0aW9uICgwLTEwMClcclxuICAgIHRoaXMuaW5kaWNhdG9yWCA9IHRoaXMuaHNsQ29sb3IucztcclxuICBcclxuICAgIC8vIFNldCBZIHBvc2l0aW9uIGJhc2VkIG9uIGxpZ2h0bmVzc1xyXG4gICAgLy8gV2hlbiBsaWdodG5lc3MgaXMgNTAsIFkgc2hvdWxkIGJlIDAgKHRvcClcclxuICAgIC8vIFdoZW4gbGlnaHRuZXNzIGlzIDAsIFkgc2hvdWxkIGJlIDEwMCAoYm90dG9tKVxyXG4gICAgdGhpcy5pbmRpY2F0b3JZID0gKDUwIC0gdGhpcy5oc2xDb2xvci5sKSAqIDI7XHJcbiAgfVxyXG5cclxuICBoc2xUb1JnYihoc2w6IEhTTCk6IFJHQiB7XHJcbiAgICB2YXIgaCA9IGhzbC5oIC8gMzYwO1xyXG4gICAgdmFyIHMgPSBoc2wucyAvIDEwMDtcclxuICAgIHZhciBsID0gaHNsLmwgLyAxMDA7XHJcblxyXG4gICAgbGV0IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXJcclxuXHJcbiAgICBpZiAocyA9PT0gMCkge1xyXG4gICAgICByID0gZyA9IGIgPSBsIC8vIGFjaHJvbWF0aWNcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGh1ZTJyZ2IgPSAocDogbnVtYmVyLCBxOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmICh0IDwgMCkgdCArPSAxXHJcbiAgICAgICAgaWYgKHQgPiAxKSB0IC09IDFcclxuICAgICAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdFxyXG4gICAgICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxXHJcbiAgICAgICAgaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2XHJcbiAgICAgICAgcmV0dXJuIHBcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHNcclxuICAgICAgY29uc3QgcCA9IDIgKiBsIC0gcVxyXG5cclxuICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKVxyXG4gICAgICBnID0gaHVlMnJnYihwLCBxLCBoKVxyXG4gICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMSAvIDMpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcjogTWF0aC5yb3VuZChyICogMjU1KSxcclxuICAgICAgZzogTWF0aC5yb3VuZChnICogMjU1KSxcclxuICAgICAgYjogTWF0aC5yb3VuZChiICogMjU1KSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldENvbG9yRnJvbUhleChoZXhDb2xvcjogc3RyaW5nLCB1cGRhdGVDYW52YXM6IGJvb2xlYW4gPSB0cnVlLCBlbWl0Q2hhbmdlczogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAvLyBSZW1vdmUgIyBpZiBwcmVzZW50XHJcbiAgICBoZXhDb2xvciA9IGhleENvbG9yLnJlcGxhY2UoL14jLywgXCJcIilcclxuXHJcbiAgICBsZXQgcjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYSA9IDFcclxuXHJcbiAgICAvLyBQYXJzZSBoZXggdmFsdWVzIGJhc2VkIG9uIHN0cmluZyBsZW5ndGhcclxuICAgIGlmIChoZXhDb2xvci5sZW5ndGggPT09IDMpIHtcclxuICAgICAgLy8gU2hvcnQgaGV4ICgjUkdCKVxyXG4gICAgICByID0gTnVtYmVyLnBhcnNlSW50KGhleENvbG9yLmNoYXJBdCgwKSArIGhleENvbG9yLmNoYXJBdCgwKSwgMTYpXHJcbiAgICAgIGcgPSBOdW1iZXIucGFyc2VJbnQoaGV4Q29sb3IuY2hhckF0KDEpICsgaGV4Q29sb3IuY2hhckF0KDEpLCAxNilcclxuICAgICAgYiA9IE51bWJlci5wYXJzZUludChoZXhDb2xvci5jaGFyQXQoMikgKyBoZXhDb2xvci5jaGFyQXQoMiksIDE2KVxyXG4gICAgfSBlbHNlIGlmIChoZXhDb2xvci5sZW5ndGggPT09IDYpIHtcclxuICAgICAgLy8gU3RhbmRhcmQgaGV4ICgjUlJHR0JCKVxyXG4gICAgICByID0gTnVtYmVyLnBhcnNlSW50KGhleENvbG9yLnN1YnN0cmluZygwLCAyKSwgMTYpXHJcbiAgICAgIGcgPSBOdW1iZXIucGFyc2VJbnQoaGV4Q29sb3Iuc3Vic3RyaW5nKDIsIDQpLCAxNilcclxuICAgICAgYiA9IE51bWJlci5wYXJzZUludChoZXhDb2xvci5zdWJzdHJpbmcoNCwgNiksIDE2KVxyXG4gICAgfSBlbHNlIGlmIChoZXhDb2xvci5sZW5ndGggPT09IDgpIHtcclxuICAgICAgLy8gSGV4IHdpdGggYWxwaGEgKCNSUkdHQkJBQSlcclxuICAgICAgciA9IE51bWJlci5wYXJzZUludChoZXhDb2xvci5zdWJzdHJpbmcoMCwgMiksIDE2KVxyXG4gICAgICBnID0gTnVtYmVyLnBhcnNlSW50KGhleENvbG9yLnN1YnN0cmluZygyLCA0KSwgMTYpXHJcbiAgICAgIGIgPSBOdW1iZXIucGFyc2VJbnQoaGV4Q29sb3Iuc3Vic3RyaW5nKDQsIDYpLCAxNilcclxuICAgICAgYSA9IE51bWJlci5wYXJzZUludChoZXhDb2xvci5zdWJzdHJpbmcoNiwgOCksIDE2KSAvIDI1NVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSW52YWxpZCBoZXgsIHVzZSBkZWZhdWx0XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIGhleCBjb2xvciBmb3JtYXRcIilcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIFJHQiBjb2xvclxyXG4gICAgdGhpcy5yZ2JDb2xvciA9IHsgciwgZywgYiB9XHJcblxyXG4gICAgLy8gQ29udmVydCBSR0IgdG8gSFNMXHJcbiAgICB0aGlzLmhzbENvbG9yID0gdGhpcy5yZ2JUb0hzbCh0aGlzLnJnYkNvbG9yKVxyXG5cclxuICAgIC8vIFVwZGF0ZSBhbHBoYVxyXG4gICAgdGhpcy5hbHBoYSA9IE1hdGgucm91bmQoYSAqIDEwMClcclxuXHJcbiAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgY29sb3JcclxuICAgIGNvbnN0IGhleCA9IHRoaXMucmdiVG9IZXgodGhpcy5yZ2JDb2xvciwgYSlcclxuICAgIGlmKGVtaXRDaGFuZ2VzKXsgdGhpcy5tb2RlbCA9IGhleCB9ZWxzZXsgdGhpcy5fbW9kZWwgPSBoZXggfVxyXG5cclxuICAgIGlmKHVwZGF0ZUNhbnZhcyl7XHJcbiAgICAgIC8vIENhbGN1bGF0ZSBpbmRpY2F0b3IgcG9zaXRpb25cclxuICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JQb3NpdGlvbigpXHJcbiAgXHJcbiAgICAgIC8vIFJlZHJhdyBjb21wb25lbnRzXHJcbiAgICAgIHRoaXMuZHJhd0NvbG9yR3JhZGllbnQoKVxyXG4gICAgICB0aGlzLmRyYXdBbHBoYVNsaWRlcigpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVJbmRpY2F0b3JQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIFNldCBYIHBvc2l0aW9uIGJhc2VkIG9uIHNhdHVyYXRpb24gKDAtMTAwJSlcclxuICAgIHRoaXMuaW5kaWNhdG9yWCA9IHRoaXMuaHNsQ29sb3Iuc1xyXG5cclxuICAgIC8vIENhbGN1bGF0ZSBZIHBvc2l0aW9uIGJhc2VkIG9uIGxpZ2h0bmVzcyBhbmQgc2F0dXJhdGlvblxyXG4gICAgaWYgKHRoaXMuaHNsQ29sb3IucyA9PSAwKSB7XHJcbiAgICAgIC8vIExlZnQgZWRnZTogbGlnaHRuZXNzIGRldGVybWluZXMgcG9zaXRpb25cclxuICAgICAgdGhpcy5pbmRpY2F0b3JZID0gMTAwIC0gdGhpcy5oc2xDb2xvci5sXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXN0IG9mIGNhbnZhczogY2FsY3VsYXRlIGJhc2VkIG9uIG1heCBsaWdodG5lc3MgZm9yIHRoaXMgc2F0dXJhdGlvblxyXG4gICAgICBjb25zdCBtYXhMaWdodG5lc3MgPSAxMDAgLSB0aGlzLmhzbENvbG9yLnMgLyAyXHJcbiAgICAgIFxyXG4gICAgICAvLyBFbnN1cmUgbGlnaHRuZXNzIGlzIHdpdGhpbiB2YWxpZCByYW5nZSBmb3IgdGhpcyBzYXR1cmF0aW9uXHJcbiAgICAgIGNvbnN0IGFkanVzdGVkTGlnaHRuZXNzID0gTWF0aC5taW4odGhpcy5oc2xDb2xvci5sLCBtYXhMaWdodG5lc3MpXHJcblxyXG4gICAgICAvLyBDYWxjdWxhdGUgWSBwb3NpdGlvbiAoMCUgYXQgdG9wLCAxMDAlIGF0IGJvdHRvbSlcclxuICAgICAgaWYgKG1heExpZ2h0bmVzcyA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JZID0gMTAwIC8vIEF2b2lkIGRpdmlzaW9uIGJ5IHplcm9cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmluZGljYXRvclkgPSAoKG1heExpZ2h0bmVzcyAtIGFkanVzdGVkTGlnaHRuZXNzKSAvIG1heExpZ2h0bmVzcykgKiAxMDBcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ29uc3RyYWluIHRvIGNhbnZhcyBib3VuZHNcclxuICAgICAgdGhpcy5pbmRpY2F0b3JZID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCB0aGlzLmluZGljYXRvclkpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmdiVG9Ic2wocmdiOiBSR0IpOiBIU0wge1xyXG4gICAgdmFyIHIgPSByZ2IuciAvIDI1NVxyXG4gICAgdmFyIGcgPSByZ2IuZyAvIDI1NVxyXG4gICAgdmFyIGIgPSByZ2IuYiAvIDI1NVxyXG5cclxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpXHJcbiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKVxyXG4gICAgbGV0IGggPSAwLFxyXG4gICAgICBzID0gMFxyXG4gICAgY29uc3QgbCA9IChtYXggKyBtaW4pIC8gMlxyXG5cclxuICAgIGlmIChtYXggIT09IG1pbikge1xyXG4gICAgICBjb25zdCBkID0gbWF4IC0gbWluXHJcbiAgICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKVxyXG5cclxuICAgICAgc3dpdGNoIChtYXgpIHtcclxuICAgICAgICBjYXNlIHI6XHJcbiAgICAgICAgICBoID0gKChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApKSAvIDZcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgY2FzZSBnOlxyXG4gICAgICAgICAgaCA9ICgoYiAtIHIpIC8gZCArIDIpIC8gNlxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlIGI6XHJcbiAgICAgICAgICBoID0gKChyIC0gZykgLyBkICsgNCkgLyA2XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaDogTWF0aC5yb3VuZChoICogMzYwKSxcclxuICAgICAgczogTWF0aC5yb3VuZChzICogMTAwKSxcclxuICAgICAgbDogTWF0aC5yb3VuZChsICogMTAwKSxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJnYlRvSGV4KHJnYjogUkdCICwgYSA9IDEpOiBzdHJpbmcge1xyXG4gICAgdmFyIHsgciwgZywgYiB9ID0gcmdiXHJcblxyXG4gICAgY29uc3QgYWxwaGFIZXggPSBNYXRoLnJvdW5kKGEgKiAyNTUpXHJcbiAgICAgIC50b1N0cmluZygxNilcclxuICAgICAgLnBhZFN0YXJ0KDIsIFwiMFwiKVxyXG4gICAgcmV0dXJuIChcclxuICAgICAgXCIjXCIgK1xyXG4gICAgICBbciwgZywgYl1cclxuICAgICAgICAubWFwKCh4KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoZXggPSB4LnRvU3RyaW5nKDE2KVxyXG4gICAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmpvaW4oXCJcIikgK1xyXG4gICAgICAoYSA8IDEgPyBhbHBoYUhleCA6IFwiXCIpXHJcbiAgICApLnRvVXBwZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRSZ2JhU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB7IHIsIGcsIGIgfSA9IHRoaXMucmdiQ29sb3JcclxuICAgIGNvbnN0IGEgPSB0aGlzLmFscGhhIC8gMTAwXHJcbiAgICByZXR1cm4gYHJnYmEoJHtyfSwgJHtnfSwgJHtifSwgJHthfSlgXHJcbiAgfVxyXG5cclxuICBnZXRIc2xhU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYGhzbGEoJHt0aGlzLmhzbENvbG9yLmh9LCAke3RoaXMuaHNsQ29sb3Iuc30lLCAke3RoaXMuaHNsQ29sb3IubH0lLCAke3RoaXMuYWxwaGEgLyAxMDB9KWBcclxuICB9XHJcblxyXG4gIGFzeW5jIENvcHlUb0NsaXBib2FyZCgpIHtcclxuICAgIGF3YWl0IENsaXBib2FyZC53cml0ZSh7XHJcbiAgICAgIHN0cmluZzogdGhpcy5tb2RlbFxyXG4gICAgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmdlbmVyaWNTZXJ2aWNlLlByZXNlbnRUb2FzdFN1Y2Nlc3MoYCR7dGhpcy5tb2RlbH0gY29waWFkYSBwYXJhIGEgw6FyZWEgZGUgdHJhbnNmZXLDqm5jaWEhYCk7XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImZsZXggcmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgPGlvbi1jYXJkIGNsYXNzPVwiZm9jdXMtd2l0aGluOm9uLWZvY3VzIGlvbi1jYXJkLWlucHV0ICFyb3VuZGVkLXItbm9uZVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8IGRpc2FibGVkXCJcclxuICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgJ2ludmFsaWQnICA6IGludmFsaWQsXHJcbiAgICAgICdzdWJtaXR0ZWQnOiBzdWJtaXR0ZWQsXHJcbiAgICAgICdkaXNhYmxlZCc6IGRpc2FibGVkLFxyXG4gICAgfVwiXHJcbiAgPlxyXG4gICAgPGlvbi1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgPGlvbi1pdGVtIGNsYXNzPVwidy1mdWxsXCIgW25nQ2xhc3NdPVwieydzdWJtaXR0ZWQnOiBzdWJtaXR0ZWQsICdpbnZhbGlkJzogaW52YWxpZCwgJ3JlcXVpcmVkJzogcmVxdWlyZWR9XCIgbGluZXM9XCJub25lXCI+XHJcbiAgICAgICAgICA8aW9uLWlucHV0IChpb25CbHVyKT1cImJsdXIuZW1pdChtb2RlbClcIiBbbWF4bGVuZ3RoXT1cIjlcIiBsYWJlbFBsYWNlbWVudD1cInN0YWNrZWRcIiBbKG5nTW9kZWwpXT1cIm1vZGVsXCI+XHJcbiAgICAgICAgICAgIEBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgICA8aW9uLXRleHQgaWQ9XCJsYWJlbFwiIFtuZ0NsYXNzXT1cInsncmVxdWlyZWQnOiByZXF1aXJlZH1cIiBzbG90PVwibGFiZWxcIj4ge3tsYWJlbH19IDwvaW9uLXRleHQ+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvaW9uLWlucHV0PlxyXG4gICAgICAgIDwvaW9uLWl0ZW0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9pb24tY2FyZC1jb250ZW50PlxyXG4gIDwvaW9uLWNhcmQ+XHJcbiAgPGRpdiBjbGFzcz1cInctMTIgc2hyaW5rLTBcIiA+IFxyXG4gICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIlByZXNlbnQoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8IGRpc2FibGVkXCIgY2xhc3M9XCJtLTAgaC1mdWxsIHctZnVsbCByb3VuZGVkLXItMnhsIG9uLWhvdmVyIFstLWJvcmRlci1yYWRpdXM6MHJlbV8xcmVtXzFyZW1fMHJlbV1cIiBzdHlsZT1cIi0tYm9yZGVyLXdpZHRoOiAxcHggMXB4IDJweCAxcHg7XCIgc2l6ZT1cInNtYWxsXCIgY29sb3I9XCJtZWRpdW1cIiBmaWxsPVwib3V0bGluZVwiPiBcclxuICAgICAgPGlvbi1pY29uIGNsYXNzPVwiZmlsbC1yYWluYm93XCIgc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjb2xvci1wYWxldHRlXCI+PC9pb24taWNvbj4gXHJcbiAgICA8L2lvbi1idXR0b24+XHJcbiAgPC9kaXY+XHJcbiAgPGlucHV0LWxvYWRpbmcgW2xvYWRpbmddPVwibG9hZGluZ1wiPjwvaW5wdXQtbG9hZGluZz5cclxuPC9kaXY+XHJcblxyXG48aW9uLXBvcG92ZXIgI3BvcG92ZXIgW2tlZXBDb250ZW50c01vdW50ZWRdPVwidHJ1ZVwiPlxyXG4gIDxuZy10ZW1wbGF0ZT5cclxuICAgIDxpb24tY2FyZCBjbGFzcz1cIm0tMFwiPlxyXG4gICAgICA8aW9uLWNhcmQtY29udGVudCBjbGFzcz1cInAtMCByZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxsb2FkaW5nIFt0eXBlXT1cIjNcIiBbbG9hZGluZ109XCJyZW5kZXJpbmdcIiB0ZXh0PVwiXCI+PC9sb2FkaW5nPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaXplLWZ1bGwgcC0zIGZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVsxMi41cmVtXSBmbGV4IGZsZXgtY29sIGdhcC0xIHctNDRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBoLTMyIHJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgPGNhbnZhcyAjY2FudmFzIHdpZHRoPVwiMTc2XCIgaGVpZ2h0PVwiMTI4XCIgY2xhc3M9XCJzaXplLWZ1bGwgcm91bmRlZC1zbSB0cmFuc2x1Y2lkLWJvcmRlclwiPjwvY2FudmFzPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1pbmRpY2F0b3IgcXVpY2stdHJhbnNpdGlvblwiIFtzdHlsZS5sZWZ0LiVdPVwiaW5kaWNhdG9yWFwiIFtzdHlsZS50b3AuJV09XCJpbmRpY2F0b3JZXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBzaHJpbmstMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZ3JpZCBncmlkLWNvbHMtNSBnYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQ29sb3I7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAnIzAwMDAwMEZGJyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVDb2xvcjsgY29udGV4dDogeyAkaW1wbGljaXQ6ICcjMzg4MGZmZmYnIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUNvbG9yOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogJyMyZGQzNmZmZicgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQ29sb3I7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAnI2ZmYzQwOWZmJyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVDb2xvcjsgY29udGV4dDogeyAkaW1wbGljaXQ6ICcjZWI0NDVhZmYnIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQ29sb3I7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAnI0ZGRkZGRkZGJyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVDb2xvcjsgY29udGV4dDogeyAkaW1wbGljaXQ6ICcjNTkxNjhiRkYnIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUNvbG9yOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogJyNjNjAwNWNGRicgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQ29sb3I7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAnI2ZiMmMzNkZGJyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVDb2xvcjsgY29udGV4dDogeyAkaW1wbGljaXQ6ICcjMzE0MTU4RkYnIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUNvbG9yIGxldC1jb2xvcj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpemUtOCByb3VuZGVkIHRyYW5zbHVjaWQtYm9yZGVyIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNldENvbG9yRnJvbUhleChjb2xvciwgdHJ1ZSwgdHJ1ZSlcIiBbc3R5bGVdPVwieyAnYmFja2dyb3VuZCc6IGNvbG9yIH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTIuNXJlbV0gZmxleCBmbGV4LWNvbCBnYXAtMiB3LTQ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICA8Y2FudmFzICNodWVTbGlkZXIgICBjbGFzcz1cInctZnVsbCByb3VuZGVkIGgtWzIycHhdXCIgd2lkdGg9XCIxNzZcIiBoZWlnaHQ9XCIyMlwiPjwvY2FudmFzPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmRpY2F0b3IgcXVpY2stdHJhbnNpdGlvblwiIFtzdHlsZS5sZWZ0LiVdPVwiaHNsQ29sb3IuaCAvIDMuNlwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCByZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgIDxjYW52YXMgI2FscGhhU2xpZGVyIGNsYXNzPVwidy1mdWxsIHJvdW5kZWQgaC1bMjJweF1cIiB3aWR0aD1cIjE3NlwiIGhlaWdodD1cIjIyXCI+PC9jYW52YXM+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvciBxdWljay10cmFuc2l0aW9uXCIgW3N0eWxlLmxlZnQuJV09XCJhbHBoYVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZpdCBnYXAtMSBvdmVyZmxvdy1oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXplLTEwIHJlbGF0aXZlIHotMTAgc2hyaW5rLTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpemUtZnVsbCB6LTEwIHJvdW5kZWQgdHJhbnNsdWNpZC1ib3JkZXIgYWJzb2x1dGUgbGVmdC0wIHRvcC0wXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0UmdiYVN0cmluZygpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBjbGFzcz1cInotMCBvcGFjaXR5LTUwXCIgY29sb3I9XCJkYXJrXCIgbmFtZT1cImNvbG9yLWZpbGxcIj48L2lvbi1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgc2hyaW5rIHRleHQtc20gZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+SGV4PC9pb24tdGV4dD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFt2YWx1ZV09XCJtb2RlbFwiIChjaGFuZ2UpPVwic2V0Q29sb3JGcm9tSGV4KCRldmVudC50YXJnZXRbJ3ZhbHVlJ10pXCIgY2xhc3M9XCJ3LWZ1bGxcIi8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIkNvcHlUb0NsaXBib2FyZCgpXCIgY2xhc3M9XCJhc3BlY3Qtc3F1YXJlXCIgc3R5bGU9XCItLWJvcmRlci1yYWRpdXM6IC4yNXJlbVwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJjbGlwYm9hcmRcIj48L2lvbi1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PiBcclxuICAgICAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGdhcC0xIG92ZXJmbG93LWhpZGRlbiB0ZXh0LXNtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHNocmlua1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+UjwvaW9uLXRleHQ+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInJnYkNvbG9yLnJcIiAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkQ29sb3IoKTsgdXBkYXRlSW5kaWNhdG9yUG9zaXRpb25zKCk7IHRoaXMuZHJhd0NvbG9yR3JhZGllbnQoKVwiIHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInctZnVsbFwiLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBzaHJpbmtcIj5cclxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0Pkc8L2lvbi10ZXh0PlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJyZ2JDb2xvci5nXCIgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZENvbG9yKCk7IHVwZGF0ZUluZGljYXRvclBvc2l0aW9ucygpXCIgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwidy1mdWxsXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHNocmlua1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+QjwvaW9uLXRleHQ+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInJnYkNvbG9yLmJcIiAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkQ29sb3IoKTsgdXBkYXRlSW5kaWNhdG9yUG9zaXRpb25zKClcIiB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJ3LWZ1bGxcIi8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgc2hyaW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpb24tdGV4dD5BPC9pb24tdGV4dD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiYWxwaGFcIiBjbGFzcz1cInctZnVsbFwiLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBnYXAtMSBvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBzaHJpbmtcIj5cclxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0Pkg8L2lvbi10ZXh0PlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJoc2xDb2xvci5oXCIgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZENvbG9yKCk7IHVwZGF0ZUluZGljYXRvclBvc2l0aW9ucygpOyB0aGlzLmRyYXdDb2xvckdyYWRpZW50KClcIiB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJ3LWZ1bGxcIi8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgc2hyaW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpb24tdGV4dD5MPC9pb24tdGV4dD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiaHNsQ29sb3IubFwiIChjaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRDb2xvcigpOyB1cGRhdGVJbmRpY2F0b3JQb3NpdGlvbnMoKVwiIHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInctZnVsbFwiLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBzaHJpbmtcIj5cclxuICAgICAgICAgICAgICAgICAgPGlvbi10ZXh0PlM8L2lvbi10ZXh0PlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJoc2xDb2xvci5zXCIgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZENvbG9yKCk7IHVwZGF0ZUluZGljYXRvclBvc2l0aW9ucygpXCIgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwidy1mdWxsXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHNocmlua1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLXRleHQ+QTwvaW9uLXRleHQ+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImFscGhhXCIgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwidy1mdWxsXCIvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cclxuICAgIDwvaW9uLWNhcmQ+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9pb24tcG9wb3Zlcj5cclxuIl19
|