ngx-hana-nameserver-history-viewer 1.1.3 → 1.1.9-3.beta
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/README.md +5 -4
- package/esm2020/ngx-hana-nameserver-history-viewer.mjs +5 -0
- package/esm2020/public-api.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +68 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +22 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +3 -0
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +112 -0
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/index.mjs +9 -0
- package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +42 -0
- package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +550 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +69 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +41 -0
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +40 -0
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +70 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +90 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +49 -0
- package/esm2020/src/nameserver-history-viewer/index.mjs +3 -0
- package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +63 -0
- package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +323 -0
- package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +390 -0
- package/esm2020/src/nameserver-history-viewer/services/index.mjs +4 -0
- package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +557 -0
- package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +6 -0
- package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +8 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +9 -0
- package/esm2020/src/nameserver-history-viewer/types/index.mjs +28 -0
- package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +14 -0
- package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +17 -0
- package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +10 -0
- package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +14 -0
- package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +25 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +57 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +139 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +41 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +106 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +168 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +114 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +527 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +154 -0
- package/esm2020/src/nameserver-history-viewer/utils/index.mjs +5 -0
- package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +101 -0
- package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +162 -0
- package/{dist/fesm2015/ngx-hana-nameserver-history-viewer.js → fesm2015/ngx-hana-nameserver-history-viewer.mjs} +829 -2561
- package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
- package/fesm2020/ngx-hana-nameserver-history-viewer.mjs +4081 -0
- package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
- package/ngx-hana-nameserver-history-viewer.d.ts +5 -0
- package/package.json +66 -88
- package/{dist/public-api.d.ts → public-api.d.ts} +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
- package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +8 -0
- package/{dist/src → src}/nameserver-history-viewer/components/alert/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/instruction/index.d.ts +0 -0
- package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +17 -0
- package/{dist/src → src}/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
- package/{dist/src → src}/nameserver-history-viewer/components/port-selector/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
- package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -0
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +6 -0
- package/{dist/src → src}/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -0
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +19 -0
- package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
- package/src/nameserver-history-viewer/index.d.ts +2 -0
- package/src/nameserver-history-viewer/nameserver-history.module.d.ts +19 -0
- package/{dist/src → src}/nameserver-history-viewer/services/chart.service.d.ts +4 -1
- package/{dist/src → src}/nameserver-history-viewer/services/file.service.d.ts +3 -0
- package/{dist/src → src}/nameserver-history-viewer/services/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/services/ui.service.d.ts +5 -2
- package/{dist/src → src}/nameserver-history-viewer/types/abort.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/alert.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/chart-content.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/html-element.type.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/item.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/legend-color.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/port.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/scale-group.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/unit-category.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/types/unit.types.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chart-util.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/file-util.d.ts +6 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/index.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/time-util.d.ts +0 -0
- package/{dist/src → src}/nameserver-history-viewer/utils/ui-util.d.ts +0 -0
- package/.idea/codeStyles/Project.xml +0 -17
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/ngx-hana-nameserver-history-viewer.iml +0 -13
- package/.idea/vcs.xml +0 -6
- package/.travis.yml +0 -35
- package/angular.json +0 -125
- package/dist/LICENSE +0 -21
- package/dist/README.md +0 -93
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6761
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
- package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
- package/dist/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
- package/dist/esm2015/public-api.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -114
- package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
- package/dist/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
- package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
- package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
- package/dist/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
- package/dist/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -868
- package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
- package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -60
- package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
- package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
- package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -151
- package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -80
- package/dist/esm2015/src/nameserver-history-viewer/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
- package/dist/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -504
- package/dist/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -488
- package/dist/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
- package/dist/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -922
- package/dist/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
- package/dist/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
- package/dist/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
- package/dist/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
- package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
- package/dist/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
- package/dist/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
- package/dist/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
- package/dist/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
- package/dist/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -222
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -166
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -311
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
- package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
- package/dist/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -186
- package/dist/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
- package/dist/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -139
- package/dist/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -239
- package/dist/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
- package/dist/esm5/public-api.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -146
- package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
- package/dist/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
- package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
- package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/index.js +0 -13
- package/dist/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
- package/dist/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -1116
- package/dist/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
- package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -85
- package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
- package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
- package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -180
- package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -110
- package/dist/esm5/src/nameserver-history-viewer/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
- package/dist/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -659
- package/dist/esm5/src/nameserver-history-viewer/services/file.service.js +0 -609
- package/dist/esm5/src/nameserver-history-viewer/services/index.js +0 -8
- package/dist/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1141
- package/dist/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
- package/dist/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
- package/dist/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/index.js +0 -32
- package/dist/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
- package/dist/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
- package/dist/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
- package/dist/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
- package/dist/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
- package/dist/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
- package/dist/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -316
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -240
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -366
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
- package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
- package/dist/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -187
- package/dist/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
- package/dist/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -139
- package/dist/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -241
- package/dist/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
- package/dist/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6887
- package/dist/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
- package/dist/ngx-hana-nameserver-history-viewer.d.ts +0 -5
- package/dist/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
- package/dist/package.json +0 -90
- package/dist/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -2
- package/dist/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -14
- package/dist/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -3
- package/dist/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -16
- package/dist/src/nameserver-history-viewer/index.d.ts +0 -1
- package/dist/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -2
- package/ng-package.json +0 -7
- package/public-api.ts +0 -1
- package/src/assets/GitHub-Mark-32px.png +0 -0
- package/src/demo/app.component.html +0 -42
- package/src/demo/app.component.scss +0 -155
- package/src/demo/app.component.ts +0 -157
- package/src/demo/app.module.ts +0 -30
- package/src/demo/demo-service.ts +0 -479
- package/src/demo/demo-util.spec.ts +0 -112
- package/src/demo/demo-util.ts +0 -121
- package/src/demo/index.html +0 -13
- package/src/demo/main.ts +0 -12
- package/src/demo/small-demo.gif +0 -0
- package/src/demo/styles.css +0 -5
- package/src/environments/environment.prod.ts +0 -3
- package/src/environments/environment.ts +0 -15
- package/src/karma.conf.js +0 -31
- package/src/nameserver-history-viewer/components/alert/alert.component.html +0 -10
- package/src/nameserver-history-viewer/components/alert/alert.component.scss +0 -78
- package/src/nameserver-history-viewer/components/alert/alert.component.ts +0 -67
- package/src/nameserver-history-viewer/components/alert/alert.module.ts +0 -14
- package/src/nameserver-history-viewer/components/alert/index.ts +0 -6
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.scss +0 -37
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.spec.ts +0 -47
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.ts +0 -101
- package/src/nameserver-history-viewer/components/file-drop-input/index.ts +0 -1
- package/src/nameserver-history-viewer/components/index.ts +0 -8
- package/src/nameserver-history-viewer/components/instruction/index.ts +0 -1
- package/src/nameserver-history-viewer/components/instruction/instruction.component.html +0 -33
- package/src/nameserver-history-viewer/components/instruction/instruction.component.scss +0 -49
- package/src/nameserver-history-viewer/components/instruction/instruction.component.ts +0 -30
- package/src/nameserver-history-viewer/components/nameserver-history.component.html +0 -70
- package/src/nameserver-history-viewer/components/nameserver-history.component.scss +0 -191
- package/src/nameserver-history-viewer/components/nameserver-history.component.spec.ts +0 -193
- package/src/nameserver-history-viewer/components/nameserver-history.component.ts +0 -666
- package/src/nameserver-history-viewer/components/port-selector/index.ts +0 -1
- package/src/nameserver-history-viewer/components/port-selector/port-selector.component.ts +0 -55
- package/src/nameserver-history-viewer/components/port-selector/port-selector.service.spec.ts +0 -16
- package/src/nameserver-history-viewer/components/port-selector/port-selector.service.ts +0 -40
- package/src/nameserver-history-viewer/components/progress-bar/index.ts +0 -1
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.scss +0 -47
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.ts +0 -27
- package/src/nameserver-history-viewer/components/time-range-selector/index.ts +0 -1
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.scss +0 -31
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.ts +0 -46
- package/src/nameserver-history-viewer/components/timezone-selector/index.ts +0 -1
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.ts +0 -82
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.spec.ts +0 -12
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.ts +0 -53
- package/src/nameserver-history-viewer/index.ts +0 -1
- package/src/nameserver-history-viewer/nameserver-history.module.ts +0 -45
- package/src/nameserver-history-viewer/services/chart.service.ts +0 -343
- package/src/nameserver-history-viewer/services/file.service.spec.ts +0 -3364
- package/src/nameserver-history-viewer/services/file.service.ts +0 -450
- package/src/nameserver-history-viewer/services/index.ts +0 -3
- package/src/nameserver-history-viewer/services/ui.service.spec.ts +0 -43
- package/src/nameserver-history-viewer/services/ui.service.ts +0 -601
- package/src/nameserver-history-viewer/types/abort.types.ts +0 -4
- package/src/nameserver-history-viewer/types/alert.types.ts +0 -6
- package/src/nameserver-history-viewer/types/chart-content-data-item.types.ts +0 -4
- package/src/nameserver-history-viewer/types/chart-content-data.types.ts +0 -6
- package/src/nameserver-history-viewer/types/chart-content-header.types.ts +0 -4
- package/src/nameserver-history-viewer/types/chart-content-time.types.ts +0 -3
- package/src/nameserver-history-viewer/types/chart-content.types.ts +0 -10
- package/src/nameserver-history-viewer/types/color-rgba.types.ts +0 -6
- package/src/nameserver-history-viewer/types/html-element.type.ts +0 -7
- package/src/nameserver-history-viewer/types/index.ts +0 -27
- package/src/nameserver-history-viewer/types/item.types.ts +0 -12
- package/src/nameserver-history-viewer/types/legend-color.types.ts +0 -5
- package/src/nameserver-history-viewer/types/load-history-info-backup.types.ts +0 -8
- package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.ts +0 -9
- package/src/nameserver-history-viewer/types/load-history-info-host.types.ts +0 -17
- package/src/nameserver-history-viewer/types/load-history-info-item.types.ts +0 -14
- package/src/nameserver-history-viewer/types/load-history-info-persistence.types.ts +0 -12
- package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.ts +0 -7
- package/src/nameserver-history-viewer/types/load-history-info-server.types.ts +0 -11
- package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.ts +0 -11
- package/src/nameserver-history-viewer/types/load-history-info-sql.types.ts +0 -17
- package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.ts +0 -6
- package/src/nameserver-history-viewer/types/load-history-info-threads.types.ts +0 -10
- package/src/nameserver-history-viewer/types/load-history-info.types.ts +0 -24
- package/src/nameserver-history-viewer/types/port.types.ts +0 -5
- package/src/nameserver-history-viewer/types/scale-group.types.ts +0 -15
- package/src/nameserver-history-viewer/types/unit-category.types.ts +0 -8
- package/src/nameserver-history-viewer/types/unit.types.ts +0 -12
- package/src/nameserver-history-viewer/utils/chart-util.spec.ts +0 -22
- package/src/nameserver-history-viewer/utils/chart-util.ts +0 -30
- package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.ts +0 -104
- package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.ts +0 -95
- package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.ts +0 -196
- package/src/nameserver-history-viewer/utils/chartjs-downsample/index.ts +0 -44
- package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.ts +0 -158
- package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.ts +0 -249
- package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.ts +0 -122
- package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.ts +0 -602
- package/src/nameserver-history-viewer/utils/chartjs-zoom/index.ts +0 -1
- package/src/nameserver-history-viewer/utils/file-util.spec.ts +0 -108
- package/src/nameserver-history-viewer/utils/file-util.ts +0 -149
- package/src/nameserver-history-viewer/utils/index.ts +0 -4
- package/src/nameserver-history-viewer/utils/time-util.spec.ts +0 -21
- package/src/nameserver-history-viewer/utils/time-util.ts +0 -113
- package/src/nameserver-history-viewer/utils/ui-util.spec.ts +0 -87
- package/src/nameserver-history-viewer/utils/ui-util.ts +0 -171
- package/src/polyfills.ts +0 -80
- package/src/test.ts +0 -20
- package/src/tsconfig.app.json +0 -12
- package/src/tsconfig.spec.json +0 -19
- package/tsconfig.json +0 -22
- package/tslint.json +0 -130
|
@@ -1,827 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* this plugin is adapted from: https://github.com/chartjs/chartjs-plugin-zoom
|
|
7
|
-
* for following two open issues:
|
|
8
|
-
* https://github.com/chartjs/chartjs-plugin-zoom/pull/155
|
|
9
|
-
* https://github.com/chartjs/chartjs-plugin-zoom/pull/150
|
|
10
|
-
*
|
|
11
|
-
* The MIT License (MIT) Copyright (c) 2013-2016 Nick Downie
|
|
12
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
|
13
|
-
* software and associated documentation files (the "Software"), to deal in the Software
|
|
14
|
-
* without restriction, including without limitation the rights to use, copy, modify, merge,
|
|
15
|
-
* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
|
16
|
-
* to whom the Software is furnished to do so, subject to the following conditions:
|
|
17
|
-
*
|
|
18
|
-
* The above copyright notice and this permission notice shall be included in all copies or
|
|
19
|
-
* substantial portions of the Software.
|
|
20
|
-
*
|
|
21
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
22
|
-
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
-
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
24
|
-
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
25
|
-
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
26
|
-
* THE SOFTWARE.
|
|
27
|
-
*/
|
|
28
|
-
/*jslint browser:true, devel:true, white:true, vars:true */
|
|
29
|
-
/*global require*/
|
|
30
|
-
// hammer JS for touch support
|
|
31
|
-
import * as hammerjs from 'hammerjs';
|
|
32
|
-
/** @type {?} */
|
|
33
|
-
var Hammer = window && ((/** @type {?} */ (window))).Hammer ? ((/** @type {?} */ (window))).Hammer : hammerjs.Hammer;
|
|
34
|
-
// Get the chart variable
|
|
35
|
-
import * as chartjs from 'chart.js';
|
|
36
|
-
/** @type {?} */
|
|
37
|
-
var Chart = window && ((/** @type {?} */ (window))).Chart ? ((/** @type {?} */ (window))).Chart : chartjs.Chart;
|
|
38
|
-
/** @type {?} */
|
|
39
|
-
var helpers = Chart.helpers;
|
|
40
|
-
// Take the zoom namespace of Chart
|
|
41
|
-
/** @type {?} */
|
|
42
|
-
var zoomNS = Chart.Zoom = Chart.Zoom || {};
|
|
43
|
-
// Where we store functions to handle different scale types
|
|
44
|
-
/** @type {?} */
|
|
45
|
-
var zoomFunctions = zoomNS.zoomFunctions = zoomNS.zoomFunctions || {};
|
|
46
|
-
/** @type {?} */
|
|
47
|
-
var panFunctions = zoomNS.panFunctions = zoomNS.panFunctions || {};
|
|
48
|
-
// Default options if none are provided
|
|
49
|
-
/** @type {?} */
|
|
50
|
-
var defaultOptions = zoomNS.defaults = {
|
|
51
|
-
pan: {
|
|
52
|
-
enabled: true,
|
|
53
|
-
mode: 'xy',
|
|
54
|
-
speed: 20,
|
|
55
|
-
threshold: 10
|
|
56
|
-
},
|
|
57
|
-
zoom: {
|
|
58
|
-
enabled: true,
|
|
59
|
-
mode: 'xy',
|
|
60
|
-
sensitivity: 3
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
/**
|
|
64
|
-
* @param {?} mode
|
|
65
|
-
* @param {?} dir
|
|
66
|
-
* @return {?}
|
|
67
|
-
*/
|
|
68
|
-
function directionEnabled(mode, dir) {
|
|
69
|
-
if (mode === undefined) {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
else if (typeof mode === 'string') {
|
|
73
|
-
return mode.indexOf(dir) !== -1;
|
|
74
|
-
}
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* @param {?} zoomPanOptions
|
|
79
|
-
* @param {?} newMax
|
|
80
|
-
* @return {?}
|
|
81
|
-
*/
|
|
82
|
-
function rangeMaxLimiter(zoomPanOptions, newMax) {
|
|
83
|
-
if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMax &&
|
|
84
|
-
!helpers.isNullOrUndef(zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes])) {
|
|
85
|
-
/** @type {?} */
|
|
86
|
-
var rangeMax = zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes];
|
|
87
|
-
if (newMax > rangeMax) {
|
|
88
|
-
newMax = rangeMax;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return newMax;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* @param {?} zoomPanOptions
|
|
95
|
-
* @param {?} newMin
|
|
96
|
-
* @return {?}
|
|
97
|
-
*/
|
|
98
|
-
function rangeMinLimiter(zoomPanOptions, newMin) {
|
|
99
|
-
if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMin &&
|
|
100
|
-
!helpers.isNullOrUndef(zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes])) {
|
|
101
|
-
/** @type {?} */
|
|
102
|
-
var rangeMin = zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes];
|
|
103
|
-
if (newMin < rangeMin) {
|
|
104
|
-
newMin = rangeMin;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return newMin;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* @param {?} scale
|
|
111
|
-
* @param {?} zoom
|
|
112
|
-
* @param {?} center
|
|
113
|
-
* @param {?} zoomOptions
|
|
114
|
-
* @return {?}
|
|
115
|
-
*/
|
|
116
|
-
function zoomIndexScale(scale, zoom, center, zoomOptions) {
|
|
117
|
-
/** @type {?} */
|
|
118
|
-
var labels = scale.chart.data.labels;
|
|
119
|
-
/** @type {?} */
|
|
120
|
-
var minIndex = scale.minIndex;
|
|
121
|
-
/** @type {?} */
|
|
122
|
-
var lastLabelIndex = labels.length - 1;
|
|
123
|
-
/** @type {?} */
|
|
124
|
-
var maxIndex = scale.maxIndex;
|
|
125
|
-
/** @type {?} */
|
|
126
|
-
var sensitivity = zoomOptions.sensitivity;
|
|
127
|
-
/** @type {?} */
|
|
128
|
-
var chartCenter = scale.isHorizontal() ? scale.left + (scale.width / 2) : scale.top + (scale.height / 2);
|
|
129
|
-
/** @type {?} */
|
|
130
|
-
var centerPointer = scale.isHorizontal() ? center.x : center.y;
|
|
131
|
-
zoomNS.zoomCumulativeDelta = zoom > 1 ? zoomNS.zoomCumulativeDelta + 1 : zoomNS.zoomCumulativeDelta - 1;
|
|
132
|
-
if (Math.abs(zoomNS.zoomCumulativeDelta) > sensitivity) {
|
|
133
|
-
if (zoomNS.zoomCumulativeDelta < 0) {
|
|
134
|
-
if (centerPointer >= chartCenter) {
|
|
135
|
-
if (minIndex <= 0) {
|
|
136
|
-
maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
minIndex = Math.max(0, minIndex - 1);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else if (centerPointer < chartCenter) {
|
|
143
|
-
if (maxIndex >= lastLabelIndex) {
|
|
144
|
-
minIndex = Math.max(0, minIndex - 1);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
151
|
-
}
|
|
152
|
-
else if (zoomNS.zoomCumulativeDelta > 0) {
|
|
153
|
-
if (centerPointer >= chartCenter) {
|
|
154
|
-
minIndex = minIndex < maxIndex ? minIndex = Math.min(maxIndex, minIndex + 1) : minIndex;
|
|
155
|
-
}
|
|
156
|
-
else if (centerPointer < chartCenter) {
|
|
157
|
-
maxIndex = maxIndex > minIndex ? maxIndex = Math.max(minIndex, maxIndex - 1) : maxIndex;
|
|
158
|
-
}
|
|
159
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
160
|
-
}
|
|
161
|
-
scale.options.ticks.min = rangeMinLimiter(zoomOptions, labels[minIndex]);
|
|
162
|
-
scale.options.ticks.max = rangeMaxLimiter(zoomOptions, labels[maxIndex]);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* @param {?} scale
|
|
167
|
-
* @param {?} zoom
|
|
168
|
-
* @param {?} center
|
|
169
|
-
* @param {?} zoomOptions
|
|
170
|
-
* @return {?}
|
|
171
|
-
*/
|
|
172
|
-
function zoomTimeScale(scale, zoom, center, zoomOptions) {
|
|
173
|
-
/** @type {?} */
|
|
174
|
-
var options = scale.options;
|
|
175
|
-
// var range;
|
|
176
|
-
// var min_percent;
|
|
177
|
-
// if (scale.isHorizontal()) {
|
|
178
|
-
// range = scale.right - scale.left;
|
|
179
|
-
// min_percent = (center.x - scale.left) / range;
|
|
180
|
-
// } else {
|
|
181
|
-
// range = scale.bottom - scale.top;
|
|
182
|
-
// min_percent = (center.y - scale.top) / range;
|
|
183
|
-
// }
|
|
184
|
-
//
|
|
185
|
-
// var max_percent = 1 - min_percent;
|
|
186
|
-
/** @type {?} */
|
|
187
|
-
var range = scale.max - scale.min;
|
|
188
|
-
/** @type {?} */
|
|
189
|
-
var newDiff = range * (zoom - 1);
|
|
190
|
-
/** @type {?} */
|
|
191
|
-
var cursorPixel = scale.isHorizontal() ? center.x : center.y;
|
|
192
|
-
/** @type {?} */
|
|
193
|
-
var min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
|
|
194
|
-
/** @type {?} */
|
|
195
|
-
var max_percent = 1 - min_percent;
|
|
196
|
-
/** @type {?} */
|
|
197
|
-
var minDelta = newDiff * min_percent;
|
|
198
|
-
/** @type {?} */
|
|
199
|
-
var maxDelta = newDiff * max_percent;
|
|
200
|
-
/** @type {?} */
|
|
201
|
-
var newMin = scale.min + minDelta;
|
|
202
|
-
/** @type {?} */
|
|
203
|
-
var newMax = scale.max - maxDelta;
|
|
204
|
-
/** @type {?} */
|
|
205
|
-
var diffMinMax = newMax - newMin;
|
|
206
|
-
/** @type {?} */
|
|
207
|
-
var minLimitExceeded = rangeMinLimiter(zoomOptions, diffMinMax) !== diffMinMax;
|
|
208
|
-
/** @type {?} */
|
|
209
|
-
var maxLimitExceeded = rangeMaxLimiter(zoomOptions, diffMinMax) !== diffMinMax;
|
|
210
|
-
if (!minLimitExceeded && !maxLimitExceeded) {
|
|
211
|
-
options.time.min = newMin;
|
|
212
|
-
options.time.max = newMax;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* @param {?} scale
|
|
217
|
-
* @param {?} zoom
|
|
218
|
-
* @param {?} center
|
|
219
|
-
* @param {?} zoomOptions
|
|
220
|
-
* @return {?}
|
|
221
|
-
*/
|
|
222
|
-
function zoomNumericalScale(scale, zoom, center, zoomOptions) {
|
|
223
|
-
/** @type {?} */
|
|
224
|
-
var range = scale.max - scale.min;
|
|
225
|
-
/** @type {?} */
|
|
226
|
-
var newDiff = range * (zoom - 1);
|
|
227
|
-
/** @type {?} */
|
|
228
|
-
var cursorPixel = scale.isHorizontal() ? center.x : center.y;
|
|
229
|
-
/** @type {?} */
|
|
230
|
-
var min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
|
|
231
|
-
/** @type {?} */
|
|
232
|
-
var max_percent = 1 - min_percent;
|
|
233
|
-
/** @type {?} */
|
|
234
|
-
var minDelta = newDiff * min_percent;
|
|
235
|
-
/** @type {?} */
|
|
236
|
-
var maxDelta = newDiff * max_percent;
|
|
237
|
-
scale.options.ticks.min = rangeMinLimiter(zoomOptions, scale.min + minDelta);
|
|
238
|
-
scale.options.ticks.max = rangeMaxLimiter(zoomOptions, scale.max - maxDelta);
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* @param {?} scale
|
|
242
|
-
* @param {?} zoom
|
|
243
|
-
* @param {?} center
|
|
244
|
-
* @param {?} zoomOptions
|
|
245
|
-
* @return {?}
|
|
246
|
-
*/
|
|
247
|
-
function zoomScale(scale, zoom, center, zoomOptions) {
|
|
248
|
-
/** @type {?} */
|
|
249
|
-
var fn = zoomFunctions[scale.options.type];
|
|
250
|
-
if (fn) {
|
|
251
|
-
fn(scale, zoom, center, zoomOptions);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* @param {?} chartInstance
|
|
256
|
-
* @param {?} zoom
|
|
257
|
-
* @param {?} center
|
|
258
|
-
* @param {?=} whichAxes
|
|
259
|
-
* @return {?}
|
|
260
|
-
*/
|
|
261
|
-
function doZoom(chartInstance, zoom, center, whichAxes) {
|
|
262
|
-
/** @type {?} */
|
|
263
|
-
var ca = chartInstance.chartArea;
|
|
264
|
-
if (!center) {
|
|
265
|
-
center = {
|
|
266
|
-
x: (ca.left + ca.right) / 2,
|
|
267
|
-
y: (ca.top + ca.bottom) / 2,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
/** @type {?} */
|
|
271
|
-
var zoomOptions = chartInstance.options.zoom;
|
|
272
|
-
if (zoomOptions && helpers.getValueOrDefault(zoomOptions.enabled, defaultOptions.zoom.enabled)) {
|
|
273
|
-
// Do the zoom here
|
|
274
|
-
/** @type {?} */
|
|
275
|
-
var zoomMode_1 = helpers.getValueOrDefault(chartInstance.options.zoom.mode, defaultOptions.zoom.mode);
|
|
276
|
-
zoomOptions.sensitivity = helpers.getValueOrDefault(chartInstance.options.zoom.sensitivity, defaultOptions.zoom.sensitivity);
|
|
277
|
-
// Which axe should be modified when figers were used.
|
|
278
|
-
/** @type {?} */
|
|
279
|
-
var _whichAxes_1;
|
|
280
|
-
if (zoomMode_1 === 'xy' && whichAxes !== undefined) {
|
|
281
|
-
// based on fingers positions
|
|
282
|
-
_whichAxes_1 = whichAxes;
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
// no effect
|
|
286
|
-
_whichAxes_1 = 'xy';
|
|
287
|
-
}
|
|
288
|
-
helpers.each(chartInstance.scales, (/**
|
|
289
|
-
* @param {?} scale
|
|
290
|
-
* @param {?} id
|
|
291
|
-
* @return {?}
|
|
292
|
-
*/
|
|
293
|
-
function (scale, id) {
|
|
294
|
-
if (scale.isHorizontal() && directionEnabled(zoomMode_1, 'x') && directionEnabled(_whichAxes_1, 'x')) {
|
|
295
|
-
zoomOptions.scaleAxes = 'x';
|
|
296
|
-
zoomScale(scale, zoom, center, zoomOptions);
|
|
297
|
-
}
|
|
298
|
-
else if (!scale.isHorizontal() && directionEnabled(zoomMode_1, 'y') && directionEnabled(_whichAxes_1, 'y')) {
|
|
299
|
-
// Do Y zoom
|
|
300
|
-
zoomOptions.scaleAxes = 'y';
|
|
301
|
-
zoomScale(scale, zoom, center, zoomOptions);
|
|
302
|
-
}
|
|
303
|
-
}));
|
|
304
|
-
chartInstance.update(0);
|
|
305
|
-
if (typeof zoomOptions.onZoom === 'function') {
|
|
306
|
-
zoomOptions.onZoom();
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* @param {?} scale
|
|
312
|
-
* @param {?} delta
|
|
313
|
-
* @param {?} panOptions
|
|
314
|
-
* @return {?}
|
|
315
|
-
*/
|
|
316
|
-
function panIndexScale(scale, delta, panOptions) {
|
|
317
|
-
/** @type {?} */
|
|
318
|
-
var labels = scale.chart.data.labels;
|
|
319
|
-
/** @type {?} */
|
|
320
|
-
var lastLabelIndex = labels.length - 1;
|
|
321
|
-
/** @type {?} */
|
|
322
|
-
var offsetAmt = Math.max((scale.ticks.length - ((scale.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
|
|
323
|
-
/** @type {?} */
|
|
324
|
-
var panSpeed = panOptions.speed;
|
|
325
|
-
/** @type {?} */
|
|
326
|
-
var minIndex = scale.minIndex;
|
|
327
|
-
/** @type {?} */
|
|
328
|
-
var step = Math.round(scale.width / (offsetAmt * panSpeed));
|
|
329
|
-
/** @type {?} */
|
|
330
|
-
var maxIndex;
|
|
331
|
-
zoomNS.panCumulativeDelta += delta;
|
|
332
|
-
minIndex = zoomNS.panCumulativeDelta > step ? Math.max(0, minIndex - 1) : zoomNS.panCumulativeDelta < -step ? Math.min(lastLabelIndex - offsetAmt + 1, minIndex + 1) : minIndex;
|
|
333
|
-
zoomNS.panCumulativeDelta = minIndex !== scale.minIndex ? 0 : zoomNS.panCumulativeDelta;
|
|
334
|
-
maxIndex = Math.min(lastLabelIndex, minIndex + offsetAmt - 1);
|
|
335
|
-
scale.options.ticks.min = rangeMinLimiter(panOptions, labels[minIndex]);
|
|
336
|
-
scale.options.ticks.max = rangeMaxLimiter(panOptions, labels[maxIndex]);
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* @param {?} scale
|
|
340
|
-
* @param {?} delta
|
|
341
|
-
* @param {?} panOptions
|
|
342
|
-
* @return {?}
|
|
343
|
-
*/
|
|
344
|
-
function panTimeScale(scale, delta, panOptions) {
|
|
345
|
-
/** @type {?} */
|
|
346
|
-
var options = scale.options;
|
|
347
|
-
/** @type {?} */
|
|
348
|
-
var limitedMax = rangeMaxLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.max) - delta));
|
|
349
|
-
/** @type {?} */
|
|
350
|
-
var limitedMin = rangeMinLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.min) - delta));
|
|
351
|
-
/** @type {?} */
|
|
352
|
-
var limitedTimeDelta = delta < 0 ? limitedMax - scale.max : limitedMin - scale.min;
|
|
353
|
-
options.time.max = scale.max + limitedTimeDelta;
|
|
354
|
-
options.time.min = scale.min + limitedTimeDelta;
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* @param {?} scale
|
|
358
|
-
* @param {?} delta
|
|
359
|
-
* @param {?} panOptions
|
|
360
|
-
* @return {?}
|
|
361
|
-
*/
|
|
362
|
-
function panNumericalScale(scale, delta, panOptions) {
|
|
363
|
-
/** @type {?} */
|
|
364
|
-
var tickOpts = scale.options.ticks;
|
|
365
|
-
/** @type {?} */
|
|
366
|
-
var start = scale.start;
|
|
367
|
-
/** @type {?} */
|
|
368
|
-
var end = scale.end;
|
|
369
|
-
if (tickOpts.reverse) {
|
|
370
|
-
tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
|
|
371
|
-
tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
|
|
372
|
-
}
|
|
373
|
-
else {
|
|
374
|
-
tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
|
|
375
|
-
tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
|
|
376
|
-
}
|
|
377
|
-
tickOpts.min = rangeMinLimiter(panOptions, tickOpts.min);
|
|
378
|
-
tickOpts.max = rangeMaxLimiter(panOptions, tickOpts.max);
|
|
379
|
-
}
|
|
380
|
-
/**
|
|
381
|
-
* @param {?} scale
|
|
382
|
-
* @param {?} delta
|
|
383
|
-
* @param {?} panOptions
|
|
384
|
-
* @return {?}
|
|
385
|
-
*/
|
|
386
|
-
function panScale(scale, delta, panOptions) {
|
|
387
|
-
/** @type {?} */
|
|
388
|
-
var fn = panFunctions[scale.options.type];
|
|
389
|
-
if (fn) {
|
|
390
|
-
fn(scale, delta, panOptions);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* @param {?} chartInstance
|
|
395
|
-
* @param {?} deltaX
|
|
396
|
-
* @param {?} deltaY
|
|
397
|
-
* @return {?}
|
|
398
|
-
*/
|
|
399
|
-
function doPan(chartInstance, deltaX, deltaY) {
|
|
400
|
-
/** @type {?} */
|
|
401
|
-
var panOptions = chartInstance.options.pan;
|
|
402
|
-
if (panOptions && helpers.getValueOrDefault(panOptions.enabled, defaultOptions.pan.enabled)) {
|
|
403
|
-
/** @type {?} */
|
|
404
|
-
var panMode_1 = helpers.getValueOrDefault(chartInstance.options.pan.mode, defaultOptions.pan.mode);
|
|
405
|
-
panOptions.speed = helpers.getValueOrDefault(chartInstance.options.pan.speed, defaultOptions.pan.speed);
|
|
406
|
-
helpers.each(chartInstance.scales, (/**
|
|
407
|
-
* @param {?} scale
|
|
408
|
-
* @param {?} id
|
|
409
|
-
* @return {?}
|
|
410
|
-
*/
|
|
411
|
-
function (scale, id) {
|
|
412
|
-
if (scale.isHorizontal() && directionEnabled(panMode_1, 'x') && deltaX !== 0) {
|
|
413
|
-
panOptions.scaleAxes = 'x';
|
|
414
|
-
panScale(scale, deltaX, panOptions);
|
|
415
|
-
}
|
|
416
|
-
else if (!scale.isHorizontal() && directionEnabled(panMode_1, 'y') && deltaY !== 0) {
|
|
417
|
-
panOptions.scaleAxes = 'y';
|
|
418
|
-
panScale(scale, deltaY, panOptions);
|
|
419
|
-
}
|
|
420
|
-
}));
|
|
421
|
-
chartInstance.update(0);
|
|
422
|
-
if (typeof panOptions.onPan === 'function') {
|
|
423
|
-
panOptions.onPan();
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* @param {?} chartInstance
|
|
429
|
-
* @param {?} position
|
|
430
|
-
* @return {?}
|
|
431
|
-
*/
|
|
432
|
-
function positionInChartArea(chartInstance, position) {
|
|
433
|
-
return (position.x >= chartInstance.chartArea.left && position.x <= chartInstance.chartArea.right) &&
|
|
434
|
-
(position.y >= chartInstance.chartArea.top && position.y <= chartInstance.chartArea.bottom);
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* @param {?} chartInstance
|
|
438
|
-
* @return {?}
|
|
439
|
-
*/
|
|
440
|
-
function getYAxis(chartInstance) {
|
|
441
|
-
/** @type {?} */
|
|
442
|
-
var scales = chartInstance.scales;
|
|
443
|
-
for (var scaleId in scales) {
|
|
444
|
-
if (scales.hasOwnProperty(scaleId)) {
|
|
445
|
-
/** @type {?} */
|
|
446
|
-
var scale = scales[scaleId];
|
|
447
|
-
if (!scale.isHorizontal()) {
|
|
448
|
-
return scale;
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
// Store these for later
|
|
454
|
-
zoomNS.zoomFunctions.category = zoomIndexScale;
|
|
455
|
-
zoomNS.zoomFunctions.time = zoomTimeScale;
|
|
456
|
-
zoomNS.zoomFunctions.linear = zoomNumericalScale;
|
|
457
|
-
zoomNS.zoomFunctions.logarithmic = zoomNumericalScale;
|
|
458
|
-
zoomNS.panFunctions.category = panIndexScale;
|
|
459
|
-
zoomNS.panFunctions.time = panTimeScale;
|
|
460
|
-
zoomNS.panFunctions.linear = panNumericalScale;
|
|
461
|
-
zoomNS.panFunctions.logarithmic = panNumericalScale;
|
|
462
|
-
// Globals for catergory pan and zoom
|
|
463
|
-
zoomNS.panCumulativeDelta = 0;
|
|
464
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
465
|
-
// Chartjs Zoom Plugin
|
|
466
|
-
/** @type {?} */
|
|
467
|
-
export var zoomPlugin = {
|
|
468
|
-
afterInit: (/**
|
|
469
|
-
* @param {?} chartInstance
|
|
470
|
-
* @return {?}
|
|
471
|
-
*/
|
|
472
|
-
function (chartInstance) {
|
|
473
|
-
helpers.each(chartInstance.scales, (/**
|
|
474
|
-
* @param {?} scale
|
|
475
|
-
* @return {?}
|
|
476
|
-
*/
|
|
477
|
-
function (scale) {
|
|
478
|
-
scale.originalOptions = helpers.clone(scale.options);
|
|
479
|
-
}));
|
|
480
|
-
chartInstance.resetZoom = (/**
|
|
481
|
-
* @return {?}
|
|
482
|
-
*/
|
|
483
|
-
function () {
|
|
484
|
-
helpers.each(chartInstance.scales, (/**
|
|
485
|
-
* @param {?} scale
|
|
486
|
-
* @param {?} id
|
|
487
|
-
* @return {?}
|
|
488
|
-
*/
|
|
489
|
-
function (scale, id) {
|
|
490
|
-
/** @type {?} */
|
|
491
|
-
var timeOptions = scale.options.time;
|
|
492
|
-
/** @type {?} */
|
|
493
|
-
var tickOptions = scale.options.ticks;
|
|
494
|
-
if (timeOptions) {
|
|
495
|
-
timeOptions.min = scale.originalOptions.time.min;
|
|
496
|
-
timeOptions.max = scale.originalOptions.time.max;
|
|
497
|
-
}
|
|
498
|
-
if (tickOptions) {
|
|
499
|
-
tickOptions.min = scale.originalOptions.ticks.min;
|
|
500
|
-
tickOptions.max = scale.originalOptions.ticks.max;
|
|
501
|
-
}
|
|
502
|
-
}));
|
|
503
|
-
helpers.each(chartInstance.data.datasets, (/**
|
|
504
|
-
* @param {?} dataset
|
|
505
|
-
* @param {?} id
|
|
506
|
-
* @return {?}
|
|
507
|
-
*/
|
|
508
|
-
function (dataset, id) {
|
|
509
|
-
dataset._meta = null;
|
|
510
|
-
}));
|
|
511
|
-
chartInstance.update();
|
|
512
|
-
});
|
|
513
|
-
}),
|
|
514
|
-
beforeInit: (/**
|
|
515
|
-
* @param {?} chartInstance
|
|
516
|
-
* @return {?}
|
|
517
|
-
*/
|
|
518
|
-
function (chartInstance) {
|
|
519
|
-
chartInstance.zoom = {};
|
|
520
|
-
/** @type {?} */
|
|
521
|
-
var node = chartInstance.zoom.node = chartInstance.chart.ctx.canvas;
|
|
522
|
-
/** @type {?} */
|
|
523
|
-
var options = chartInstance.options;
|
|
524
|
-
/** @type {?} */
|
|
525
|
-
var panThreshold = helpers.getValueOrDefault(options.pan ? options.pan.threshold : undefined, zoomNS.defaults.pan.threshold);
|
|
526
|
-
if (!options.zoom || !options.zoom.enabled) {
|
|
527
|
-
return;
|
|
528
|
-
}
|
|
529
|
-
if (options.zoom.drag) {
|
|
530
|
-
// Only want to zoom horizontal axis
|
|
531
|
-
options.zoom.mode = 'x';
|
|
532
|
-
chartInstance.zoom._mouseDownHandler = (/**
|
|
533
|
-
* @param {?} event
|
|
534
|
-
* @return {?}
|
|
535
|
-
*/
|
|
536
|
-
function (event) {
|
|
537
|
-
chartInstance.zoom._dragZoomStart = event;
|
|
538
|
-
});
|
|
539
|
-
node.addEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
|
|
540
|
-
chartInstance.zoom._mouseMoveHandler = (/**
|
|
541
|
-
* @param {?} event
|
|
542
|
-
* @return {?}
|
|
543
|
-
*/
|
|
544
|
-
function (event) {
|
|
545
|
-
if (chartInstance.zoom._dragZoomStart) {
|
|
546
|
-
chartInstance.zoom._dragZoomEnd = event;
|
|
547
|
-
chartInstance.update(0);
|
|
548
|
-
}
|
|
549
|
-
});
|
|
550
|
-
node.addEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
|
|
551
|
-
chartInstance.zoom._mouseUpHandler = (/**
|
|
552
|
-
* @param {?} event
|
|
553
|
-
* @return {?}
|
|
554
|
-
*/
|
|
555
|
-
function (event) {
|
|
556
|
-
if (chartInstance.zoom._dragZoomStart) {
|
|
557
|
-
/** @type {?} */
|
|
558
|
-
var chartArea = chartInstance.chartArea;
|
|
559
|
-
/** @type {?} */
|
|
560
|
-
var yAxis = getYAxis(chartInstance);
|
|
561
|
-
/** @type {?} */
|
|
562
|
-
var beginPoint = chartInstance.zoom._dragZoomStart;
|
|
563
|
-
/** @type {?} */
|
|
564
|
-
var offsetX = beginPoint.target.getBoundingClientRect().left;
|
|
565
|
-
/** @type {?} */
|
|
566
|
-
var startX = Math.max(Math.min(beginPoint.clientX, event.clientX) - offsetX, chartArea.left);
|
|
567
|
-
/** @type {?} */
|
|
568
|
-
var endX = Math.min(Math.max(beginPoint.clientX, event.clientX) - offsetX, chartArea.right);
|
|
569
|
-
/** @type {?} */
|
|
570
|
-
var dragDistance = endX - startX;
|
|
571
|
-
/** @type {?} */
|
|
572
|
-
var chartDistance = chartArea.right - chartArea.left;
|
|
573
|
-
/** @type {?} */
|
|
574
|
-
var zoom = 1 + (chartDistance - dragDistance) / chartDistance;
|
|
575
|
-
/** @type {?} */
|
|
576
|
-
var centerX = chartArea.left + (startX - chartArea.left) / (zoom - 1);
|
|
577
|
-
// Remove drag start and end before chart update to stop drawing selected area
|
|
578
|
-
chartInstance.zoom._dragZoomStart = null;
|
|
579
|
-
chartInstance.zoom._dragZoomEnd = null;
|
|
580
|
-
if (dragDistance > 0) {
|
|
581
|
-
doZoom(chartInstance, zoom, {
|
|
582
|
-
x: centerX,
|
|
583
|
-
y: (yAxis.bottom - yAxis.top) / 2,
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
});
|
|
588
|
-
// node.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
589
|
-
node.ownerDocument.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
590
|
-
}
|
|
591
|
-
else {
|
|
592
|
-
chartInstance.zoom._wheelHandler = (/**
|
|
593
|
-
* @param {?} event
|
|
594
|
-
* @return {?}
|
|
595
|
-
*/
|
|
596
|
-
function (event) {
|
|
597
|
-
/** @type {?} */
|
|
598
|
-
var rect = event.target.getBoundingClientRect();
|
|
599
|
-
/** @type {?} */
|
|
600
|
-
var offsetX = event.clientX - rect.left;
|
|
601
|
-
/** @type {?} */
|
|
602
|
-
var offsetY = event.clientY - rect.top;
|
|
603
|
-
/** @type {?} */
|
|
604
|
-
var center = {
|
|
605
|
-
x: offsetX,
|
|
606
|
-
y: offsetY
|
|
607
|
-
};
|
|
608
|
-
if (event.deltaY < 0) {
|
|
609
|
-
doZoom(chartInstance, 1.1, center);
|
|
610
|
-
}
|
|
611
|
-
else {
|
|
612
|
-
doZoom(chartInstance, 0.909, center);
|
|
613
|
-
}
|
|
614
|
-
// Prevent the event from triggering the default behavior (eg. Content scrolling).
|
|
615
|
-
event.preventDefault();
|
|
616
|
-
});
|
|
617
|
-
node.addEventListener('wheel', chartInstance.zoom._wheelHandler);
|
|
618
|
-
}
|
|
619
|
-
if (Hammer) {
|
|
620
|
-
/** @type {?} */
|
|
621
|
-
var mc = new Hammer.Manager(node);
|
|
622
|
-
mc.add(new Hammer.Pinch());
|
|
623
|
-
mc.add(new Hammer.Pan({
|
|
624
|
-
threshold: panThreshold
|
|
625
|
-
}));
|
|
626
|
-
// Hammer reports the total scaling. We need the incremental amount
|
|
627
|
-
/** @type {?} */
|
|
628
|
-
var currentPinchScaling_1;
|
|
629
|
-
/** @type {?} */
|
|
630
|
-
var handlePinch_1 = (/**
|
|
631
|
-
* @param {?} e
|
|
632
|
-
* @return {?}
|
|
633
|
-
*/
|
|
634
|
-
function (e) {
|
|
635
|
-
/** @type {?} */
|
|
636
|
-
var diff = 1 / (currentPinchScaling_1) * e.scale;
|
|
637
|
-
/** @type {?} */
|
|
638
|
-
var rect = e.target.getBoundingClientRect();
|
|
639
|
-
/** @type {?} */
|
|
640
|
-
var offsetX = e.center.x - rect.left;
|
|
641
|
-
/** @type {?} */
|
|
642
|
-
var offsetY = e.center.y - rect.top;
|
|
643
|
-
/** @type {?} */
|
|
644
|
-
var center = {
|
|
645
|
-
x: offsetX,
|
|
646
|
-
y: offsetY
|
|
647
|
-
};
|
|
648
|
-
// fingers position difference
|
|
649
|
-
/** @type {?} */
|
|
650
|
-
var x = Math.abs(e.pointers[0].clientX - e.pointers[1].clientX);
|
|
651
|
-
/** @type {?} */
|
|
652
|
-
var y = Math.abs(e.pointers[0].clientY - e.pointers[1].clientY);
|
|
653
|
-
// diagonal fingers will change both (xy) axes
|
|
654
|
-
/** @type {?} */
|
|
655
|
-
var p = x / y;
|
|
656
|
-
/** @type {?} */
|
|
657
|
-
var xy;
|
|
658
|
-
if (p > 0.3 && p < 1.7) {
|
|
659
|
-
xy = 'xy';
|
|
660
|
-
}
|
|
661
|
-
else if (x > y) {
|
|
662
|
-
// x axis
|
|
663
|
-
xy = 'x';
|
|
664
|
-
}
|
|
665
|
-
else {
|
|
666
|
-
// y axis
|
|
667
|
-
xy = 'y';
|
|
668
|
-
}
|
|
669
|
-
doZoom(chartInstance, diff, center, xy);
|
|
670
|
-
// Keep track of overall scale
|
|
671
|
-
currentPinchScaling_1 = e.scale;
|
|
672
|
-
});
|
|
673
|
-
mc.on('pinchstart', (/**
|
|
674
|
-
* @param {?} e
|
|
675
|
-
* @return {?}
|
|
676
|
-
*/
|
|
677
|
-
function (e) {
|
|
678
|
-
currentPinchScaling_1 = 1; // reset tracker
|
|
679
|
-
}));
|
|
680
|
-
mc.on('pinch', handlePinch_1);
|
|
681
|
-
mc.on('pinchend', (/**
|
|
682
|
-
* @param {?} e
|
|
683
|
-
* @return {?}
|
|
684
|
-
*/
|
|
685
|
-
function (e) {
|
|
686
|
-
handlePinch_1(e);
|
|
687
|
-
currentPinchScaling_1 = null; // reset
|
|
688
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
689
|
-
}));
|
|
690
|
-
/** @type {?} */
|
|
691
|
-
var currentDeltaX_1 = null;
|
|
692
|
-
/** @type {?} */
|
|
693
|
-
var currentDeltaY_1 = null;
|
|
694
|
-
/** @type {?} */
|
|
695
|
-
var panning_1 = false;
|
|
696
|
-
/** @type {?} */
|
|
697
|
-
var handlePan_1 = (/**
|
|
698
|
-
* @param {?} e
|
|
699
|
-
* @return {?}
|
|
700
|
-
*/
|
|
701
|
-
function (e) {
|
|
702
|
-
if (currentDeltaX_1 !== null && currentDeltaY_1 !== null) {
|
|
703
|
-
panning_1 = true;
|
|
704
|
-
/** @type {?} */
|
|
705
|
-
var deltaX = e.deltaX - currentDeltaX_1;
|
|
706
|
-
/** @type {?} */
|
|
707
|
-
var deltaY = e.deltaY - currentDeltaY_1;
|
|
708
|
-
currentDeltaX_1 = e.deltaX;
|
|
709
|
-
currentDeltaY_1 = e.deltaY;
|
|
710
|
-
doPan(chartInstance, deltaX, deltaY);
|
|
711
|
-
}
|
|
712
|
-
});
|
|
713
|
-
mc.on('panstart', (/**
|
|
714
|
-
* @param {?} e
|
|
715
|
-
* @return {?}
|
|
716
|
-
*/
|
|
717
|
-
function (e) {
|
|
718
|
-
currentDeltaX_1 = 0;
|
|
719
|
-
currentDeltaY_1 = 0;
|
|
720
|
-
handlePan_1(e);
|
|
721
|
-
}));
|
|
722
|
-
mc.on('panmove', handlePan_1);
|
|
723
|
-
mc.on('panend', (/**
|
|
724
|
-
* @param {?} e
|
|
725
|
-
* @return {?}
|
|
726
|
-
*/
|
|
727
|
-
function (e) {
|
|
728
|
-
currentDeltaX_1 = null;
|
|
729
|
-
currentDeltaY_1 = null;
|
|
730
|
-
zoomNS.panCumulativeDelta = 0;
|
|
731
|
-
setTimeout((/**
|
|
732
|
-
* @return {?}
|
|
733
|
-
*/
|
|
734
|
-
function () { panning_1 = false; }), 500);
|
|
735
|
-
}));
|
|
736
|
-
chartInstance.zoom._ghostClickHandler = (/**
|
|
737
|
-
* @param {?} e
|
|
738
|
-
* @return {?}
|
|
739
|
-
*/
|
|
740
|
-
function (e) {
|
|
741
|
-
if (panning_1) {
|
|
742
|
-
e.stopImmediatePropagation();
|
|
743
|
-
e.preventDefault();
|
|
744
|
-
}
|
|
745
|
-
});
|
|
746
|
-
node.addEventListener('click', chartInstance.zoom._ghostClickHandler);
|
|
747
|
-
chartInstance._mc = mc;
|
|
748
|
-
}
|
|
749
|
-
}),
|
|
750
|
-
beforeDatasetsDraw: (/**
|
|
751
|
-
* @param {?} chartInstance
|
|
752
|
-
* @return {?}
|
|
753
|
-
*/
|
|
754
|
-
function (chartInstance) {
|
|
755
|
-
/** @type {?} */
|
|
756
|
-
var ctx = chartInstance.chart.ctx;
|
|
757
|
-
/** @type {?} */
|
|
758
|
-
var chartArea = chartInstance.chartArea;
|
|
759
|
-
ctx.save();
|
|
760
|
-
ctx.beginPath();
|
|
761
|
-
if (chartInstance.zoom._dragZoomEnd) {
|
|
762
|
-
/** @type {?} */
|
|
763
|
-
var yAxis = getYAxis(chartInstance);
|
|
764
|
-
/** @type {?} */
|
|
765
|
-
var beginPoint = chartInstance.zoom._dragZoomStart;
|
|
766
|
-
/** @type {?} */
|
|
767
|
-
var endPoint = chartInstance.zoom._dragZoomEnd;
|
|
768
|
-
/** @type {?} */
|
|
769
|
-
var offsetX = beginPoint.target.getBoundingClientRect().left;
|
|
770
|
-
/** @type {?} */
|
|
771
|
-
var startX = Math.min(beginPoint.clientX, endPoint.clientX) - offsetX;
|
|
772
|
-
/** @type {?} */
|
|
773
|
-
var endX = Math.max(beginPoint.clientX, endPoint.clientX) - offsetX;
|
|
774
|
-
/** @type {?} */
|
|
775
|
-
var rectWidth = endX - startX;
|
|
776
|
-
ctx.fillStyle = 'rgba(225,225,225,0.5)';
|
|
777
|
-
ctx.lineWidth = 5;
|
|
778
|
-
ctx.fillRect(startX, yAxis.top, rectWidth, yAxis.bottom - yAxis.top);
|
|
779
|
-
}
|
|
780
|
-
ctx.rect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
|
|
781
|
-
ctx.clip();
|
|
782
|
-
}),
|
|
783
|
-
afterDatasetsDraw: (/**
|
|
784
|
-
* @param {?} chartInstance
|
|
785
|
-
* @return {?}
|
|
786
|
-
*/
|
|
787
|
-
function (chartInstance) {
|
|
788
|
-
chartInstance.chart.ctx.restore();
|
|
789
|
-
}),
|
|
790
|
-
destroy: (/**
|
|
791
|
-
* @param {?} chartInstance
|
|
792
|
-
* @return {?}
|
|
793
|
-
*/
|
|
794
|
-
function (chartInstance) {
|
|
795
|
-
if (chartInstance.zoom) {
|
|
796
|
-
/** @type {?} */
|
|
797
|
-
var options = chartInstance.options;
|
|
798
|
-
/** @type {?} */
|
|
799
|
-
var node = chartInstance.zoom.node;
|
|
800
|
-
if (options.zoom && options.zoom.drag) {
|
|
801
|
-
node.removeEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
|
|
802
|
-
node.removeEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
|
|
803
|
-
// node.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
804
|
-
node.ownerDocument.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
805
|
-
}
|
|
806
|
-
else {
|
|
807
|
-
node.removeEventListener('wheel', chartInstance.zoom._wheelHandler);
|
|
808
|
-
}
|
|
809
|
-
if (Hammer) {
|
|
810
|
-
node.removeEventListener('click', chartInstance.zoom._ghostClickHandler);
|
|
811
|
-
}
|
|
812
|
-
delete chartInstance.zoom;
|
|
813
|
-
/** @type {?} */
|
|
814
|
-
var mc = chartInstance._mc;
|
|
815
|
-
if (mc) {
|
|
816
|
-
mc.remove('pinchstart');
|
|
817
|
-
mc.remove('pinch');
|
|
818
|
-
mc.remove('pinchend');
|
|
819
|
-
mc.remove('panstart');
|
|
820
|
-
mc.remove('pan');
|
|
821
|
-
mc.remove('panend');
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
})
|
|
825
|
-
};
|
|
826
|
-
Chart.pluginService.register(zoomPlugin);
|
|
827
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuem9vbS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1oYW5hLW5hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvIiwic291cmNlcyI6WyJzcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLXpvb20vY2hhcnQuem9vbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QkEsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7O0lBQy9CLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU07O0FBRzFGLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDOztJQUM5QixLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQUEsTUFBTSxFQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQUEsTUFBTSxFQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLOztJQUUvRSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU87OztJQUd2QixNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7OztJQUd0QyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxJQUFJLEVBQUU7O0lBQ2pFLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRTs7O0lBRzlELGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHO0lBQ3ZDLEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxJQUFJO1FBQ2IsSUFBSSxFQUFFLElBQUk7UUFDVixLQUFLLEVBQUUsRUFBRTtRQUNULFNBQVMsRUFBRSxFQUFFO0tBQ2Q7SUFDRCxJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsSUFBSTtRQUNiLElBQUksRUFBRSxJQUFJO1FBQ1YsV0FBVyxFQUFFLENBQUM7S0FDZjtDQUNGOzs7Ozs7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQUksRUFBRSxHQUFHO0lBQ2pDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUN0QixPQUFPLElBQUksQ0FBQztLQUNiO1NBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDbkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ2pDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDOzs7Ozs7QUFFRCxTQUFTLGVBQWUsQ0FBQyxjQUFjLEVBQUUsTUFBTTtJQUM3QyxJQUFJLGNBQWMsQ0FBQyxTQUFTLElBQUksY0FBYyxDQUFDLFFBQVE7UUFDckQsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7O1lBQ3JFLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7UUFDbEUsSUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFO1lBQ3JCLE1BQU0sR0FBRyxRQUFRLENBQUM7U0FDbkI7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7Ozs7OztBQUVELFNBQVMsZUFBZSxDQUFDLGNBQWMsRUFBRSxNQUFNO0lBQzdDLElBQUksY0FBYyxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQUMsUUFBUTtRQUNyRCxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTs7WUFDckUsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUNsRSxJQUFJLE1BQU0sR0FBRyxRQUFRLEVBQUU7WUFDckIsTUFBTSxHQUFHLFFBQVEsQ0FBQztTQUNuQjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQzs7Ozs7Ozs7QUFFRCxTQUFTLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXOztRQUNoRCxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTTs7UUFDbEMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFROztRQUN2QixjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDOztRQUNwQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVE7O1FBQ3ZCLFdBQVcsR0FBRyxXQUFXLENBQUMsV0FBVzs7UUFDckMsV0FBVyxHQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7UUFDckcsYUFBYSxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFaEUsTUFBTSxDQUFDLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFFeEcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFdBQVcsRUFBRTtRQUN0RCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxhQUFhLElBQUksV0FBVyxFQUFFO2dCQUNoQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7b0JBQ2pCLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ25EO3FCQUFNO29CQUNMLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3RDO2FBQ0Y7aUJBQU0sSUFBSSxhQUFhLEdBQUcsV0FBVyxFQUFFO2dCQUN0QyxJQUFJLFFBQVEsSUFBSSxjQUFjLEVBQUU7b0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ3RDO3FCQUFNO29CQUNMLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQ25EO2FBQ0Y7WUFDRCxNQUFNLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO2FBQU0sSUFBSSxNQUFNLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLElBQUksYUFBYSxJQUFJLFdBQVcsRUFBRTtnQkFDaEMsUUFBUSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzthQUN6RjtpQkFBTSxJQUFJLGFBQWEsR0FBRyxXQUFXLEVBQUU7Z0JBQ3RDLFFBQVEsR0FBRyxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7YUFDekY7WUFDRCxNQUFNLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDekUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7S0FDMUU7QUFDSCxDQUFDOzs7Ozs7OztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVc7O1FBQy9DLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTzs7Ozs7Ozs7Ozs7OztRQWF2QixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRzs7UUFDN0IsT0FBTyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7O1FBRTVCLFdBQVcsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztRQUN4RCxXQUFXLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7O1FBQ3ZFLFdBQVcsR0FBRyxDQUFDLEdBQUcsV0FBVzs7UUFFN0IsUUFBUSxHQUFHLE9BQU8sR0FBRyxXQUFXOztRQUNoQyxRQUFRLEdBQUcsT0FBTyxHQUFHLFdBQVc7O1FBRWhDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVE7O1FBQzdCLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVE7O1FBRTdCLFVBQVUsR0FBRyxNQUFNLEdBQUcsTUFBTTs7UUFDNUIsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsS0FBSyxVQUFVOztRQUMxRSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLLFVBQVU7SUFFaEYsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7UUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztLQUMzQjtBQUNILENBQUM7Ozs7Ozs7O0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXOztRQUNwRCxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRzs7UUFDN0IsT0FBTyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7O1FBRTVCLFdBQVcsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztRQUN4RCxXQUFXLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUs7O1FBQ3ZFLFdBQVcsR0FBRyxDQUFDLEdBQUcsV0FBVzs7UUFFN0IsUUFBUSxHQUFHLE9BQU8sR0FBRyxXQUFXOztRQUNoQyxRQUFRLEdBQUcsT0FBTyxHQUFHLFdBQVc7SUFFdEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUM3RSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQy9FLENBQUM7Ozs7Ozs7O0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVzs7UUFDM0MsRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUM1QyxJQUFJLEVBQUUsRUFBRTtRQUNOLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN0QztBQUNILENBQUM7Ozs7Ozs7O0FBRUQsU0FBUyxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBVTs7UUFDL0MsRUFBRSxHQUFHLGFBQWEsQ0FBQyxTQUFTO0lBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLEdBQUc7WUFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQzNCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDNUIsQ0FBQztLQUNIOztRQUVLLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUk7SUFFOUMsSUFBSSxXQUFXLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTs7O1lBRXhGLFVBQVEsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JHLFdBQVcsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzs7WUFHekgsWUFBVTtRQUNkLElBQUksVUFBUSxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1lBQ2hELDZCQUE2QjtZQUM3QixZQUFVLEdBQUcsU0FBUyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxZQUFZO1lBQ1osWUFBVSxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07Ozs7O1FBQUUsVUFBUyxLQUFLLEVBQUUsRUFBRTtZQUNuRCxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksZ0JBQWdCLENBQUMsWUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRyxXQUFXLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQzdDO2lCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksZ0JBQWdCLENBQUMsVUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFlBQVUsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDeEcsWUFBWTtnQkFDWixXQUFXLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksT0FBTyxXQUFXLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtZQUM1QyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDdEI7S0FDRjtBQUNILENBQUM7Ozs7Ozs7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVU7O1FBQ3ZDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNOztRQUNoQyxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDOztRQUNsQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7UUFDbkcsUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLOztRQUM3QixRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVE7O1FBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUM7O1FBQ3pELFFBQVE7SUFFWixNQUFNLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDO0lBRW5DLFFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNoTCxNQUFNLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBRXhGLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxRQUFRLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTlELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7Ozs7Ozs7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVU7O1FBQ3RDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTzs7UUFDdkIsVUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7O1FBQzNHLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDOztRQUUzRyxnQkFBZ0IsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHO0lBRXBGLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLENBQUM7SUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsRCxDQUFDOzs7Ozs7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVU7O1FBQzNDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUs7O1FBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSzs7UUFDdkIsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHO0lBRWpCLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUNwQixRQUFRLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDN0UsUUFBUSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0tBQzVFO1NBQU07UUFDTCxRQUFRLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDN0UsUUFBUSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0tBQzVFO0lBQ0QsUUFBUSxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6RCxRQUFRLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNELENBQUM7Ozs7Ozs7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVU7O1FBQ2xDLEVBQUUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDM0MsSUFBSSxFQUFFLEVBQUU7UUFDTixFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztLQUM5QjtBQUNILENBQUM7Ozs7Ozs7QUFFRCxTQUFTLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU07O1FBQ3BDLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUc7SUFDNUMsSUFBSSxVQUFVLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTs7WUFDckYsU0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDbEcsVUFBVSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEcsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTs7Ozs7UUFBRSxVQUFTLEtBQUssRUFBRSxFQUFFO1lBQ25ELElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLGdCQUFnQixDQUFDLFNBQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUMxRSxVQUFVLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDM0IsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDckM7aUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDbEYsVUFBVSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7Z0JBQzNCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ3JDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRTtZQUMxQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDcEI7S0FDRjtBQUNILENBQUM7Ozs7OztBQUVELFNBQVMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLFFBQVE7SUFDbEQsT0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNsRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hHLENBQUM7Ozs7O0FBRUQsU0FBUyxRQUFRLENBQUMsYUFBYTs7UUFDdkIsTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNO0lBRW5DLEtBQUssSUFBTSxPQUFPLElBQUksTUFBTSxFQUFFO1FBQzVCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTs7Z0JBQzVCLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtLQUNGO0FBQ0gsQ0FBQzs7QUFHRCxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7QUFDL0MsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDO0FBQ2pELE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDO0FBQ3RELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUM3QyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7QUFDeEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUM7QUFDL0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7O0FBRXBELE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQzs7O0FBRy9CLE1BQU0sS0FBTyxVQUFVLEdBQUc7SUFDeEIsU0FBUzs7OztJQUFFLFVBQVMsYUFBYTtRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNOzs7O1FBQUUsVUFBUyxLQUFLO1lBQy9DLEtBQUssQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxFQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsU0FBUzs7O1FBQUc7WUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTs7Ozs7WUFBRSxVQUFTLEtBQUssRUFBRSxFQUFFOztvQkFDN0MsV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTs7b0JBQ2hDLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUs7Z0JBRXZDLElBQUksV0FBVyxFQUFFO29CQUNmLFdBQVcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUNqRCxXQUFXLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztpQkFDbEQ7Z0JBRUQsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsV0FBVyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7b0JBQ2xELFdBQVcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2lCQUNuRDtZQUNILENBQUMsRUFBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVE7Ozs7O1lBQUUsVUFBUyxPQUFPLEVBQUUsRUFBRTtnQkFDNUQsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDdkIsQ0FBQyxFQUFDLENBQUM7WUFFSCxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFBLENBQUM7SUFFSixDQUFDLENBQUE7SUFDRCxVQUFVOzs7O0lBQUUsVUFBUyxhQUFhO1FBQ2hDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztZQUVsQixJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTTs7WUFFL0QsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPOztZQUMvQixZQUFZLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQzlILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDMUMsT0FBTztTQUNSO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNyQixvQ0FBb0M7WUFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBRXhCLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCOzs7O1lBQUcsVUFBUyxLQUFLO2dCQUNuRCxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUMsQ0FBQyxDQUFBLENBQUM7WUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUV6RSxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7OztZQUFHLFVBQVMsS0FBSztnQkFDbkQsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDckMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO29CQUN4QyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6QjtZQUNILENBQUMsQ0FBQSxDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFekUsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlOzs7O1lBQUcsVUFBUyxLQUFLO2dCQUNqRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFOzt3QkFDL0IsU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTOzt3QkFDbkMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7O3dCQUMvQixVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjOzt3QkFDOUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJOzt3QkFDeEQsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQzs7d0JBQ3hGLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUM7O3dCQUN2RixZQUFZLEdBQUcsSUFBSSxHQUFHLE1BQU07O3dCQUM1QixhQUFhLEdBQUcsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSTs7d0JBQ2hELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDLEdBQUcsYUFBYTs7d0JBQ3pELE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7b0JBRXZFLDhFQUE4RTtvQkFDOUUsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUN6QyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBRXZDLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRTt3QkFDcEIsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUU7NEJBQzFCLENBQUMsRUFBRSxPQUFPOzRCQUNWLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7eUJBQ2xDLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtZQUNILENBQUMsQ0FBQSxDQUFDO1lBQ0Ysd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDcEY7YUFBTTtZQUNMLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYTs7OztZQUFHLFVBQVMsS0FBSzs7b0JBQ3pDLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFOztvQkFDM0MsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUk7O29CQUNuQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRzs7b0JBRWxDLE1BQU0sR0FBRztvQkFDYixDQUFDLEVBQUcsT0FBTztvQkFDWCxDQUFDLEVBQUcsT0FBTztpQkFDWjtnQkFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNwQixNQUFNLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDcEM7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3RDO2dCQUNELGtGQUFrRjtnQkFDbEYsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLENBQUMsQ0FBQSxDQUFDO1lBRUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBSSxNQUFNLEVBQUU7O2dCQUNKLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzQixFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDcEIsU0FBUyxFQUFFLFlBQVk7YUFDeEIsQ0FBQyxDQUFDLENBQUM7OztnQkFHQSxxQkFBbUI7O2dCQUNqQixhQUFXOzs7O1lBQUcsVUFBVSxDQUFDOztvQkFDdkIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLHFCQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUs7O29CQUMxQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRTs7b0JBQ3ZDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSTs7b0JBQ2hDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRzs7b0JBQy9CLE1BQU0sR0FBRztvQkFDYixDQUFDLEVBQUcsT0FBTztvQkFDWCxDQUFDLEVBQUcsT0FBTztpQkFDWjs7O29CQUdLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDOztvQkFDM0QsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7OztvQkFHM0QsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDOztvQkFDWCxFQUFFO2dCQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFO29CQUN0QixFQUFFLEdBQUcsSUFBSSxDQUFDO2lCQUNYO3FCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDaEIsU0FBUztvQkFDVCxFQUFFLEdBQUcsR0FBRyxDQUFDO2lCQUNWO3FCQUFNO29CQUNMLFNBQVM7b0JBQ1QsRUFBRSxHQUFHLEdBQUcsQ0FBQztpQkFDVjtnQkFFRCxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBRXhDLDhCQUE4QjtnQkFDOUIscUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNoQyxDQUFDLENBQUE7WUFFRCxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVk7Ozs7WUFBRSxVQUFTLENBQUM7Z0JBQzVCLHFCQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtZQUMzQyxDQUFDLEVBQUMsQ0FBQztZQUNILEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQVcsQ0FBQyxDQUFDO1lBQzVCLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVTs7OztZQUFFLFVBQVMsQ0FBQztnQkFDMUIsYUFBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNmLHFCQUFtQixHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVE7Z0JBQ3BDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7WUFDakMsQ0FBQyxFQUFDLENBQUM7O2dCQUVDLGVBQWEsR0FBRyxJQUFJOztnQkFBRSxlQUFhLEdBQUcsSUFBSTs7Z0JBQUUsU0FBTyxHQUFHLEtBQUs7O2dCQUN6RCxXQUFTOzs7O1lBQUcsVUFBVSxDQUFDO2dCQUMzQixJQUFJLGVBQWEsS0FBSyxJQUFJLElBQUksZUFBYSxLQUFLLElBQUksRUFBRTtvQkFDcEQsU0FBTyxHQUFHLElBQUksQ0FBQzs7d0JBQ1QsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsZUFBYTs7d0JBQ2pDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLGVBQWE7b0JBQ3ZDLGVBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUN6QixlQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDekIsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3RDO1lBQ0gsQ0FBQyxDQUFBO1lBRUQsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVOzs7O1lBQUUsVUFBUyxDQUFDO2dCQUMxQixlQUFhLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixlQUFhLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixXQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDLEVBQUMsQ0FBQztZQUNILEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVMsQ0FBQyxDQUFDO1lBQzVCLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUTs7OztZQUFFLFVBQVMsQ0FBQztnQkFDeEIsZUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsZUFBYSxHQUFHLElBQUksQ0FBQztnQkFDckIsTUFBTSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztnQkFDOUIsVUFBVTs7O2dCQUFDLGNBQWEsU0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRSxHQUFHLENBQUMsQ0FBQztZQUNuRCxDQUFDLEVBQUMsQ0FBQztZQUVILGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCOzs7O1lBQUcsVUFBUyxDQUFDO2dCQUNoRCxJQUFJLFNBQU8sRUFBRTtvQkFDWCxDQUFDLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztvQkFDN0IsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUNwQjtZQUNILENBQUMsQ0FBQSxDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFdEUsYUFBYSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDLENBQUE7SUFFRCxrQkFBa0I7Ozs7SUFBRSxVQUFTLGFBQWE7O1lBQ2xDLEdBQUcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUc7O1lBQzdCLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUztRQUN6QyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFaEIsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTs7Z0JBQzdCLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDOztnQkFDL0IsVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYzs7Z0JBQzlDLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVk7O2dCQUMxQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUk7O2dCQUN4RCxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPOztnQkFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTzs7Z0JBQy9ELFNBQVMsR0FBRyxJQUFJLEdBQUcsTUFBTTtZQUcvQixHQUFHLENBQUMsU0FBUyxHQUFHLHVCQUF1QixDQUFDO1lBQ3hDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNiLENBQUMsQ0FBQTtJQUVELGlCQUFpQjs7OztJQUFFLFVBQVMsYUFBYTtRQUN2QyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQyxDQUFDLENBQUE7SUFFRCxPQUFPOzs7O0lBQUUsVUFBUyxhQUFhO1FBQzdCLElBQUksYUFBYSxDQUFDLElBQUksRUFBRTs7Z0JBQ2hCLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTzs7Z0JBQy9CLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUk7WUFFcEMsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQzVFLDJFQUEyRTtnQkFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN2RjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMxRTtZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQzs7Z0JBRXBCLEVBQUUsR0FBRyxhQUFhLENBQUMsR0FBRztZQUM1QixJQUFJLEVBQUUsRUFBRTtnQkFDTixFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QixFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQixFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0QixFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0QixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQixFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDLENBQUE7Q0FDRjtBQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIHRoaXMgcGx1Z2luIGlzIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvY2hhcnRqcy1wbHVnaW4tem9vbVxyXG4gKiBmb3IgZm9sbG93aW5nIHR3byBvcGVuIGlzc3VlczpcclxuICogaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvY2hhcnRqcy1wbHVnaW4tem9vbS9wdWxsLzE1NVxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tL3B1bGwvMTUwXHJcbiAqXHJcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKSBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBOaWNrIERvd25pZVxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXNcclxuICogc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlXHJcbiAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXHJcbiAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29uc1xyXG4gKiB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yXHJcbiAqIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcclxuICogQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcclxuICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXHJcbiAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4gKiBUSEUgU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuLypqc2xpbnQgYnJvd3Nlcjp0cnVlLCBkZXZlbDp0cnVlLCB3aGl0ZTp0cnVlLCB2YXJzOnRydWUgKi9cclxuLypnbG9iYWwgcmVxdWlyZSovXHJcblxyXG4vLyBoYW1tZXIgSlMgZm9yIHRvdWNoIHN1cHBvcnRcclxuaW1wb3J0ICogYXMgaGFtbWVyanMgZnJvbSAnaGFtbWVyanMnO1xyXG5jb25zdCBIYW1tZXIgPSB3aW5kb3cgJiYgKHdpbmRvdyBhcyBhbnkpLkhhbW1lciA/ICh3aW5kb3cgYXMgYW55KS5IYW1tZXIgOiBoYW1tZXJqcy5IYW1tZXI7XHJcblxyXG4vLyBHZXQgdGhlIGNoYXJ0IHZhcmlhYmxlXHJcbmltcG9ydCAqIGFzIGNoYXJ0anMgZnJvbSAnY2hhcnQuanMnO1xyXG5jb25zdCBDaGFydCA9IHdpbmRvdyAmJiAod2luZG93IGFzIGFueSkuQ2hhcnQgPyAod2luZG93IGFzIGFueSkuQ2hhcnQgOiBjaGFydGpzLkNoYXJ0O1xyXG5cclxuY29uc3QgaGVscGVycyA9IENoYXJ0LmhlbHBlcnM7XHJcblxyXG4vLyBUYWtlIHRoZSB6b29tIG5hbWVzcGFjZSBvZiBDaGFydFxyXG5jb25zdCB6b29tTlMgPSBDaGFydC5ab29tID0gQ2hhcnQuWm9vbSB8fCB7fTtcclxuXHJcbi8vIFdoZXJlIHdlIHN0b3JlIGZ1bmN0aW9ucyB0byBoYW5kbGUgZGlmZmVyZW50IHNjYWxlIHR5cGVzXHJcbmNvbnN0IHpvb21GdW5jdGlvbnMgPSB6b29tTlMuem9vbUZ1bmN0aW9ucyA9IHpvb21OUy56b29tRnVuY3Rpb25zIHx8IHt9O1xyXG5jb25zdCBwYW5GdW5jdGlvbnMgPSB6b29tTlMucGFuRnVuY3Rpb25zID0gem9vbU5TLnBhbkZ1bmN0aW9ucyB8fCB7fTtcclxuXHJcbi8vIERlZmF1bHQgb3B0aW9ucyBpZiBub25lIGFyZSBwcm92aWRlZFxyXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHpvb21OUy5kZWZhdWx0cyA9IHtcclxuICBwYW46IHtcclxuICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICBtb2RlOiAneHknLFxyXG4gICAgc3BlZWQ6IDIwLFxyXG4gICAgdGhyZXNob2xkOiAxMFxyXG4gIH0sXHJcbiAgem9vbToge1xyXG4gICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgIG1vZGU6ICd4eScsXHJcbiAgICBzZW5zaXRpdml0eTogM1xyXG4gIH1cclxufTtcclxuXHJcbmZ1bmN0aW9uIGRpcmVjdGlvbkVuYWJsZWQobW9kZSwgZGlyKSB7XHJcbiAgaWYgKG1vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kZSA9PT0gJ3N0cmluZycpIHtcclxuICAgIHJldHVybiBtb2RlLmluZGV4T2YoZGlyKSAhPT0gLTE7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJhbmdlTWF4TGltaXRlcih6b29tUGFuT3B0aW9ucywgbmV3TWF4KSB7XHJcbiAgaWYgKHpvb21QYW5PcHRpb25zLnNjYWxlQXhlcyAmJiB6b29tUGFuT3B0aW9ucy5yYW5nZU1heCAmJlxyXG4gICAgIWhlbHBlcnMuaXNOdWxsT3JVbmRlZih6b29tUGFuT3B0aW9ucy5yYW5nZU1heFt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdKSkge1xyXG4gICAgY29uc3QgcmFuZ2VNYXggPSB6b29tUGFuT3B0aW9ucy5yYW5nZU1heFt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdO1xyXG4gICAgaWYgKG5ld01heCA+IHJhbmdlTWF4KSB7XHJcbiAgICAgIG5ld01heCA9IHJhbmdlTWF4O1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbmV3TWF4O1xyXG59XHJcblxyXG5mdW5jdGlvbiByYW5nZU1pbkxpbWl0ZXIoem9vbVBhbk9wdGlvbnMsIG5ld01pbikge1xyXG4gIGlmICh6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXMgJiYgem9vbVBhbk9wdGlvbnMucmFuZ2VNaW4gJiZcclxuICAgICFoZWxwZXJzLmlzTnVsbE9yVW5kZWYoem9vbVBhbk9wdGlvbnMucmFuZ2VNaW5bem9vbVBhbk9wdGlvbnMuc2NhbGVBeGVzXSkpIHtcclxuICAgIGNvbnN0IHJhbmdlTWluID0gem9vbVBhbk9wdGlvbnMucmFuZ2VNaW5bem9vbVBhbk9wdGlvbnMuc2NhbGVBeGVzXTtcclxuICAgIGlmIChuZXdNaW4gPCByYW5nZU1pbikge1xyXG4gICAgICBuZXdNaW4gPSByYW5nZU1pbjtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG5ld01pbjtcclxufVxyXG5cclxuZnVuY3Rpb24gem9vbUluZGV4U2NhbGUoc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpIHtcclxuICBjb25zdCBsYWJlbHMgPSBzY2FsZS5jaGFydC5kYXRhLmxhYmVscztcclxuICBsZXQgbWluSW5kZXggPSBzY2FsZS5taW5JbmRleDtcclxuICBjb25zdCBsYXN0TGFiZWxJbmRleCA9IGxhYmVscy5sZW5ndGggLSAxO1xyXG4gIGxldCBtYXhJbmRleCA9IHNjYWxlLm1heEluZGV4O1xyXG4gIGNvbnN0IHNlbnNpdGl2aXR5ID0gem9vbU9wdGlvbnMuc2Vuc2l0aXZpdHk7XHJcbiAgY29uc3QgY2hhcnRDZW50ZXIgPSAgc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBzY2FsZS5sZWZ0ICsgKHNjYWxlLndpZHRoIC8gMikgOiBzY2FsZS50b3AgKyAoc2NhbGUuaGVpZ2h0IC8gMik7XHJcbiAgY29uc3QgY2VudGVyUG9pbnRlciA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpID8gY2VudGVyLnggOiBjZW50ZXIueTtcclxuXHJcbiAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSB6b29tID4gMSA/IHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhICsgMSA6IHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhIC0gMTtcclxuXHJcbiAgaWYgKE1hdGguYWJzKHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhKSA+IHNlbnNpdGl2aXR5KSB7XHJcbiAgICBpZiAoem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPCAwKSB7XHJcbiAgICAgIGlmIChjZW50ZXJQb2ludGVyID49IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgaWYgKG1pbkluZGV4IDw9IDApIHtcclxuICAgICAgICAgIG1heEluZGV4ID0gTWF0aC5taW4obGFzdExhYmVsSW5kZXgsIG1heEluZGV4ICsgMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG1pbkluZGV4ID0gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY2VudGVyUG9pbnRlciA8IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgaWYgKG1heEluZGV4ID49IGxhc3RMYWJlbEluZGV4KSB7XHJcbiAgICAgICAgICBtaW5JbmRleCA9IE1hdGgubWF4KDAsIG1pbkluZGV4IC0gMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG1heEluZGV4ID0gTWF0aC5taW4obGFzdExhYmVsSW5kZXgsIG1heEluZGV4ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgIH0gZWxzZSBpZiAoem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPiAwKSB7XHJcbiAgICAgIGlmIChjZW50ZXJQb2ludGVyID49IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgbWluSW5kZXggPSBtaW5JbmRleCA8IG1heEluZGV4ID8gbWluSW5kZXggPSBNYXRoLm1pbihtYXhJbmRleCwgbWluSW5kZXggKyAxKSA6IG1pbkluZGV4O1xyXG4gICAgICB9IGVsc2UgaWYgKGNlbnRlclBvaW50ZXIgPCBjaGFydENlbnRlcikge1xyXG4gICAgICAgIG1heEluZGV4ID0gbWF4SW5kZXggPiBtaW5JbmRleCA/IG1heEluZGV4ID0gTWF0aC5tYXgobWluSW5kZXgsIG1heEluZGV4IC0gMSkgOiBtYXhJbmRleDtcclxuICAgICAgfVxyXG4gICAgICB6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA9IDA7XHJcbiAgICB9XHJcbiAgICBzY2FsZS5vcHRpb25zLnRpY2tzLm1pbiA9IHJhbmdlTWluTGltaXRlcih6b29tT3B0aW9ucywgbGFiZWxzW21pbkluZGV4XSk7XHJcbiAgICBzY2FsZS5vcHRpb25zLnRpY2tzLm1heCA9IHJhbmdlTWF4TGltaXRlcih6b29tT3B0aW9ucywgbGFiZWxzW21heEluZGV4XSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVGltZVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKSB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IHNjYWxlLm9wdGlvbnM7XHJcblxyXG4gIC8vIHZhciByYW5nZTtcclxuICAvLyB2YXIgbWluX3BlcmNlbnQ7XHJcbiAgLy8gaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpKSB7XHJcbiAgLy8gICByYW5nZSA9IHNjYWxlLnJpZ2h0IC0gc2NhbGUubGVmdDtcclxuICAvLyAgIG1pbl9wZXJjZW50ID0gKGNlbnRlci54IC0gc2NhbGUubGVmdCkgLyByYW5nZTtcclxuICAvLyB9IGVsc2Uge1xyXG4gIC8vICAgcmFuZ2UgPSBzY2FsZS5ib3R0b20gLSBzY2FsZS50b3A7XHJcbiAgLy8gICBtaW5fcGVyY2VudCA9IChjZW50ZXIueSAtIHNjYWxlLnRvcCkgLyByYW5nZTtcclxuICAvLyB9XHJcbiAgLy9cclxuICAvLyB2YXIgbWF4X3BlcmNlbnQgPSAxIC0gbWluX3BlcmNlbnQ7XHJcbiAgY29uc3QgcmFuZ2UgPSBzY2FsZS5tYXggLSBzY2FsZS5taW47XHJcbiAgY29uc3QgbmV3RGlmZiA9IHJhbmdlICogKHpvb20gLSAxKTtcclxuXHJcbiAgY29uc3QgY3Vyc29yUGl4ZWwgPSBzY2FsZS5pc0hvcml6b250YWwoKSA/IGNlbnRlci54IDogY2VudGVyLnk7XHJcbiAgY29uc3QgbWluX3BlcmNlbnQgPSAoc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChjdXJzb3JQaXhlbCkgLSBzY2FsZS5taW4pIC8gcmFuZ2U7XHJcbiAgY29uc3QgbWF4X3BlcmNlbnQgPSAxIC0gbWluX3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG1pbkRlbHRhID0gbmV3RGlmZiAqIG1pbl9wZXJjZW50O1xyXG4gIGNvbnN0IG1heERlbHRhID0gbmV3RGlmZiAqIG1heF9wZXJjZW50O1xyXG5cclxuICBjb25zdCBuZXdNaW4gPSBzY2FsZS5taW4gKyBtaW5EZWx0YTtcclxuICBjb25zdCBuZXdNYXggPSBzY2FsZS5tYXggLSBtYXhEZWx0YTtcclxuXHJcbiAgY29uc3QgZGlmZk1pbk1heCA9IG5ld01heCAtIG5ld01pbjtcclxuICBjb25zdCBtaW5MaW1pdEV4Y2VlZGVkID0gcmFuZ2VNaW5MaW1pdGVyKHpvb21PcHRpb25zLCBkaWZmTWluTWF4KSAhPT0gZGlmZk1pbk1heDtcclxuICBjb25zdCBtYXhMaW1pdEV4Y2VlZGVkID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBkaWZmTWluTWF4KSAhPT0gZGlmZk1pbk1heDtcclxuXHJcbiAgaWYgKCFtaW5MaW1pdEV4Y2VlZGVkICYmICFtYXhMaW1pdEV4Y2VlZGVkKSB7XHJcbiAgICBvcHRpb25zLnRpbWUubWluID0gbmV3TWluO1xyXG4gICAgb3B0aW9ucy50aW1lLm1heCA9IG5ld01heDtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21OdW1lcmljYWxTY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IHJhbmdlID0gc2NhbGUubWF4IC0gc2NhbGUubWluO1xyXG4gIGNvbnN0IG5ld0RpZmYgPSByYW5nZSAqICh6b29tIC0gMSk7XHJcblxyXG4gIGNvbnN0IGN1cnNvclBpeGVsID0gc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBjZW50ZXIueCA6IGNlbnRlci55O1xyXG4gIGNvbnN0IG1pbl9wZXJjZW50ID0gKHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoY3Vyc29yUGl4ZWwpIC0gc2NhbGUubWluKSAvIHJhbmdlO1xyXG4gIGNvbnN0IG1heF9wZXJjZW50ID0gMSAtIG1pbl9wZXJjZW50O1xyXG5cclxuICBjb25zdCBtaW5EZWx0YSA9IG5ld0RpZmYgKiBtaW5fcGVyY2VudDtcclxuICBjb25zdCBtYXhEZWx0YSA9IG5ld0RpZmYgKiBtYXhfcGVyY2VudDtcclxuXHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5taW4gPSByYW5nZU1pbkxpbWl0ZXIoem9vbU9wdGlvbnMsIHNjYWxlLm1pbiArIG1pbkRlbHRhKTtcclxuICBzY2FsZS5vcHRpb25zLnRpY2tzLm1heCA9IHJhbmdlTWF4TGltaXRlcih6b29tT3B0aW9ucywgc2NhbGUubWF4IC0gbWF4RGVsdGEpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tU2NhbGUoc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpIHtcclxuICBjb25zdCBmbiA9IHpvb21GdW5jdGlvbnNbc2NhbGUub3B0aW9ucy50eXBlXTtcclxuICBpZiAoZm4pIHtcclxuICAgIGZuKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRvWm9vbShjaGFydEluc3RhbmNlLCB6b29tLCBjZW50ZXIsIHdoaWNoQXhlcz8pIHtcclxuICBjb25zdCBjYSA9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhO1xyXG4gIGlmICghY2VudGVyKSB7XHJcbiAgICBjZW50ZXIgPSB7XHJcbiAgICAgIHg6IChjYS5sZWZ0ICsgY2EucmlnaHQpIC8gMixcclxuICAgICAgeTogKGNhLnRvcCArIGNhLmJvdHRvbSkgLyAyLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHpvb21PcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zLnpvb207XHJcblxyXG4gIGlmICh6b29tT3B0aW9ucyAmJiBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KHpvb21PcHRpb25zLmVuYWJsZWQsIGRlZmF1bHRPcHRpb25zLnpvb20uZW5hYmxlZCkpIHtcclxuICAgIC8vIERvIHRoZSB6b29tIGhlcmVcclxuICAgIGNvbnN0IHpvb21Nb2RlID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChjaGFydEluc3RhbmNlLm9wdGlvbnMuem9vbS5tb2RlLCBkZWZhdWx0T3B0aW9ucy56b29tLm1vZGUpO1xyXG4gICAgem9vbU9wdGlvbnMuc2Vuc2l0aXZpdHkgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy56b29tLnNlbnNpdGl2aXR5LCBkZWZhdWx0T3B0aW9ucy56b29tLnNlbnNpdGl2aXR5KTtcclxuXHJcbiAgICAvLyBXaGljaCBheGUgc2hvdWxkIGJlIG1vZGlmaWVkIHdoZW4gZmlnZXJzIHdlcmUgdXNlZC5cclxuICAgIGxldCBfd2hpY2hBeGVzO1xyXG4gICAgaWYgKHpvb21Nb2RlID09PSAneHknICYmIHdoaWNoQXhlcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIGJhc2VkIG9uIGZpbmdlcnMgcG9zaXRpb25zXHJcbiAgICAgIF93aGljaEF4ZXMgPSB3aGljaEF4ZXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBubyBlZmZlY3RcclxuICAgICAgX3doaWNoQXhlcyA9ICd4eSc7XHJcbiAgICB9XHJcblxyXG4gICAgaGVscGVycy5lYWNoKGNoYXJ0SW5zdGFuY2Uuc2NhbGVzLCBmdW5jdGlvbihzY2FsZSwgaWQpIHtcclxuICAgICAgaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQoem9vbU1vZGUsICd4JykgJiYgZGlyZWN0aW9uRW5hYmxlZChfd2hpY2hBeGVzLCAneCcpKSB7XHJcbiAgICAgICAgem9vbU9wdGlvbnMuc2NhbGVBeGVzID0gJ3gnO1xyXG4gICAgICAgIHpvb21TY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQoem9vbU1vZGUsICd5JykgJiYgZGlyZWN0aW9uRW5hYmxlZChfd2hpY2hBeGVzLCAneScpKSB7XHJcbiAgICAgICAgLy8gRG8gWSB6b29tXHJcbiAgICAgICAgem9vbU9wdGlvbnMuc2NhbGVBeGVzID0gJ3knO1xyXG4gICAgICAgIHpvb21TY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNoYXJ0SW5zdGFuY2UudXBkYXRlKDApO1xyXG4gICAgaWYgKHR5cGVvZiB6b29tT3B0aW9ucy5vblpvb20gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgem9vbU9wdGlvbnMub25ab29tKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYW5JbmRleFNjYWxlKHNjYWxlLCBkZWx0YSwgcGFuT3B0aW9ucykge1xyXG4gIGNvbnN0IGxhYmVscyA9IHNjYWxlLmNoYXJ0LmRhdGEubGFiZWxzO1xyXG4gIGNvbnN0IGxhc3RMYWJlbEluZGV4ID0gbGFiZWxzLmxlbmd0aCAtIDE7XHJcbiAgY29uc3Qgb2Zmc2V0QW10ID0gTWF0aC5tYXgoKHNjYWxlLnRpY2tzLmxlbmd0aCAtICgoc2NhbGUub3B0aW9ucy5ncmlkTGluZXMub2Zmc2V0R3JpZExpbmVzKSA/IDAgOiAxKSksIDEpO1xyXG4gIGNvbnN0IHBhblNwZWVkID0gcGFuT3B0aW9ucy5zcGVlZDtcclxuICBsZXQgbWluSW5kZXggPSBzY2FsZS5taW5JbmRleDtcclxuICBjb25zdCBzdGVwID0gTWF0aC5yb3VuZChzY2FsZS53aWR0aCAvIChvZmZzZXRBbXQgKiBwYW5TcGVlZCkpO1xyXG4gIGxldCBtYXhJbmRleDtcclxuXHJcbiAgem9vbU5TLnBhbkN1bXVsYXRpdmVEZWx0YSArPSBkZWx0YTtcclxuXHJcbiAgbWluSW5kZXggPSB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID4gc3RlcCA/IE1hdGgubWF4KDAsIG1pbkluZGV4IC0gMSkgOiB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhIDwgLXN0ZXAgPyBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCAtIG9mZnNldEFtdCArIDEsIG1pbkluZGV4ICsgMSkgOiBtaW5JbmRleDtcclxuICB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID0gbWluSW5kZXggIT09IHNjYWxlLm1pbkluZGV4ID8gMCA6IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGE7XHJcblxyXG4gIG1heEluZGV4ID0gTWF0aC5taW4obGFzdExhYmVsSW5kZXgsIG1pbkluZGV4ICsgb2Zmc2V0QW10IC0gMSk7XHJcblxyXG4gIHNjYWxlLm9wdGlvbnMudGlja3MubWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIGxhYmVsc1ttaW5JbmRleF0pO1xyXG4gIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIGxhYmVsc1ttYXhJbmRleF0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYW5UaW1lU2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IHNjYWxlLm9wdGlvbnM7XHJcbiAgY29uc3QgbGltaXRlZE1heCA9IHJhbmdlTWF4TGltaXRlcihwYW5PcHRpb25zLCBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc2NhbGUubWF4KSAtIGRlbHRhKSk7XHJcbiAgY29uc3QgbGltaXRlZE1pbiA9IHJhbmdlTWluTGltaXRlcihwYW5PcHRpb25zLCBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc2NhbGUubWluKSAtIGRlbHRhKSk7XHJcblxyXG4gIGNvbnN0IGxpbWl0ZWRUaW1lRGVsdGEgPSBkZWx0YSA8IDAgPyBsaW1pdGVkTWF4IC0gc2NhbGUubWF4IDogbGltaXRlZE1pbiAtIHNjYWxlLm1pbjtcclxuXHJcbiAgb3B0aW9ucy50aW1lLm1heCA9IHNjYWxlLm1heCArIGxpbWl0ZWRUaW1lRGVsdGE7XHJcbiAgb3B0aW9ucy50aW1lLm1pbiA9IHNjYWxlLm1pbiArIGxpbWl0ZWRUaW1lRGVsdGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhbk51bWVyaWNhbFNjYWxlKHNjYWxlLCBkZWx0YSwgcGFuT3B0aW9ucykge1xyXG4gIGNvbnN0IHRpY2tPcHRzID0gc2NhbGUub3B0aW9ucy50aWNrcztcclxuICBjb25zdCBzdGFydCA9IHNjYWxlLnN0YXJ0LFxyXG4gICAgZW5kID0gc2NhbGUuZW5kO1xyXG5cclxuICBpZiAodGlja09wdHMucmV2ZXJzZSkge1xyXG4gICAgdGlja09wdHMubWF4ID0gc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN0YXJ0KSAtIGRlbHRhKTtcclxuICAgIHRpY2tPcHRzLm1pbiA9IHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShlbmQpIC0gZGVsdGEpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aWNrT3B0cy5taW4gPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQpIC0gZGVsdGEpO1xyXG4gICAgdGlja09wdHMubWF4ID0gc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKGVuZCkgLSBkZWx0YSk7XHJcbiAgfVxyXG4gIHRpY2tPcHRzLm1pbiA9IHJhbmdlTWluTGltaXRlcihwYW5PcHRpb25zLCB0aWNrT3B0cy5taW4pO1xyXG4gIHRpY2tPcHRzLm1heCA9IHJhbmdlTWF4TGltaXRlcihwYW5PcHRpb25zLCB0aWNrT3B0cy5tYXgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYW5TY2FsZShzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpIHtcclxuICBjb25zdCBmbiA9IHBhbkZ1bmN0aW9uc1tzY2FsZS5vcHRpb25zLnR5cGVdO1xyXG4gIGlmIChmbikge1xyXG4gICAgZm4oc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRvUGFuKGNoYXJ0SW5zdGFuY2UsIGRlbHRhWCwgZGVsdGFZKSB7XHJcbiAgY29uc3QgcGFuT3B0aW9ucyA9IGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy5wYW47XHJcbiAgaWYgKHBhbk9wdGlvbnMgJiYgaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChwYW5PcHRpb25zLmVuYWJsZWQsIGRlZmF1bHRPcHRpb25zLnBhbi5lbmFibGVkKSkge1xyXG4gICAgY29uc3QgcGFuTW9kZSA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoY2hhcnRJbnN0YW5jZS5vcHRpb25zLnBhbi5tb2RlLCBkZWZhdWx0T3B0aW9ucy5wYW4ubW9kZSk7XHJcbiAgICBwYW5PcHRpb25zLnNwZWVkID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChjaGFydEluc3RhbmNlLm9wdGlvbnMucGFuLnNwZWVkLCBkZWZhdWx0T3B0aW9ucy5wYW4uc3BlZWQpO1xyXG5cclxuICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUsIGlkKSB7XHJcbiAgICAgIGlmIChzY2FsZS5pc0hvcml6b250YWwoKSAmJiBkaXJlY3Rpb25FbmFibGVkKHBhbk1vZGUsICd4JykgJiYgZGVsdGFYICE9PSAwKSB7XHJcbiAgICAgICAgcGFuT3B0aW9ucy5zY2FsZUF4ZXMgPSAneCc7XHJcbiAgICAgICAgcGFuU2NhbGUoc2NhbGUsIGRlbHRhWCwgcGFuT3B0aW9ucyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQocGFuTW9kZSwgJ3knKSAmJiBkZWx0YVkgIT09IDApIHtcclxuICAgICAgICBwYW5PcHRpb25zLnNjYWxlQXhlcyA9ICd5JztcclxuICAgICAgICBwYW5TY2FsZShzY2FsZSwgZGVsdGFZLCBwYW5PcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICBpZiAodHlwZW9mIHBhbk9wdGlvbnMub25QYW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcGFuT3B0aW9ucy5vblBhbigpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcG9zaXRpb25JbkNoYXJ0QXJlYShjaGFydEluc3RhbmNlLCBwb3NpdGlvbikge1xyXG4gIHJldHVybiAgIChwb3NpdGlvbi54ID49IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLmxlZnQgJiYgcG9zaXRpb24ueCA8PSBjaGFydEluc3RhbmNlLmNoYXJ0QXJlYS5yaWdodCkgJiZcclxuICAgIChwb3NpdGlvbi55ID49IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLnRvcCAmJiBwb3NpdGlvbi55IDw9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLmJvdHRvbSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFlBeGlzKGNoYXJ0SW5zdGFuY2UpIHtcclxuICBjb25zdCBzY2FsZXMgPSBjaGFydEluc3RhbmNlLnNjYWxlcztcclxuXHJcbiAgZm9yIChjb25zdCBzY2FsZUlkIGluIHNjYWxlcykge1xyXG4gICAgaWYgKHNjYWxlcy5oYXNPd25Qcm9wZXJ0eShzY2FsZUlkKSkge1xyXG4gICAgICBjb25zdCBzY2FsZSA9IHNjYWxlc1tzY2FsZUlkXTtcclxuICAgICAgaWYgKCFzY2FsZS5pc0hvcml6b250YWwoKSkge1xyXG4gICAgICAgIHJldHVybiBzY2FsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gU3RvcmUgdGhlc2UgZm9yIGxhdGVyXHJcbnpvb21OUy56b29tRnVuY3Rpb25zLmNhdGVnb3J5ID0gem9vbUluZGV4U2NhbGU7XHJcbnpvb21OUy56b29tRnVuY3Rpb25zLnRpbWUgPSB6b29tVGltZVNjYWxlO1xyXG56b29tTlMuem9vbUZ1bmN0aW9ucy5saW5lYXIgPSB6b29tTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy56b29tRnVuY3Rpb25zLmxvZ2FyaXRobWljID0gem9vbU51bWVyaWNhbFNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLmNhdGVnb3J5ID0gcGFuSW5kZXhTY2FsZTtcclxuem9vbU5TLnBhbkZ1bmN0aW9ucy50aW1lID0gcGFuVGltZVNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLmxpbmVhciA9IHBhbk51bWVyaWNhbFNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLmxvZ2FyaXRobWljID0gcGFuTnVtZXJpY2FsU2NhbGU7XHJcbi8vIEdsb2JhbHMgZm9yIGNhdGVyZ29yeSBwYW4gYW5kIHpvb21cclxuem9vbU5TLnBhbkN1bXVsYXRpdmVEZWx0YSA9IDA7XHJcbnpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuXHJcbi8vIENoYXJ0anMgWm9vbSBQbHVnaW5cclxuZXhwb3J0IGNvbnN0IHpvb21QbHVnaW4gPSB7XHJcbiAgYWZ0ZXJJbml0OiBmdW5jdGlvbihjaGFydEluc3RhbmNlKSB7XHJcbiAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XHJcbiAgICAgIHNjYWxlLm9yaWdpbmFsT3B0aW9ucyA9IGhlbHBlcnMuY2xvbmUoc2NhbGUub3B0aW9ucyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjaGFydEluc3RhbmNlLnJlc2V0Wm9vbSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlLCBpZCkge1xyXG4gICAgICAgIGNvbnN0IHRpbWVPcHRpb25zID0gc2NhbGUub3B0aW9ucy50aW1lO1xyXG4gICAgICAgIGNvbnN0IHRpY2tPcHRpb25zID0gc2NhbGUub3B0aW9ucy50aWNrcztcclxuXHJcbiAgICAgICAgaWYgKHRpbWVPcHRpb25zKSB7XHJcbiAgICAgICAgICB0aW1lT3B0aW9ucy5taW4gPSBzY2FsZS5vcmlnaW5hbE9wdGlvbnMudGltZS5taW47XHJcbiAgICAgICAgICB0aW1lT3B0aW9ucy5tYXggPSBzY2FsZS5vcmlnaW5hbE9wdGlvbnMudGltZS5tYXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGlja09wdGlvbnMpIHtcclxuICAgICAgICAgIHRpY2tPcHRpb25zLm1pbiA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aWNrcy5taW47XHJcbiAgICAgICAgICB0aWNrT3B0aW9ucy5tYXggPSBzY2FsZS5vcmlnaW5hbE9wdGlvbnMudGlja3MubWF4O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5kYXRhLmRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBpZCkge1xyXG4gICAgICAgIGRhdGFzZXQuX21ldGEgPSBudWxsO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2UudXBkYXRlKCk7XHJcbiAgICB9O1xyXG5cclxuICB9LFxyXG4gIGJlZm9yZUluaXQ6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGNoYXJ0SW5zdGFuY2Uuem9vbSA9IHt9O1xyXG5cclxuICAgIGNvbnN0IG5vZGUgPSBjaGFydEluc3RhbmNlLnpvb20ubm9kZSA9IGNoYXJ0SW5zdGFuY2UuY2hhcnQuY3R4LmNhbnZhcztcclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zO1xyXG4gICAgY29uc3QgcGFuVGhyZXNob2xkID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChvcHRpb25zLnBhbiA/IG9wdGlvbnMucGFuLnRocmVzaG9sZCA6IHVuZGVmaW5lZCwgem9vbU5TLmRlZmF1bHRzLnBhbi50aHJlc2hvbGQpO1xyXG4gICAgaWYgKCFvcHRpb25zLnpvb20gfHwgIW9wdGlvbnMuem9vbS5lbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLnpvb20uZHJhZykge1xyXG4gICAgICAvLyBPbmx5IHdhbnQgdG8gem9vbSBob3Jpem9udGFsIGF4aXNcclxuICAgICAgb3B0aW9ucy56b29tLm1vZGUgPSAneCc7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlRG93bkhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCA9IGV2ZW50O1xyXG4gICAgICB9O1xyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VEb3duSGFuZGxlcik7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlTW92ZUhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgIGlmIChjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tU3RhcnQpIHtcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21FbmQgPSBldmVudDtcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2UudXBkYXRlKDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlTW92ZUhhbmRsZXIpO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCkge1xyXG4gICAgICAgICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgICAgICAgICBjb25zdCB5QXhpcyA9IGdldFlBeGlzKGNoYXJ0SW5zdGFuY2UpO1xyXG4gICAgICAgICAgY29uc3QgYmVnaW5Qb2ludCA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydDtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBiZWdpblBvaW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgICAgICAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoTWF0aC5taW4oYmVnaW5Qb2ludC5jbGllbnRYLCBldmVudC5jbGllbnRYKSAtIG9mZnNldFgsIGNoYXJ0QXJlYS5sZWZ0KTtcclxuICAgICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLm1pbihNYXRoLm1heChiZWdpblBvaW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFgpIC0gb2Zmc2V0WCwgY2hhcnRBcmVhLnJpZ2h0KTtcclxuICAgICAgICAgIGNvbnN0IGRyYWdEaXN0YW5jZSA9IGVuZFggLSBzdGFydFg7XHJcbiAgICAgICAgICBjb25zdCBjaGFydERpc3RhbmNlID0gY2hhcnRBcmVhLnJpZ2h0IC0gY2hhcnRBcmVhLmxlZnQ7XHJcbiAgICAgICAgICBjb25zdCB6b29tID0gMSArIChjaGFydERpc3RhbmNlIC0gZHJhZ0Rpc3RhbmNlKSAvIGNoYXJ0RGlzdGFuY2U7XHJcbiAgICAgICAgICBjb25zdCBjZW50ZXJYID0gY2hhcnRBcmVhLmxlZnQgKyAoc3RhcnRYIC0gY2hhcnRBcmVhLmxlZnQpIC8gKHpvb20gLSAxKTtcclxuXHJcbiAgICAgICAgICAvLyBSZW1vdmUgZHJhZyBzdGFydCBhbmQgZW5kIGJlZm9yZSBjaGFydCB1cGRhdGUgdG8gc3RvcCBkcmF3aW5nIHNlbGVjdGVkIGFyZWFcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCA9IG51bGw7XHJcbiAgICAgICAgICBjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tRW5kID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAoZHJhZ0Rpc3RhbmNlID4gMCkge1xyXG4gICAgICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgem9vbSwge1xyXG4gICAgICAgICAgICAgIHg6IGNlbnRlclgsXHJcbiAgICAgICAgICAgICAgeTogKHlBeGlzLmJvdHRvbSAtIHlBeGlzLnRvcCkgLyAyLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIC8vIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgICBub2RlLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl93aGVlbEhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBldmVudC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcclxuXHJcbiAgICAgICAgY29uc3QgY2VudGVyID0ge1xyXG4gICAgICAgICAgeCA6IG9mZnNldFgsXHJcbiAgICAgICAgICB5IDogb2Zmc2V0WVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7XHJcbiAgICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgMS4xLCBjZW50ZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgMC45MDksIGNlbnRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByZXZlbnQgdGhlIGV2ZW50IGZyb20gdHJpZ2dlcmluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciAoZWcuIENvbnRlbnQgc2Nyb2xsaW5nKS5cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fd2hlZWxIYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFtbWVyKSB7XHJcbiAgICAgIGNvbnN0IG1jID0gbmV3IEhhbW1lci5NYW5hZ2VyKG5vZGUpO1xyXG4gICAgICBtYy5hZGQobmV3IEhhbW1lci5QaW5jaCgpKTtcclxuICAgICAgbWMuYWRkKG5ldyBIYW1tZXIuUGFuKHtcclxuICAgICAgICB0aHJlc2hvbGQ6IHBhblRocmVzaG9sZFxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgICAvLyBIYW1tZXIgcmVwb3J0cyB0aGUgdG90YWwgc2NhbGluZy4gV2UgbmVlZCB0aGUgaW5jcmVtZW50YWwgYW1vdW50XHJcbiAgICAgIGxldCBjdXJyZW50UGluY2hTY2FsaW5nO1xyXG4gICAgICBjb25zdCBoYW5kbGVQaW5jaCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgY29uc3QgZGlmZiA9IDEgLyAoY3VycmVudFBpbmNoU2NhbGluZykgKiBlLnNjYWxlO1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZS5jZW50ZXIueCAtIHJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZS5jZW50ZXIueSAtIHJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHtcclxuICAgICAgICAgIHggOiBvZmZzZXRYLFxyXG4gICAgICAgICAgeSA6IG9mZnNldFlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBmaW5nZXJzIHBvc2l0aW9uIGRpZmZlcmVuY2VcclxuICAgICAgICBjb25zdCB4ID0gTWF0aC5hYnMoZS5wb2ludGVyc1swXS5jbGllbnRYIC0gZS5wb2ludGVyc1sxXS5jbGllbnRYKTtcclxuICAgICAgICBjb25zdCB5ID0gTWF0aC5hYnMoZS5wb2ludGVyc1swXS5jbGllbnRZIC0gZS5wb2ludGVyc1sxXS5jbGllbnRZKTtcclxuXHJcbiAgICAgICAgLy8gZGlhZ29uYWwgZmluZ2VycyB3aWxsIGNoYW5nZSBib3RoICh4eSkgYXhlc1xyXG4gICAgICAgIGNvbnN0IHAgPSB4IC8geTtcclxuICAgICAgICBsZXQgeHk7XHJcbiAgICAgICAgaWYgKHAgPiAwLjMgJiYgcCA8IDEuNykge1xyXG4gICAgICAgICAgeHkgPSAneHknO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoeCA+IHkpIHtcclxuICAgICAgICAgIC8vIHggYXhpc1xyXG4gICAgICAgICAgeHkgPSAneCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHkgYXhpc1xyXG4gICAgICAgICAgeHkgPSAneSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgZGlmZiwgY2VudGVyLCB4eSk7XHJcblxyXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3ZlcmFsbCBzY2FsZVxyXG4gICAgICAgIGN1cnJlbnRQaW5jaFNjYWxpbmcgPSBlLnNjYWxlO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgbWMub24oJ3BpbmNoc3RhcnQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IDE7IC8vIHJlc2V0IHRyYWNrZXJcclxuICAgICAgfSk7XHJcbiAgICAgIG1jLm9uKCdwaW5jaCcsIGhhbmRsZVBpbmNoKTtcclxuICAgICAgbWMub24oJ3BpbmNoZW5kJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGhhbmRsZVBpbmNoKGUpO1xyXG4gICAgICAgIGN1cnJlbnRQaW5jaFNjYWxpbmcgPSBudWxsOyAvLyByZXNldFxyXG4gICAgICAgIHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgY3VycmVudERlbHRhWCA9IG51bGwsIGN1cnJlbnREZWx0YVkgPSBudWxsLCBwYW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbnN0IGhhbmRsZVBhbiA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnREZWx0YVggIT09IG51bGwgJiYgY3VycmVudERlbHRhWSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcGFubmluZyA9IHRydWU7XHJcbiAgICAgICAgICBjb25zdCBkZWx0YVggPSBlLmRlbHRhWCAtIGN1cnJlbnREZWx0YVg7XHJcbiAgICAgICAgICBjb25zdCBkZWx0YVkgPSBlLmRlbHRhWSAtIGN1cnJlbnREZWx0YVk7XHJcbiAgICAgICAgICBjdXJyZW50RGVsdGFYID0gZS5kZWx0YVg7XHJcbiAgICAgICAgICBjdXJyZW50RGVsdGFZID0gZS5kZWx0YVk7XHJcbiAgICAgICAgICBkb1BhbihjaGFydEluc3RhbmNlLCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbWMub24oJ3BhbnN0YXJ0JywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVggPSAwO1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVkgPSAwO1xyXG4gICAgICAgIGhhbmRsZVBhbihlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIG1jLm9uKCdwYW5tb3ZlJywgaGFuZGxlUGFuKTtcclxuICAgICAgbWMub24oJ3BhbmVuZCcsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBjdXJyZW50RGVsdGFYID0gbnVsbDtcclxuICAgICAgICBjdXJyZW50RGVsdGFZID0gbnVsbDtcclxuICAgICAgICB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBwYW5uaW5nID0gZmFsc2U7IH0sIDUwMCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9naG9zdENsaWNrSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBpZiAocGFubmluZykge1xyXG4gICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFydEluc3RhbmNlLnpvb20uX2dob3N0Q2xpY2tIYW5kbGVyKTtcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2UuX21jID0gbWM7XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgYmVmb3JlRGF0YXNldHNEcmF3OiBmdW5jdGlvbihjaGFydEluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBjdHggPSBjaGFydEluc3RhbmNlLmNoYXJ0LmN0eDtcclxuICAgIGNvbnN0IGNoYXJ0QXJlYSA9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhO1xyXG4gICAgY3R4LnNhdmUoKTtcclxuICAgIGN0eC5iZWdpblBhdGgoKTtcclxuXHJcbiAgICBpZiAoY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZCkge1xyXG4gICAgICBjb25zdCB5QXhpcyA9IGdldFlBeGlzKGNoYXJ0SW5zdGFuY2UpO1xyXG4gICAgICBjb25zdCBiZWdpblBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0O1xyXG4gICAgICBjb25zdCBlbmRQb2ludCA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21FbmQ7XHJcbiAgICAgIGNvbnN0IG9mZnNldFggPSBiZWdpblBvaW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1pbihiZWdpblBvaW50LmNsaWVudFgsIGVuZFBvaW50LmNsaWVudFgpIC0gb2Zmc2V0WDtcclxuICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWF4KGJlZ2luUG9pbnQuY2xpZW50WCwgZW5kUG9pbnQuY2xpZW50WCkgLSBvZmZzZXRYO1xyXG4gICAgICBjb25zdCByZWN0V2lkdGggPSBlbmRYIC0gc3RhcnRYO1xyXG5cclxuXHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyMjUsMjI1LDIyNSwwLjUpJztcclxuICAgICAgY3R4LmxpbmVXaWR0aCA9IDU7XHJcbiAgICAgIGN0eC5maWxsUmVjdChzdGFydFgsIHlBeGlzLnRvcCwgcmVjdFdpZHRoLCB5QXhpcy5ib3R0b20gLSB5QXhpcy50b3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGN0eC5yZWN0KGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEudG9wLCBjaGFydEFyZWEucmlnaHQgLSBjaGFydEFyZWEubGVmdCwgY2hhcnRBcmVhLmJvdHRvbSAtIGNoYXJ0QXJlYS50b3ApO1xyXG4gICAgY3R4LmNsaXAoKTtcclxuICB9LFxyXG5cclxuICBhZnRlckRhdGFzZXRzRHJhdzogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgY2hhcnRJbnN0YW5jZS5jaGFydC5jdHgucmVzdG9yZSgpO1xyXG4gIH0sXHJcblxyXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGlmIChjaGFydEluc3RhbmNlLnpvb20pIHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGNoYXJ0SW5zdGFuY2Uub3B0aW9ucztcclxuICAgICAgY29uc3Qgbm9kZSA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5ub2RlO1xyXG5cclxuICAgICAgaWYgKG9wdGlvbnMuem9vbSAmJiBvcHRpb25zLnpvb20uZHJhZykge1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZURvd25IYW5kbGVyKTtcclxuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlcik7XHJcbiAgICAgICAgLy8gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgY2hhcnRJbnN0YW5jZS56b29tLl93aGVlbEhhbmRsZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoSGFtbWVyKSB7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZ2hvc3RDbGlja0hhbmRsZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkZWxldGUgY2hhcnRJbnN0YW5jZS56b29tO1xyXG5cclxuICAgICAgY29uc3QgbWMgPSBjaGFydEluc3RhbmNlLl9tYztcclxuICAgICAgaWYgKG1jKSB7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwaW5jaHN0YXJ0Jyk7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwaW5jaCcpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGluY2hlbmQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BhbnN0YXJ0Jyk7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwYW4nKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BhbmVuZCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuQ2hhcnQucGx1Z2luU2VydmljZS5yZWdpc3Rlcih6b29tUGx1Z2luKTtcclxuIl19
|