From 29aba88a0017abaf926140156fff4ffb42a6bd3c Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 14 Apr 2020 12:55:49 -0700 Subject: [PATCH 01/80] [Reporting] Improve functional test steps (#63259) * Start of refactoring * remove unused fixtuers * fix the refactoring bugs * update archive with better dashboard * important comment Co-authored-by: Elastic Machine --- .../reporting/ecommerce_kibana/data.json.gz | Bin 2039 -> 4138 bytes .../reporting/ecommerce_kibana/mappings.json | 1704 ++++++++++++++++- .../reporting/historic/data.json.gz | Bin 2269 -> 0 bytes .../reporting/historic/mappings.json | 386 ---- .../functional/page_objects/reporting_page.js | 30 +- x-pack/test/reporting/.gitignore | 1 + .../reporting/configs/chromium_functional.js | 1 + x-pack/test/reporting/functional/reporting.js | 139 +- .../baseline/dashboard_preserve_layout.pdf | Bin 301135 -> 0 bytes .../baseline/dashboard_preserve_layout.png | Bin 349976 -> 631719 bytes .../reports/baseline/dashboard_print.pdf | Bin 359189 -> 0 bytes .../reports/baseline/visualize_print.pdf | Bin 124146 -> 0 bytes 12 files changed, 1733 insertions(+), 528 deletions(-) delete mode 100644 x-pack/test/functional/es_archives/reporting/historic/data.json.gz delete mode 100644 x-pack/test/functional/es_archives/reporting/historic/mappings.json create mode 100644 x-pack/test/reporting/.gitignore delete mode 100644 x-pack/test/reporting/functional/reports/baseline/dashboard_preserve_layout.pdf delete mode 100644 x-pack/test/reporting/functional/reports/baseline/dashboard_print.pdf delete mode 100644 x-pack/test/reporting/functional/reports/baseline/visualize_print.pdf diff --git a/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/data.json.gz b/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/data.json.gz index 2b204d0bde2716e4813714d2a923ec611a0c2c2e..454d260a518cd39001004d026afd8dc00c5e01d6 100644 GIT binary patch literal 4138 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 literal 2039 zcmVQOZ*BnXTU&FRMihScuV8peXAA*dkf2W;w`tSX zPA68=PGS$Uf<@YzTbISLn(=?{S#DwxvXPWp#?uFl(AnE}?uXUxmlH{n*(%1eCCP5& z$fulei~N*RzQ7OoNnG9WV#F7)aDLVsB3`T!Q44TjcWVCe(ZFb}cxb%Z`3I6uZ)d)Q7BOn*YjCC1@J z#7H(Jqbc4HUCBweKu{OYKvT`(-~jPtGEid3Fqno`C(Z9HJz)(|L>|Gu%Y`a``f??Q zD8N^;btT)xy^>F_G9EHQ0tql&WHg*)sRYQMijLPnb$Ij!ng-8_LrDxmgP$Jq6U<2% zQD=$fKA(>30BC5jpm+hPQ=n3e+&44|zK@&_TwqB#%l)Z{kTca4WZw5EI1?wLSi~8o z!5q_!whNq+*uYbgI|It>Lqt?3ilQqUc9q>%0-Gc3q~yHEF?8%egjhs$)eR`acTB{o z?~QXuah5>U8@&1)(T+Y|b^gy~TQnuasX?H{QkbdV@i3Z=%|cV z-uBnWBfK?{CM*gtwdaJgrOoq<2)d#OkaOyj=wb_AkI;nKIekBi-yiX=7Qc!41sH#u zA~yY??3DU`-;`BCeo4Aot6{6E78nW@`W%_v0=R3L_$Im^N z3OlOln10}*l^uEZXN+%p1=c28Uq}SFB!nu9Hypujae#>b{H40U5s6iYu+7O-BO_!vS(n>?1&7>LG{! zQP8n|I%0aSgYAD}7e(Jp>3|mU`Tp;=Pn2zPn0+W`V;Z@s!xFVK+9O(e9c=$CT@-!O z(yP`vO0XSM(%fX-R%I=b@7bOoq2ok*5qBCA)<^J%?!i92OT3)T*cK&hbq)uX;{T^L zi=k(h4=TJaNwTGF6yyl{Ry#~t*Bp+cRyU{t-F!1j|rrgkh6!4 zLU0>yKjJp`91!t%HT zxV_ZxW2^_{K2DN8LeJjM`dE}6=95oU_7^72_<7_WSx0Hly~Ca1?N5Tq@q!Efo$?)? z+$DPeyYnHsW9CDCTK8F^yp|g`65jAbvloDypPOB8aEslTpEYAA3IhK2y?J0eAPbuP zE%X7?1ir+Rxy?hn@;&k1PH;*iRs1B!x9J$ZMZyB1YgLpMXcMO-GYeovv zHBFh0r{;Wax)aBk?{Q`4K>_AV=aL(BmYgKs?8&*<;aGMtE-b7gXWb@1xgaRg+$wBL`AX)Bp=f9pxKDoitkJ!11zLCzB zkX-QViK%Mp&>W4`i78zo4^dK#`uf*m3L#W%)+Aez8u22(gSV-oM^rJ=Rqdc_LM}>{ z^9WJbGMs@i#M)QR71jJA!%r7MYN4Sm7MzL^qY)amIChi)PlPz-;@?n+{TcVjq*e%l zfuAF~AYoP4)R~R>m}(+^7ib;ZuH@{-T!wK$iOW4ZXXLJ^yH>^bXZRjX;b93615P2? zcyol&Tr)hy(2%2y&~&WKClg&6qA7Mqld%Je&3Vpnyv?Io=YhOFgsR(hc|muU-EZUg zs`=^xH6z%-j9AuzCsCX%xr%$B6uJX;pV7sIG>G zRaZL{hsC(Ex+;{}UN{xW*J7003?*^&bEL diff --git a/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/mappings.json b/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/mappings.json index cf647f5c53212..fbcfa4cbe49b3 100644 --- a/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/mappings.json +++ b/x-pack/test/functional/es_archives/reporting/ecommerce_kibana/mappings.json @@ -9,45 +9,62 @@ "mappings": { "_meta": { "migrationMappingPropertyHashes": { - "action": "c0c235fba02ebd2a2412bcda79009b58", + "action": "6e96ac5e648f57523879661ea72525b7", "action_task_params": "a9d49f184ee89641044be0ca2950fa3a", - "alert": "d49f9b8d1277c6004506eec20dc0b108", + "agent_actions": "ed270b46812f0fa1439366c428a2cf17", + "agent_configs": "38abaf89513877745c359e7700c0c66a", + "agent_events": "3231653fafe4ef3196fe3b32ab774bf2", + "agents": "c3eeb7b9d97176f15f6d126370ab23c7", + "alert": "7b44fba6773e37c806ce290ea9b7024e", "apm-indices": "9bb9b2bf1fa636ed8619cbab5ce6a1dd", - "apm-services-telemetry": "07ee1939fa4302c62ddc052ec03fed90", + "apm-telemetry": "3525d7c22c42bc80f5e6e9cb3f2b26a2", + "application_usage_totals": "c897e4310c5f24b07caaff3db53ae2c1", + "application_usage_transactional": "965839e75f809fefe04f92dc4d99722a", "canvas-element": "7390014e1091044523666d97247392fc", "canvas-workpad": "b0a1706d356228dbdcb4a17e6b9eb231", - "config": "87aca8fdb053154f11383fce3dbf3edf", + "cases": "08b8b110dbca273d37e8aef131ecab61", + "cases-comments": "c2061fb929f585df57425102fa928b4b", + "cases-configure": "42711cbb311976c0687853f4c1354572", + "cases-user-actions": "32277330ec6b721abe3b846cfd939a71", + "config": "ae24d22d5986d04124cc6568f771066f", "dashboard": "d00f614b29a80360e1190193fd333bab", + "datasources": "d4bc0c252b2b5683ff21ea32d00acffc", + "enrollment_api_keys": "28b91e20b105b6f928e2012600085d8f", + "epm-package": "0be91c6758421dd5d0f1a58e9e5bc7c3", "file-upload-telemetry": "0ed4d3e1983d1217a30982630897092e", "graph-workspace": "cd7ba1330e6682e9cc00b78850874be1", "index-pattern": "66eccb05066c5a89924f48a9e9736499", "infrastructure-ui-source": "ddc0ecb18383f6b26101a2fadb2dab0c", - "inventory-view": "84b320fd67209906333ffce261128462", + "inventory-view": "9ecce5b58867403613d82fe496470b34", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", "lens": "21c3ea0763beb1ecb0162529706b88c5", "lens-ui-telemetry": "509bfa5978586998e05f9e303c07a327", "map": "23d7aa4a720d4938ccde3983f87bd58d", - "maps-telemetry": "a4229f8b16a6820c6d724b7e0c1f729d", + "maps-telemetry": "268da3a48066123fc5baf35abaa55014", "metrics-explorer-view": "53c5365793677328df0ccb6138bf3cdd", "migrationVersion": "4a1746014a75ade3a714e1db5763276f", "ml-telemetry": "257fd1d4b4fdbb9cb4b8a3b27da201e9", "namespace": "2f4316de49999235636386fe51dc06c1", + "outputs": "aee9782e0d500b867859650a36280165", "query": "11aaeb7f5f7fa5bb43f25e18ce26e7d9", "references": "7997cf5a56cc02bdc9c93361bde732b0", "sample-data-telemetry": "7d3cfeb915303c9641c59681967ffeb4", "search": "181661168bbadd1eff5902361e2a0d5c", "server": "ec97f1c5da1a19609a60874e5af1100c", - "siem-ui-timeline": "6485ab095be8d15246667b98a1a34295", + "siem-detection-engine-rule-actions": "90eee2e4635260f4be0a1da8f5bc0aa0", + "siem-detection-engine-rule-status": "ae783f41c6937db6b7a2ef5c93a9e9b0", + "siem-ui-timeline": "ac8020190f5950dd3250b6499144e7fb", "siem-ui-timeline-note": "8874706eedc49059d4cf0f5094559084", "siem-ui-timeline-pinned-event": "20638091112f0e14f0e443d512301c29", - "space": "c5ca8acafa0beaa4d08d014a97b6bc6b", - "telemetry": "358ffaa88ba34a97d55af0933a117de4", + "telemetry": "36a616f7026dfa617d6655df850fe16d", "timelion-sheet": "9a2a2748877c7a7b582fef201ab1d4cf", + "tsvb-validation-telemetry": "3a37ef6c8700ae6fc97d5c7da00e9215", "type": "2f4316de49999235636386fe51dc06c1", "ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3", "updated_at": "00da57df13e94e9d98437d13ace4bfe0", "upgrade-assistant-reindex-operation": "a53a20fe086b72c9a86da3cc12dad8a6", "upgrade-assistant-telemetry": "56702cec857e0a9dacfb696655b4ff7b", + "uptime-dynamic-settings": "b6289473c8985c79b6c47eebc19a0ca5", "url": "c7f66a0df8b1b52f17c28c4adb111105", "visualization": "52d7a13ad68a150c4525b292d23e12cc" } @@ -64,6 +81,11 @@ "type": "object" }, "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, "type": "text" }, "secrets": { @@ -85,6 +107,145 @@ } } }, + "agent_actions": { + "properties": { + "agent_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "data": { + "type": "flattened" + }, + "sent_at": { + "type": "date" + }, + "type": { + "type": "keyword" + } + } + }, + "agent_configs": { + "properties": { + "datasources": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "id": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "name": { + "type": "text" + }, + "namespace": { + "type": "keyword" + }, + "revision": { + "type": "integer" + }, + "status": { + "type": "keyword" + }, + "updated_by": { + "type": "keyword" + }, + "updated_on": { + "type": "keyword" + } + } + }, + "agent_events": { + "properties": { + "action_id": { + "type": "keyword" + }, + "agent_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "data": { + "type": "text" + }, + "message": { + "type": "text" + }, + "payload": { + "type": "text" + }, + "stream_id": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "type": { + "type": "keyword" + } + } + }, + "agents": { + "properties": { + "access_api_key_id": { + "type": "keyword" + }, + "active": { + "type": "boolean" + }, + "config_id": { + "type": "keyword" + }, + "config_newest_revision": { + "type": "integer" + }, + "config_revision": { + "type": "integer" + }, + "current_error_events": { + "type": "text" + }, + "default_api_key": { + "type": "keyword" + }, + "enrolled_at": { + "type": "date" + }, + "last_checkin": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "local_metadata": { + "type": "text" + }, + "shared_id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "user_provided_metadata": { + "type": "text" + }, + "version": { + "type": "keyword" + } + } + }, "alert": { "properties": { "actions": { @@ -114,15 +275,18 @@ "apiKeyOwner": { "type": "keyword" }, + "consumer": { + "type": "keyword" + }, + "createdAt": { + "type": "date" + }, "createdBy": { "type": "keyword" }, "enabled": { "type": "boolean" }, - "interval": { - "type": "keyword" - }, "muteAll": { "type": "boolean" }, @@ -130,12 +294,24 @@ "type": "keyword" }, "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, "type": "text" }, "params": { "enabled": false, "type": "object" }, + "schedule": { + "properties": { + "interval": { + "type": "keyword" + } + } + }, "scheduledTaskId": { "type": "keyword" }, @@ -221,52 +397,947 @@ }, "apm-telemetry": { "properties": { - "has_any_services": { - "type": "boolean" - }, - "services_per_agent": { + "agents": { "properties": { "dotnet": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } }, "go": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } }, "java": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } }, "js-base": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } }, "nodejs": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } }, "python": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } }, "ruby": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } }, "rum-js": { - "null_value": 0, - "type": "long" + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } } } - } - } - }, - "canvas-element": { - "dynamic": "false", - "properties": { - "@created": { - "type": "date" + }, + "cardinality": { + "properties": { + "transaction": { + "properties": { + "name": { + "properties": { + "all_agents": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "rum": { + "properties": { + "1d": { + "type": "long" + } + } + } + } + } + } + }, + "user_agent": { + "properties": { + "original": { + "properties": { + "all_agents": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "rum": { + "properties": { + "1d": { + "type": "long" + } + } + } + } + } + } + } + } + }, + "counts": { + "properties": { + "agent_configuration": { + "properties": { + "all": { + "type": "long" + } + } + }, + "error": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "max_error_groups_per_service": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "max_transaction_groups_per_service": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "metric": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "onboarding": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "services": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "sourcemap": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "span": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "traces": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "transaction": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + } + } + }, + "has_any_services": { + "type": "boolean" + }, + "indices": { + "properties": { + "all": { + "properties": { + "total": { + "properties": { + "docs": { + "properties": { + "count": { + "type": "long" + } + } + }, + "store": { + "properties": { + "size_in_bytes": { + "type": "long" + } + } + } + } + } + } + }, + "shards": { + "properties": { + "total": { + "type": "long" + } + } + } + } + }, + "integrations": { + "properties": { + "ml": { + "properties": { + "all_jobs_count": { + "type": "long" + } + } + } + } + }, + "retainment": { + "properties": { + "error": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "metric": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "onboarding": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "span": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "transaction": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "services_per_agent": { + "properties": { + "dotnet": { + "null_value": 0, + "type": "long" + }, + "go": { + "null_value": 0, + "type": "long" + }, + "java": { + "null_value": 0, + "type": "long" + }, + "js-base": { + "null_value": 0, + "type": "long" + }, + "nodejs": { + "null_value": 0, + "type": "long" + }, + "python": { + "null_value": 0, + "type": "long" + }, + "ruby": { + "null_value": 0, + "type": "long" + }, + "rum-js": { + "null_value": 0, + "type": "long" + } + } + }, + "tasks": { + "properties": { + "agent_configuration": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "agents": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "cardinality": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "groupings": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "indices_stats": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "integrations": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "processor_events": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "services": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "versions": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + } + } + }, + "version": { + "properties": { + "apm_server": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + }, + "patch": { + "type": "long" + } + } + } + } + } + } + }, + "application_usage_totals": { + "properties": { + "appId": { + "type": "keyword" + }, + "minutesOnScreen": { + "type": "float" + }, + "numberOfClicks": { + "type": "long" + } + } + }, + "application_usage_transactional": { + "properties": { + "appId": { + "type": "keyword" + }, + "minutesOnScreen": { + "type": "float" + }, + "numberOfClicks": { + "type": "long" + }, + "timestamp": { + "type": "date" + } + } + }, + "canvas-element": { + "dynamic": "false", + "properties": { + "@created": { + "type": "date" }, "@timestamp": { "type": "date" @@ -285,26 +1356,257 @@ "keyword": { "type": "keyword" } - }, - "type": "text" + }, + "type": "text" + } + } + }, + "canvas-workpad": { + "dynamic": "false", + "properties": { + "@created": { + "type": "date" + }, + "@timestamp": { + "type": "date" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "cases": { + "properties": { + "closed_at": { + "type": "date" + }, + "closed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "description": { + "type": "text" + }, + "external_service": { + "properties": { + "connector_id": { + "type": "keyword" + }, + "connector_name": { + "type": "keyword" + }, + "external_id": { + "type": "keyword" + }, + "external_title": { + "type": "text" + }, + "external_url": { + "type": "text" + }, + "pushed_at": { + "type": "date" + }, + "pushed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "status": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-comments": { + "properties": { + "comment": { + "type": "text" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "pushed_at": { + "type": "date" + }, + "pushed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-configure": { + "properties": { + "closure_type": { + "type": "keyword" + }, + "connector_id": { + "type": "keyword" + }, + "connector_name": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } } } }, - "canvas-workpad": { - "dynamic": "false", + "cases-user-actions": { "properties": { - "@created": { - "type": "date" + "action": { + "type": "keyword" }, - "@timestamp": { + "action_at": { "type": "date" }, - "name": { - "fields": { - "keyword": { + "action_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { "type": "keyword" } - }, + } + }, + "action_field": { + "type": "keyword" + }, + "new_value": { + "type": "text" + }, + "old_value": { "type": "text" } } @@ -389,6 +1691,136 @@ } } }, + "datasources": { + "properties": { + "config_id": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "enabled": { + "type": "boolean" + }, + "inputs": { + "properties": { + "config": { + "type": "flattened" + }, + "enabled": { + "type": "boolean" + }, + "processors": { + "type": "keyword" + }, + "streams": { + "properties": { + "config": { + "type": "flattened" + }, + "dataset": { + "type": "keyword" + }, + "enabled": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "processors": { + "type": "keyword" + } + }, + "type": "nested" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "name": { + "type": "keyword" + }, + "namespace": { + "type": "keyword" + }, + "output_id": { + "type": "keyword" + }, + "package": { + "properties": { + "name": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "revision": { + "type": "integer" + } + } + }, + "enrollment_api_keys": { + "properties": { + "active": { + "type": "boolean" + }, + "api_key": { + "type": "binary" + }, + "api_key_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "expire_at": { + "type": "date" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + } + } + }, + "epm-package": { + "properties": { + "installed": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "internal": { + "type": "boolean" + }, + "name": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, "file-upload-telemetry": { "properties": { "filesUploadedTotalCount": { @@ -538,6 +1970,26 @@ } } }, + "customMetrics": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "label": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, "customOptions": { "properties": { "field": { @@ -572,6 +2024,18 @@ }, "metric": { "properties": { + "aggregation": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "label": { + "type": "keyword" + }, "type": { "type": "keyword" } @@ -699,9 +2163,19 @@ } } }, + "indexPatternsWithGeoFieldCount": { + "type": "long" + }, "mapsTotalCount": { "type": "long" }, + "settings": { + "properties": { + "showMapVisualizationTypes": { + "type": "boolean" + } + } + }, "timeCaptured": { "type": "date" } @@ -803,7 +2277,7 @@ }, "type": "text" }, - "space": { + "visualization": { "fields": { "keyword": { "ignore_above": 256, @@ -828,6 +2302,37 @@ "namespace": { "type": "keyword" }, + "outputs": { + "properties": { + "api_key": { + "type": "keyword" + }, + "ca_sha256": { + "type": "keyword" + }, + "config": { + "type": "flattened" + }, + "fleet_enroll_password": { + "type": "binary" + }, + "fleet_enroll_username": { + "type": "binary" + }, + "hosts": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, "query": { "properties": { "description": { @@ -917,6 +2422,73 @@ } } }, + "siem-detection-engine-rule-actions": { + "properties": { + "actions": { + "properties": { + "action_type_id": { + "type": "keyword" + }, + "group": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "params": { + "dynamic": "true", + "type": "object" + } + } + }, + "alertThrottle": { + "type": "keyword" + }, + "ruleAlertId": { + "type": "keyword" + }, + "ruleThrottle": { + "type": "keyword" + } + } + }, + "siem-detection-engine-rule-status": { + "properties": { + "alertId": { + "type": "keyword" + }, + "bulkCreateTimeDurations": { + "type": "float" + }, + "gap": { + "type": "text" + }, + "lastFailureAt": { + "type": "date" + }, + "lastFailureMessage": { + "type": "text" + }, + "lastLookBackDate": { + "type": "date" + }, + "lastSuccessAt": { + "type": "date" + }, + "lastSuccessMessage": { + "type": "text" + }, + "searchAfterTimeDurations": { + "type": "float" + }, + "status": { + "type": "keyword" + }, + "statusDate": { + "type": "date" + } + } + }, "siem-ui-timeline": { "properties": { "columns": { @@ -1051,6 +2623,9 @@ "description": { "type": "text" }, + "eventType": { + "type": "keyword" + }, "favorite": { "properties": { "favoriteDate": { @@ -1255,6 +2830,9 @@ }, "telemetry": { "properties": { + "allowChangingOptInStatus": { + "type": "boolean" + }, "enabled": { "type": "boolean" }, @@ -1262,11 +2840,15 @@ "type": "date" }, "lastVersionChecked": { - "ignore_above": 256, + "type": "keyword" + }, + "reportFailureCount": { + "type": "integer" + }, + "reportFailureVersion": { "type": "keyword" }, "sendUsageFrom": { - "ignore_above": 256, "type": "keyword" }, "userHasSeenNotice": { @@ -1315,6 +2897,13 @@ } } }, + "tsvb-validation-telemetry": { + "properties": { + "failedRequests": { + "type": "long" + } + } + }, "type": { "type": "keyword" }, @@ -1391,6 +2980,13 @@ } } }, + "uptime-dynamic-settings": { + "properties": { + "heartbeatIndices": { + "type": "keyword" + } + } + }, "url": { "properties": { "accessCount": { diff --git a/x-pack/test/functional/es_archives/reporting/historic/data.json.gz b/x-pack/test/functional/es_archives/reporting/historic/data.json.gz deleted file mode 100644 index ecb85ec6faca43ba103d37e3173f383a6fa73b37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2269 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 diff --git a/x-pack/test/functional/es_archives/reporting/historic/mappings.json b/x-pack/test/functional/es_archives/reporting/historic/mappings.json deleted file mode 100644 index 3a5af0158ce00..0000000000000 --- a/x-pack/test/functional/es_archives/reporting/historic/mappings.json +++ /dev/null @@ -1,386 +0,0 @@ -{ - "type": "index", - "value": { - "index": ".kibana", - "mappings": { - "properties": { - "config": { - "dynamic": "true", - "properties": { - "buildNum": { - "type": "keyword" - }, - "defaultIndex": { - "fields": { - "keyword": { - "ignore_above": 256, - "type": "keyword" - } - }, - "type": "text" - }, - "xPackMonitoring:showBanner": { - "type": "boolean" - } - } - }, - "dashboard": { - "dynamic": "strict", - "properties": { - "description": { - "type": "text" - }, - "hits": { - "type": "integer" - }, - "kibanaSavedObjectMeta": { - "properties": { - "searchSourceJSON": { - "type": "text" - } - } - }, - "optionsJSON": { - "type": "text" - }, - "panelsJSON": { - "type": "text" - }, - "refreshInterval": { - "properties": { - "display": { - "type": "keyword" - }, - "pause": { - "type": "boolean" - }, - "section": { - "type": "integer" - }, - "value": { - "type": "integer" - } - } - }, - "timeFrom": { - "type": "keyword" - }, - "timeRestore": { - "type": "boolean" - }, - "timeTo": { - "type": "keyword" - }, - "title": { - "type": "text" - }, - "uiStateJSON": { - "type": "text" - }, - "version": { - "type": "integer" - } - } - }, - "graph-workspace": { - "dynamic": "strict", - "properties": { - "description": { - "type": "text" - }, - "kibanaSavedObjectMeta": { - "properties": { - "searchSourceJSON": { - "type": "text" - } - } - }, - "numLinks": { - "type": "integer" - }, - "numVertices": { - "type": "integer" - }, - "title": { - "type": "text" - }, - "version": { - "type": "integer" - }, - "wsState": { - "type": "text" - } - } - }, - "index-pattern": { - "dynamic": "strict", - "properties": { - "fieldFormatMap": { - "type": "text" - }, - "fields": { - "type": "text" - }, - "intervalName": { - "type": "keyword" - }, - "notExpandable": { - "type": "boolean" - }, - "sourceFilters": { - "type": "text" - }, - "timeFieldName": { - "type": "keyword" - }, - "title": { - "type": "text" - } - } - }, - "search": { - "dynamic": "strict", - "properties": { - "columns": { - "type": "keyword" - }, - "description": { - "type": "text" - }, - "hits": { - "type": "integer" - }, - "kibanaSavedObjectMeta": { - "properties": { - "searchSourceJSON": { - "type": "text" - } - } - }, - "sort": { - "type": "keyword" - }, - "title": { - "type": "text" - }, - "version": { - "type": "integer" - } - } - }, - "server": { - "dynamic": "strict", - "properties": { - "uuid": { - "type": "keyword" - } - } - }, - "space": { - "properties": { - "_reserved": { - "type": "boolean" - }, - "color": { - "type": "keyword" - }, - "description": { - "type": "text" - }, - "initials": { - "type": "keyword" - }, - "name": { - "fields": { - "keyword": { - "ignore_above": 2048, - "type": "keyword" - } - }, - "type": "text" - } - } - }, - "spaceId": { - "type": "keyword" - }, - "timelion-sheet": { - "dynamic": "strict", - "properties": { - "description": { - "type": "text" - }, - "hits": { - "type": "integer" - }, - "kibanaSavedObjectMeta": { - "properties": { - "searchSourceJSON": { - "type": "text" - } - } - }, - "timelion_chart_height": { - "type": "integer" - }, - "timelion_columns": { - "type": "integer" - }, - "timelion_interval": { - "type": "keyword" - }, - "timelion_other_interval": { - "type": "keyword" - }, - "timelion_rows": { - "type": "integer" - }, - "timelion_sheet": { - "type": "text" - }, - "title": { - "type": "text" - }, - "version": { - "type": "integer" - } - } - }, - "type": { - "type": "keyword" - }, - "updated_at": { - "type": "date" - }, - "url": { - "dynamic": "strict", - "properties": { - "accessCount": { - "type": "long" - }, - "accessDate": { - "type": "date" - }, - "createDate": { - "type": "date" - }, - "url": { - "fields": { - "keyword": { - "ignore_above": 2048, - "type": "keyword" - } - }, - "type": "text" - } - } - }, - "visualization": { - "dynamic": "strict", - "properties": { - "description": { - "type": "text" - }, - "kibanaSavedObjectMeta": { - "properties": { - "searchSourceJSON": { - "type": "text" - } - } - }, - "savedSearchId": { - "type": "keyword" - }, - "title": { - "type": "text" - }, - "uiStateJSON": { - "type": "text" - }, - "version": { - "type": "integer" - }, - "visState": { - "type": "text" - } - } - } - } - }, - "settings": { - "index": { - "number_of_replicas": "1", - "number_of_shards": "1" - } - } - } -} - -{ - "type": "index", - "value": { - "index": ".reporting-2018.03.11", - "mappings": { - "properties": { - "attempts": { - "type": "short" - }, - "completed_at": { - "type": "date" - }, - "created_at": { - "type": "date" - }, - "created_by": { - "type": "keyword" - }, - "jobtype": { - "type": "keyword" - }, - "max_attempts": { - "type": "short" - }, - "output": { - "properties": { - "content": { - "enabled": false, - "type": "object" - }, - "content_type": { - "type": "keyword" - }, - "max_size_reached": { - "type": "boolean" - } - } - }, - "payload": { - "enabled": false, - "type": "object" - }, - "priority": { - "type": "byte" - }, - "process_expiration": { - "type": "date" - }, - "started_at": { - "type": "date" - }, - "status": { - "type": "keyword" - }, - "timeout": { - "type": "long" - } - } - }, - "settings": { - "index": { - "auto_expand_replicas": "0-1", - "number_of_replicas": "0", - "number_of_shards": "1" - } - } - } -} \ No newline at end of file diff --git a/x-pack/test/functional/page_objects/reporting_page.js b/x-pack/test/functional/page_objects/reporting_page.js index 7cdd1c083239b..cdfafeec1bf46 100644 --- a/x-pack/test/functional/page_objects/reporting_page.js +++ b/x-pack/test/functional/page_objects/reporting_page.js @@ -19,24 +19,10 @@ export function ReportingPageProvider({ getService, getPageObjects }) { const log = getService('log'); const config = getService('config'); const testSubjects = getService('testSubjects'); - const esArchiver = getService('esArchiver'); const browser = getService('browser'); - const kibanaServer = getService('kibanaServer'); - const PageObjects = getPageObjects(['common', 'security', 'settings', 'share', 'timePicker']); + const PageObjects = getPageObjects(['common', 'security', 'share', 'timePicker']); class ReportingPage { - async initTests() { - log.debug('ReportingPage:initTests'); - await PageObjects.settings.navigateTo(); - await esArchiver.loadIfNeeded('../../functional/es_archives/logstash_functional'); - await esArchiver.load('reporting/historic'); - await kibanaServer.uiSettings.replace({ - defaultIndex: 'logstash-*', - }); - - await browser.setWindowSize(1600, 850); - } - async forceSharedItemsContainerSize({ width }) { await browser.execute(` var el = document.querySelector('[data-shared-items-container]'); @@ -130,6 +116,20 @@ export function ReportingPageProvider({ getService, getPageObjects }) { return await retry.try(async () => await testSubjects.find('generateReportButton')); } + async isGenerateReportButtonDisabled() { + const generateReportButton = await this.getGenerateReportButton(); + return await retry.try(async () => { + const isDisabled = await generateReportButton.getAttribute('disabled'); + return isDisabled; + }); + } + + async canReportBeCreated() { + await this.clickGenerateReportButton(); + const success = await this.checkForReportingToasts(); + return success; + } + async checkUsePrintLayout() { // The print layout checkbox slides in as part of an animation, and tests can // attempt to click it too quickly, leading to flaky tests. The 500ms wait allows diff --git a/x-pack/test/reporting/.gitignore b/x-pack/test/reporting/.gitignore new file mode 100644 index 0000000000000..99ee4c44686a0 --- /dev/null +++ b/x-pack/test/reporting/.gitignore @@ -0,0 +1 @@ +functional/reports/session/ diff --git a/x-pack/test/reporting/configs/chromium_functional.js b/x-pack/test/reporting/configs/chromium_functional.js index 05c3b6c142946..753d2b2a20ab9 100644 --- a/x-pack/test/reporting/configs/chromium_functional.js +++ b/x-pack/test/reporting/configs/chromium_functional.js @@ -5,6 +5,7 @@ */ export default async function({ readConfigFile }) { + // TODO move reporting tests to x-pack/test/functional/apps//reporting const functionalConfig = await readConfigFile(require.resolve('../../functional/config.js')); return { diff --git a/x-pack/test/reporting/functional/reporting.js b/x-pack/test/reporting/functional/reporting.js index 012f0922c28cf..6107363986a40 100644 --- a/x-pack/test/reporting/functional/reporting.js +++ b/x-pack/test/reporting/functional/reporting.js @@ -15,8 +15,14 @@ const mkdirAsync = promisify(fs.mkdir); const REPORTS_FOLDER = path.resolve(__dirname, 'reports'); +/* + * TODO Remove this file and spread the tests to various apps + */ + export default function({ getService, getPageObjects }) { - const retry = getService('retry'); + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const log = getService('log'); const config = getService('config'); const PageObjects = getPageObjects([ 'reporting', @@ -27,65 +33,32 @@ export default function({ getService, getPageObjects }) { 'visualize', 'visEditor', ]); - const log = getService('log'); describe('Reporting', () => { - before('initialize tests', async () => { - await PageObjects.reporting.initTests(); - }); - - const expectDisabledGenerateReportButton = async () => { - const generateReportButton = await PageObjects.reporting.getGenerateReportButton(); - await retry.try(async () => { - const isDisabled = await generateReportButton.getAttribute('disabled'); - expect(isDisabled).to.be('true'); + describe('Dashboard', () => { + before('initialize tests', async () => { + log.debug('ReportingPage:initTests'); + await esArchiver.loadIfNeeded('reporting/ecommerce'); + await esArchiver.loadIfNeeded('reporting/ecommerce_kibana'); + await browser.setWindowSize(1600, 850); }); - }; - - const expectEnabledGenerateReportButton = async () => { - const generateReportButton = await PageObjects.reporting.getGenerateReportButton(); - await retry.try(async () => { - const isDisabled = await generateReportButton.getAttribute('disabled'); - expect(isDisabled).to.be(null); + after('clean up archives', async () => { + await esArchiver.unload('reporting/ecommerce'); + await esArchiver.unload('reporting/ecommerce_kibana'); }); - }; - - const expectReportCanBeCreated = async () => { - await PageObjects.reporting.clickGenerateReportButton(); - const success = await PageObjects.reporting.checkForReportingToasts(); - expect(success).to.be(true); - }; - - const writeSessionReport = async (name, rawPdf, reportExt = 'pdf') => { - const sessionDirectory = path.resolve(REPORTS_FOLDER, 'session'); - await mkdirAsync(sessionDirectory, { recursive: true }); - const sessionReportPath = path.resolve(sessionDirectory, `${name}.${reportExt}`); - await writeFileAsync(sessionReportPath, rawPdf); - return sessionReportPath; - }; - - const getBaselineReportPath = (fileName, reportExt = 'pdf') => { - const baselineFolder = path.resolve(REPORTS_FOLDER, 'baseline'); - const fullPath = path.resolve(baselineFolder, `${fileName}.${reportExt}`); - log.debug(`getBaselineReportPath (${fullPath})`); - return fullPath; - }; - - describe('Dashboard', () => { - beforeEach(() => PageObjects.reporting.clearToastNotifications()); describe('Print PDF button', () => { it('is not available if new', async () => { await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.clickNewDashboard(); await PageObjects.reporting.openPdfReportingPanel(); - await expectDisabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); }); it('becomes available when saved', async () => { await PageObjects.dashboard.saveDashboard('My PDF Dashboard'); await PageObjects.reporting.openPdfReportingPanel(); - await expectEnabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); }); }); @@ -95,15 +68,7 @@ export default function({ getService, getPageObjects }) { // function is taking about 15 seconds per comparison in jenkins. this.timeout(300000); await PageObjects.common.navigateToApp('dashboard'); - await PageObjects.dashboard.gotoDashboardEditMode('My PDF Dashboard'); - await PageObjects.reporting.setTimepickerInDataRange(); - const visualizations = PageObjects.dashboard.getTestVisualizationNames(); - - const tileMapIndex = visualizations.indexOf('Visualization TileMap'); - visualizations.splice(tileMapIndex, 1); - - await PageObjects.dashboard.addVisualizations(visualizations); - await PageObjects.dashboard.saveDashboard('report test'); + await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); await PageObjects.reporting.openPdfReportingPanel(); await PageObjects.reporting.checkUsePrintLayout(); await PageObjects.reporting.clickGenerateReportButton(); @@ -121,30 +86,36 @@ export default function({ getService, getPageObjects }) { await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.clickNewDashboard(); await PageObjects.reporting.openPngReportingPanel(); - await expectDisabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); }); it('becomes available when saved', async () => { await PageObjects.dashboard.saveDashboard('My PNG Dash'); await PageObjects.reporting.openPngReportingPanel(); - await expectEnabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); }); }); describe('Preserve Layout', () => { it('matches baseline report', async function() { + const writeSessionReport = async (name, rawPdf, reportExt) => { + const sessionDirectory = path.resolve(REPORTS_FOLDER, 'session'); + await mkdirAsync(sessionDirectory, { recursive: true }); + const sessionReportPath = path.resolve(sessionDirectory, `${name}.${reportExt}`); + await writeFileAsync(sessionReportPath, rawPdf); + return sessionReportPath; + }; + const getBaselineReportPath = (fileName, reportExt) => { + const baselineFolder = path.resolve(REPORTS_FOLDER, 'baseline'); + const fullPath = path.resolve(baselineFolder, `${fileName}.${reportExt}`); + log.debug(`getBaselineReportPath (${fullPath})`); + return fullPath; + }; + this.timeout(300000); await PageObjects.common.navigateToApp('dashboard'); - await PageObjects.dashboard.gotoDashboardEditMode('My PNG Dash'); - await PageObjects.reporting.setTimepickerInDataRange(); - - const visualizations = PageObjects.dashboard.getTestVisualizationNames(); - const tileMapIndex = visualizations.indexOf('Visualization TileMap'); - visualizations.splice(tileMapIndex, 1); - - await PageObjects.dashboard.addVisualizations(visualizations); - await PageObjects.dashboard.saveDashboard('PNG report test'); + await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); await PageObjects.reporting.openPngReportingPanel(); await PageObjects.reporting.forceSharedItemsContainerSize({ width: 1405 }); await PageObjects.reporting.clickGenerateReportButton(); @@ -167,44 +138,64 @@ export default function({ getService, getPageObjects }) { }); describe('Discover', () => { + before('initialize tests', async () => { + log.debug('ReportingPage:initTests'); + await esArchiver.loadIfNeeded('reporting/ecommerce'); + await browser.setWindowSize(1600, 850); + }); + after('clean up archives', async () => { + await esArchiver.unload('reporting/ecommerce'); + }); + describe('Generate CSV button', () => { beforeEach(() => PageObjects.common.navigateToApp('discover')); it('is not available if new', async () => { await PageObjects.reporting.openCsvReportingPanel(); - await expectDisabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); }); it('becomes available when saved', async () => { await PageObjects.discover.saveSearch('my search - expectEnabledGenerateReportButton'); await PageObjects.reporting.openCsvReportingPanel(); - await expectEnabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); }); it('generates a report with data', async () => { await PageObjects.reporting.setTimepickerInDataRange(); await PageObjects.discover.saveSearch('my search - with data - expectReportCanBeCreated'); await PageObjects.reporting.openCsvReportingPanel(); - await expectReportCanBeCreated(); + expect(await PageObjects.reporting.canReportBeCreated()).to.be(true); }); it('generates a report with no data', async () => { await PageObjects.reporting.setTimepickerInNoDataRange(); await PageObjects.discover.saveSearch('my search - no data - expectReportCanBeCreated'); await PageObjects.reporting.openCsvReportingPanel(); - await expectReportCanBeCreated(); + expect(await PageObjects.reporting.canReportBeCreated()).to.be(true); }); }); }); describe('Visualize', () => { + before('initialize tests', async () => { + log.debug('ReportingPage:initTests'); + await esArchiver.loadIfNeeded('reporting/ecommerce'); + await esArchiver.loadIfNeeded('reporting/ecommerce_kibana'); + await browser.setWindowSize(1600, 850); + }); + after('clean up archives', async () => { + await esArchiver.unload('reporting/ecommerce'); + await esArchiver.unload('reporting/ecommerce_kibana'); + }); + describe('Print PDF button', () => { it('is not available if new', async () => { await PageObjects.common.navigateToUrl('visualize', 'new'); await PageObjects.visualize.clickAreaChart(); - await PageObjects.visualize.clickNewSearch(); + await PageObjects.visualize.clickNewSearch('ecommerce'); await PageObjects.reporting.openPdfReportingPanel(); - await expectDisabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); }); it('becomes available when saved', async () => { @@ -214,14 +205,16 @@ export default function({ getService, getPageObjects }) { await PageObjects.visEditor.clickGo(); await PageObjects.visualize.saveVisualization('my viz'); await PageObjects.reporting.openPdfReportingPanel(); - await expectEnabledGenerateReportButton(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); }); - it('matches baseline report', async function() { + it('downloaded PDF has OK status', async function() { // Generating and then comparing reports can take longer than the default 60s timeout because the comparePngs // function is taking about 15 seconds per comparison in jenkins. this.timeout(180000); + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); await PageObjects.reporting.openPdfReportingPanel(); await PageObjects.reporting.clickGenerateReportButton(); diff --git a/x-pack/test/reporting/functional/reports/baseline/dashboard_preserve_layout.pdf b/x-pack/test/reporting/functional/reports/baseline/dashboard_preserve_layout.pdf deleted file mode 100644 index b7370109c687c8488b8e4964f3d7f1f5e8f3fec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301135 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%0D5&n!cH9#og^ob-Y5)k9a(rN;xz|c1H5&;RQCV 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

KM{mT+s1LSB1GI3zkh{o+$uq@ysZ5eKYRc} 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®9`o0N!(ZQO5jo{bv(yyUU2>cy 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 diff --git a/x-pack/test/reporting/functional/reports/baseline/dashboard_preserve_layout.png b/x-pack/test/reporting/functional/reports/baseline/dashboard_preserve_layout.png index a0dfea9ef4fa799e8dbd6e512fe74031f5e6f79f..1eb5f29d212c230c984be34e4aec189dbd2aa751 100644 GIT binary patch literal 631719 zcmeEuXH-*N7baM+A~r;+mH+|*3eu}0VCcOU6#=QC_W(9f6wuJ5_ZA>@LJcAc0@4Yg zcj=vkKth?rE56^%x8~QZHEYd}$y%Y@+Od+(d~YAW*7r|C~qP*6}qA3xHd zpg2vUpg1FZk_sHT|9ox-{GxQ$kbg*lYGa(Eptw!}ee^)fBW`in-A5D4(6|OOFc7_( z=l`pV()?Dj_Jv2%Y7XPl7fvL-diCxkkJe?n+d-FpoOg4r7H9;H~{yEzG3YhwTd4*1BcU}5lj(~rj ze0XH~U&p>4{XBc-zm9oazX+%NuVXZiQh5LC(Adkz_~ZX|O#J+N%zqv7KXJ2@?!S($ zN<&CT{_7a?yZ`gWX(bC&3B9 z=V**(B~2gmQs!&pw*1!LU-Uh|)$w81pUWuJyq+7Te6?sY*%6v4=wE`?es?{T$5#P5 zF4RKgBhz9Lc5SYxcsnz?{JW>H%!>VeBfMJ zDfwum&bsc8AW1reeXGblecc@C{|rXtLY1R9Zt=IIzq1>8QUGC66;Dm;&PJU*aX8LT zd4~uJZ5kA$Nn^XNH0iFR@!<#M!b7w;?uRM)kmx+t0AeFMr^I9&gd?k{7OAza>0g`A z>ET_$C;s=I3}=dpA`mgjnwH%z^GYfg?SBN(YSro#Jm=$JKWpnma)bRVsU(lfx<#P!D2 zMGv(v*t1Cd5@JxO)+&sqLr+NZO!J{i;@ z(!w$|z!`S$I%8Vj;+(GkyYY0PViT2Dc!vC1A;lsyz4jJRXl58Iv`+izon(xAAdF@GBy;N)d_0 zGJnm6Q7c_TMOqkq(64VX=kw!)y#1P-(O)y*!K8e5<&IOpmxiAfOqBZ2^jxQ5+yAaM z%i#)=wzhQfpCRUPEr_P)kxFd(_RBgQb|dc=4sAxd$w2@W8{16_Z?z~^Lj3CQZx)Qr zV_#o)x>@u0F2=%7(>i^t=+~byEAHamca@!)cv<|;q59d4>Ak%OOKMkY`^w}r<>zf1GaW=M-nKL(wj%SD=x&Xk{PJ#~o{3Z%8D4#lL`?QEaHuT81u z4F=!51w9NK<&XcT0AfC{+Q^KJhcAE9x4@#bbJ8*o?OOPk*(JE9rY50%omSLgEUBxj zs|SfSw|3Q6)JAGG<<0chkfrQ``g6CoJdB;1Sgre0D(D5QAyTzL=ZG5wf_A*9YtI^z zi2&bX_GA6V^n)#spbj<6Uao@3c+Ynw`%PL#o7!_6k~A%?%VdrV85j zWr2Zii&oZrtN(U(a&LRa$2>ud9eNsRAPWZ7GBAkI$v4UA%QM7gDBG06a5@+ardRUB zImVuKTCRvMU(yYAF3cuhCAvR;&Nrg7E2=EH}tV(#1L3fdVgbSc_Q4YEsF6zekx+IJ;LIEwmg6(F^9 zGJXb7_hdQVI)38#wSkQE^o9K6XYvM<2{JDI=G=spvL%CRkM}-4K0Uhw_NULBDJ^q! zWl9wH)Ud&!aLM(75eP)eyLS!(wjI(yEiP{jOf_O%?Hwn+pUN{Tl_PI1X}*4UQdYK9 zlQ54R=G*V<%L^K;YOfsL9YBe?FUMWs)knsQx#vK`Zac~w2@#FBNF=0us7*w;i-Jurs=F;-jJCfZ z8C5>vRE70&CKA^9<^oJ4KA4A8=uaR6&oLpQqM{5+UZAF1V?>OUw}vX5gMx>VSestX z>(`}QV+6FT%Iwzd5)%@VwR3b9zSg}Kb-elD#tqklQE%R27#O1EULo1z%1U`^@EUpg zRVq0;dFo3B0@xf~)p)U}Y+5c|E;fterX*4i2xa&rf?Nf$z!yLn$K4>_$;_uUW7O<-%2ys`2a5 zsCkF<*1`j~_?ku{7dVqX#t$cHaJrgO?ptn87ldqkoZD-&!1lX^)^5)05o-5MJUu<3 zh|Q(JO!)vK56Pn^M)DJV6Oyw{mC?&$zB_Lc7VrYqpz8v!oPUt?Ae~G6{Uhx0abkaP!{E0pg*~T#g@Ca#UW_> z{;WAuKO2ucZaFC-IRt)d_32;08Ge1D^1JH?F;uKK3X9b4?wQBlUwv7p@c8lFl7&H{ zN)2IJ*v3`}W(pN`d7@hQOT8Hyz$~<<3>V+#uWIxrV)QSKddc|u`fi7;jrw`_Yy=qE z`X+ec%XLA( zTN;|0SidouZ7NsRxd`1xE4;H=czpblR_%ct-k?V~R(Dn~#Fxr<^$?i7X)*ZfxV+oz zx=4{cWAw;!;iXfjyjGLtZ8zE3*%!d*vlTOqeaBv>$5|s)rO0tlO|7kwRN{Ak+TZQt zn@*~e5m*V8T4Ih$OKl9Xn#!^~OC}9D#zHvkS4@VnM9HeUCoNmHUZ9JoIS#{@$P&(ZfDg@W<@5p?$khlP<#KDu3_!*yLb zXD0Pvjh9J&QWA2z><`kFZn}k1G$KCx?&_@g_;Eq(6c{|tICI2om2bTqwU0x=Q`2rXWtV+8@hYc8u70sj z=sAY*bC-=gS_bG6?DrfHC-|&wI%WB7yUZ_wS-6- z>Ys6oRXF>aiUu1H9J|=Y4*U+=NzX~@n(!}QvLxZ8YezzW#%qQ$;|8jk>seUR@%XdQ zX7uP+N+Q=y@u5oI8#f-HM|`8&5+rQgO|HPEPOZxU1I$dM&mM$TVGH&LSA5lgatz;F zrz*L1ivg+M&Bl{IS!#p3#yLnuMKzD{CR_FVY@}{i*LYdyapu5YxpYxwZ9fu#V!Dxc zHZUmnp@fZu61zbIB7VV!KMIVi4gSiB2}B=J0Y%SJsQ<7_7$*I^;w|i-m*z(2=&%BeAde)D%$L|2!dxRY}7Zi-Er!t`flly z@rlT)0|y|370uHw)r$J0K82~HlS*>219-94|oyUxG# zVKAFuql=Uao+nvuEBs&)d1lvL0=>k&?TyLs-HsN_HMF{P*{Ike7}Ael@YZFq(?e_I z*NEyUM&0QskPp-gWraXy{WkWS-A%HyvytjGm7=cmSsBVPSYQMWP>5ecmZIlmT?k3=fYFcDBq^Z;+7C$^@S2!i5Ohms0Dq0Yz6$2)_vBGWKx;dtU*ff@n}GP=dglA$UUoz@sYjddSY;)i_VH7(Qt zBy(M2X6yltHKEy@1jE&OJ^Ste)yUC_vicS~c>uHm%4p7(n_e1W%mi1qx*yW*a{0H2 z1ZjH!IquoY%a#ghL1udi^fI!qfPdt=UxLAGIU!Bx$<{B;LVcc<%LOwgw|a6$o%5Qd z6oB>iR7xc6*BI1z1@rMabDm4f$bcf0YweAzvYysc^)8K|hjKrsCY0H)43rvXswS#O za7NfoJ9P)w^i22=I)R8vtzDy^Jrgtx9rfFnKx$rMTBCteq|o;qpckJibHL8MVL2+|LT6Q(YmK6fq>qMfDoAT`0mXl`z< zcd{{rB?@BqOY><8*jbk?hicat0I{g#gY*K(JZr#)yT5tqcb5eys~oWo2x#OrU_7T*Bb+kEK?36~vO4 zt4sV07R2IVr;T7l+E~(ciLI{`yZDW>RT~bt9r6fPo;c#{{y_DR0W-h(N4I`3;7Vsk zyh#VhQbT3P{p&7~zIPzQXhqd`NTl)m_eV13LkE@u8x_kNv>PnxO$uc0Xfv*YKut_c znt%NY4-E}%)stanPW$x93*ppT2dw07Zm>+?IYmT_fL)3z8^amyI5Bq>`4C1dpci(W z_gO@o9zA%VZP%t-rNdpbx>LNqxfu!B-rnwqha7_EEpfI^;;(4_fiig2(@`w$vQJB9 zs(h$IGqmf@$KN_nJz>yZ4BW83thTlm6GN&{-ml(8Rj;3}cl!~9sYKRC1kC5hqHWay zgz5W;#lXet-Sl3-Wu(g=JbFWL+$G&`OAM7zj=5hZi84fojO#5Yp&fi$VT zydfp#w%AiLH~L~XAQ%94gBRrLlmT=x+qS`Fb0$R%01 zc)Bk1Vhe_=J^Ab1My?l%P5Uk6p@oMJQ(&yG%Xu7)=O!9lovXw}2MUmZ;T2t-qS!fKt^Len}BzI=RFRm@blUTT{exsu|(YhlkS&-#p`8TXCS!LH5rB0IOuWy$Pb7NsBr0+a7#*^kYM@m@F!P?DKLhCR`RKib-$Cm! zbnHt~&-x|G%vg<7N00Yf$UA9kmI?zY5C&I4PM~>o)D&#E5Pq=4s@Q%O+ugytBD5bn zjr^`=Fa?JnxUYAs1xLuj&S&xgOR#Q2nD;IL$jKqT_-(7dzrR(>K&RwR=GX4EeS$Cm zVg&qNn%mL<(z7_Daw!DkcFA_h(KVj#t=P;TYxeJYS&p*24G@U;GczX^-X(x(=8!7Jxr4)%Zk>25(*b;o@%RJ8#Y>j}1hcQl zu%+L<9!HF{i83*e0hrph5A8g|V{U1gqk!c^YE%>fTF=N_3$JnuNSb5u`-SVc@j7p? z*kT_!9vWI?Un@Kbr=XjeY|`sMtC?=YKt z8pL4!@W67EM2=4WJ#k_+bZ}{))R9y{YaRk-=C|FKTv4q7q|xU0yz@+3_ChJnW`FN! zuONBCZ9r?qwc*wAGt`5lN{L7wV^Kv!QBhHeO^?0zaL}C%Ba6b1he>|JZ9ndsV~FMleHUay@*V9Oe5aQOI%$Y1LEa+cVy?psHU~FYdRnpn|917*ETj9NTe63y6>iKkT ze~^^ZBP%N_d$B{8$S7}wo{Biwh?Q#c%SdjrJOFh77@k)4SYWDOYcVLh<8s!$trHk7 zNCaHv6%o<{sK!G~gd;gb!j9p!767RzeO40WLz=?W3}q1jC8r3BASPl=7i4L7nx zRL(%gwv7FIAW##=g-uxo4@oA;O+~l+2j*(^tEP<=jMIwgmxox znx*$CY5MI9Ykl8=D0>q+@9;Zfz9&01lDj3lp~`L8tJIz$?+SMe7syd5m-f9pKD3^% z{ygm|IlVA{KG9ESwr8%pxA~Urc(dpxU=z=u%h(V;O-(&_U2%LJBLqW&XyI5%kIGpX z(q2yRdq6J`)HC3^kT;l*5i~h?C;IY1g+@AB>}C#qgxR}=$m;d;xKcph^Z|Z{5%qvX zyoi|Wj(dQ?-sAn)%LHF8vu`I)sB#$?gDfNmcr|Xm(0n0>tt-qsS1r&{WQ%PE}+rv zYt39d2dOGveD$rwtEgBQrm(~9?HnM40ZVV*9BYjhYmb>4EP;mIOq4;ODl&?#aY*xG zDR=e5y5eP;Pz8KM8pu@MpPX6Q$otigUWqrT^mv()ni}MiFe4|G7u6V2cuMIw6&2DD z#}gxF89B_E*)F+}X5ww03j|Ooa)pU0odvUR0J5Q+t3z*xgIXGAzBvLQGMX|(xdw6q znQe1R#;c4bj2m$#UTdCJFRR|IIw<>)m238w2Ll|L;zI#s%kWu?rjo$>D_0GaT4%R2 zq36*3{Fg5<+Y4Vge?DohJ7f0c%iX1rQ9xaGS9ft4F%TnglsQ9OHBnHaxoE`^x)CR)6>5JExT=-H|@(Z zB;dF5u&p1UWVi%8NV#Ye=vBpWraw9rCvOBWhGV1a(zf+H-TW}wq8_u1bL;NmNX*e} z%sERwFDTx7c`FE2m0OJuX|`FVjaTIpP?YLT&KB(Xp}^>J&=TB`C9 zCty}^K2L-fp>iZygsu$p`W13MaHUo!iYK0$JUOw+$;H)@?EGi;uL2n#f88lg4Q`!| z%joa7h;Fqow}|iFtA`@eu6!;XmaG6M>qjGtx`IN`tJkl!i>K2;9>8%y1UPor#Xd)n z*;fGRJ-|-CpEq(&Gc6M_EVaSvsHthA+gdN_CCoH^e-y3cMBe!I^JhnAYNLzbcCNKn zK58DDBZlSW;DAz6QX(}o%XW5m<0bc_`B5_A!2A8_1+a7(8@r*6(t_T&L5N#kIcbS= z1jsmqQ6%O2_XFHK-nG%(f^}UEn)u@93(^^`6OUdYb@B|@{PzCb+N=;OvxU$RbQ`xwwwcTi#`ffoLRNFiDcFD9CHQIj%buP!4 znE>w{6e@Mol!fK(+qYL@)C@1PtHi1K>|6kbty@=D_rs03#RgQ4GOe*lTEpCH|4f^d z>%a=?jq>dO7VUX%Q@_VZJ2vtDE$y#9msQ5M?(aSQv(EqgR5<&;=?Flo{ZGvax0QB3 zoo5pBH3BtMg@}s@hn~s7@zdX;5(S0$$gA4v2>j(gY5 z-h=bl?PE;0Qo%#+pYy_{yu;dOaj(hu$zzhN=4m#XT~MgTLXzU;DMR&|g}3vO zUdgA=o2la=K&5cVCrzH z{W1lkd`kX_reETjEWXjHd4ukA__<^kc;k`x5UV#433uTUeP4OAy7`riwkR0%s;^UGK!b ze*XOVi{CMErh>k{wA#rJkH<^I8htDNr<|U&^9AmZNQE*;N&9s+knBT?RxGAj?(X3d z&2g_$L$`C>7*Dg<71hnr&BtMOPe7pDhJu0*+*nKah(esYEY!HJ=TZ zm>r&bKahM!q*C2R)wcT+8=3=Yz>jX58LO+0AvXHh^<7Q18+1ong~?eDW<+=q7L&aQ z^OyUCxVe>!eRqu+1i!y%9UvgmERn^{07ZN|vsmTW4X)X%0lq#Z%9MTyUqM+Oc+k+Z_` z_8kzAY}w~a6VXpaoOrkt@5SzG6Xv6`d}~BWPuA}*^_9vK2}^lgyfDMA?td!iNlIkv zb`@%)nv%z6N;Nyy)bCzQWn6>uTef4jghn_DT03sgAotH&MzTu$i5ksJ?vQPTuCG`{+9|_M?g)6M(ym;XRQ$7H%tpwFb?42@qVLPY z-uRjQE3jFI& z*}~l1YPNtKl-HRMX?3ruvRrc_57^kobSsWTea`^xn>w=pq$t75sa$5`{cvR~fS=`# zX;cy(wbs~btrO>%yP`B}JHf*5Pj#x3mSfvNf%+u`w4-R=i#02C?7jlu+}4%#lAtK3 zIgEixMuV|Fa;mm^zsuGROr%!=rmgqHJgV{CKf^OHGNxH+vgNof#RLe_oUN9J)$&7~ z{q_^D@NUcR-!V;Z(>2vjt2k`IkhXFV=T`4_Z+9N_2t&7P=~WFN$LSW=ukyE#R@}M% z)s)3=tBhXo<0nX|HTEG$Zg#zX&7ui*43y1sKuTK>Z(L!WC(uMpr5V+6>3Ms)UTCyW z^H!pdNz0yocA{@|Uft^xS=JGpZ`)>8YNMct`M{p;@OE~6E=nPL#_SwXqh#+DmfYPF z=d7E$e)m2atq%-+@iR5m$d{Vpa%h*Qs{9}SD0B_f3J`q!LxLt676A?R{c36V*f9J} zq^;NPqXkgV_5y%)&Hd?X0yYDB2>dQhZ68yMtsoa0n-0IlUIuTbPu}SCPV#USamsu7 zOKYJ)fkWZM=5n$3&exYR2mc68Rl?)?ZF>>vEu~M!pRuyDbBT!=?(foNUgP)cMvw01 z(sJQ$-@4U(SH;UK;L07NTt6M7$3-TUE^iP1VO5Np5&PSUwB%}n%(%8U#6_kqa@-%w)4L2)nv+DG8Ew(y`7_>8SK2j9n}v~?j*uJ$hLv_Uf(T{ zCf9Iq_#_A$neT|x$u$V$pO$bp2=n0v=+k8|PY8+t=+XVDpMULvNVS=GaNVkss6t-J zg^mh}%eNk;}U$+^lR{%6PO15-!3f zg@$M-B7sFh0c3nR3wB@A3}vdT)+7-ap1F*Dz47)hUSNWxWa$E6J!!YVrL zM>{&sx9*!|wC;i9bES?jE&&1Mc1ekEF;8p-V_gkbVxLFq>l%%WEPv^rwuNdqDFnHW zrVAi#8rr+_20ygv9;Z?(dW?Tt*HXxE->rqJrlY#lq~_P2EVK05X)@u&lA=gXywFJY z&*rzI)|Bt!Hp1KzCGz}Wm*g6Au?+hS zvk{R?_cLT;5eergXf}Ti_~GZ4mw1SNW%^vfFxuY@*CI@lYkl)~IhqEXH;hla->55v z{E~c8Yn@lsz}#8>wtE+-f(?8KWw-Ef&~!NabuX$Y@BZgFL<)O?&q$1eAzH<*^hKu< zXspo%4lI(#IJq#tIvZ!=`2gH+)m--%I#bXBv=$U%pGmqwD1nnze%KFZl-H2)-xTu~ zVyzOJ2L}x)U+z@`Pb=z5`nV_LmkgO3u*c0J#;zYfzOiEPXRjzW^OXB^a?Oay!MZu$ z#t^2c@JoSty7?i)f}m?ieOR>Ab=IM}v6KS#O$ST3Gv) zuRr8cVAsZ#TutPW`xehF>C8nbg09~ZYgrXi`*Ox6z{cIv%(J~^-n*S}-aqvYuCBvh zK?S}x{=xuxE`!ZE-Z8anOU!DsuI7hm8P|KvntX@>3og%a@b^Zj=bGzM-)GIdtq<*z zYB?=V(};+Oy!}?wtSA#^kiwwjx_|#s=vn63b$d{~KwL9&`{1&M^uANGDGE$Vwuj6P!;jCeFU$$k+6 zEwwf_cv59h%7X=))4PcXcUVt@Wcxmr$kQt{2n}Vlo84G)mr_JXl2+|x5#cOb`~^9pd&!89Ka^jpnVM#ao@R@F{{1-^JL8;%xG(Cgw|8D7&)Os2I%o1q#$l=CHU?M7VQQsoT=&+G0k3gsiM- zpSI4W0ROI}T=wO<-CUahNV*eyi*2NqXc&^Qj*f*wxY;Rwl}{vU-bQpZVc{b=yuq)2 zS&;+tXjB=>Zag0q?WuwQyxHUJe6`#1kR9BIY$w!j=M1YA69D(g%EmSaYLZCx)XJ8b zmOQ%!9YHc^-#Y+;d3qHMYK4E>cH>-c)@)sb6IodtvlCfShRF}><~$-NBR9L=PS9N8 zt-TLQx^8HD7Ga0SH0OMk-oJ->S>W|{VIyZ3EEy3!MY8;XGtmxw>h;Xt3LG5Sl_hen z5(4x00?9{ii)i8B8vArmhsT{kBWGsLhg1|;D40H@Hj0XL9pB~2!JX+9q>$G~z2?!y z{}!DTG$*)s{jkWMJzwP-+hVp;WfusL=SIf1&T$k-ZxGf(jNaGD()vI@4euUQf+5aj z{dO~lT1uhnFt`2iG`lL>mA*Eooi3xdbV??4lH*tLW4i$mQ|Rea**QXup%D-u7_0rg z*F3HF04fXxfg^-TD%qdHPnopJZR`XsP&A_~F9#mg*hlzGc$^ET-Z!Y01b3oS?WnoH zgWyu?uj-KtNli^!rXZG88e92r%N*sT9qh|{bs8gU=!?{CpNj%z=S%Dtjp*w&1ke_( ziW_#5OH1jMGhy(_$zfe{9LUw$9V(lH93g1)19iE~iznPsB<*~4WrWMkHL5VWL%?P#n7!K2e`ykY`Kes#T@aebcxUGG1x(MzX zQP`3vUfZCalh!l^_9;JKad)5$^NZw>c{IY!ePtx|!Yz55?>{?5oh0kf4_-S!L4T+B z#!?h$W0VP;bRLj@)6Xb0vyqS>>RQ?Hm*hx0W{>OoyvI<|?ikHmW_MJ16Pe>B;SKh& z-I?t#h|3ZIn+Po~-MWB*(nWT9Z*Old;oCEwEKPP?H7> zTv&h#*bU%<-afMw@SSC@Ap6nzl*FoB9jasE#-3Rnr-;q*YMS(1vvsZ&`4_-lW&$t` z)az244!*QxT6B^*oiLhTv(V309*OS*&6tH$p6u1T50c-PYG%T7esk&Atc>geiwS^a z1IC3&1Cb^ifv`r8CX}CnehsDy^XVc5S_h~=*m#d=D}+#i;1JqH zB4@eROjHR(=a|JRu}Q429z~>q4IxZ*n}sJNJVh^6OYL>-)b2$>2n#s*kr9#Pgr5Ny zdIeYfw%#k(=H}i}_OS%)4!CY@q|11(!wtf`0^$mfK}t!8Lw(Hc+NR`I8;A(}E>TWrld;2BP1HB%e-Ipmpp{$(`- zKbE)0b#(SuAEQGDrNlL!zKk$l_M4=}%^}Z4DIx@a*mmBMN$dbf+I45^6qA(iLoOXu z=NVoM3WQ8vju}B%4Qj=HX=P?66ELR72tXxLv%4|cK0E4A5p;<6Mjny2SVRYbpX~@d zJ5#0=D(trNMovOPZVn#RzI;D`KoMZYi33Q^2iF6+PkmW7@FA86!zX; z>ac&qzbHAtv;c+bZ&;c%F)j|a-a1}2wBIIX9|2jCa!@;9DT8GzTA=9w^lfH;R+Y>L zJcNGWx8Sp_TZlBk66gu|t9C;r`g3#F21?0NHQT*pl6gZuA}toSnElnC!lo9SG(WIw zL74T71^lYO-})MMZd`6}j> z?4R_pjq+xOW!zm?*}|Z(kKRz;TG0pK!33SfUOTV#xqEJda`Nczh5YI#Suqxh1%Bb)W_|-LNFMNFgv1M?6+&|w^Jc~@UE+S5VPN?gpU8qCi}bCOLBS>wsf=g z=j^Ywk5;9S-nfC4g1S+!W-4>H;Uy`pU(fRYHIVtND%=8T~=8F4fh4uk!YK;*TT!i(O6gJfEr7SO+8Mfk{b;#@zn&ek*i{I(VSQ&e8 z6hFYl+xJ~Re`!FUl5+3#$yHpikdfsuj8B9Z{T?iDc$ap)pJr@=&-}SXG?SgJ;LQEj zHt^7!AQ%5a+$M_(0#f=e*I1nY&EQghu{`4Pg$qxe7k~Fr(*qu!!ke9p#SJ?ZW>STF zi?zpTOjZCC%2v9PB!4S5V)f(L+ytWi_5_-R6}nPd^DtDXOqt?Ae+k=oIZtAuvv(v+ z%tgJnqlmcF?B>_j74ZF-Yp%Lx3#uj?JQ?!!wd~GjD!4vN7W+gS?<77Jj)=&%%T&#_ za}da@mE8YI&saQ(=MdPIm>Dhdw#O)r+dp=x>B9^ZYaZ3*1-homTWfIiCVhpKoE)f$ zi-P{`qN3u<22zmGuQ?LHl0}`SvJTouL38oJQxh_~?eSunnwctGw{Jfl8TqjfUjzP{ zNyJGjf>T!m%c&i->mzM-xr)mKp;fE$$)}p@=X1WM7Ot7su{)AqZyY{>){OiiFEks* zBwHoccPkjyEg#+w-+Pe_>i<6u3bFd&W66LsL^0s3cGP3F$etope1l&b0?Z zz{|b&HovZZMr+ z842iYzj8B5E$BQ8bGEVsjH?&&_t92=xH>k*>S5K>%1R4{K(Z0=>1-toI<`;@#hA(g z1~&hF)F7!OS(GczTxk;m%@*gNS*a-n;{#z87@eqzyEA7~apoMrVYe0Y%|O-+?kZ~; zY}c=IkX~MV?Hv*RIr&Rk7$QyQLDcP^I9(vNY>;sV;f`ng+FvKPty9mdC&Ms`l1w%( z6?__d;O{tQx=MJr-$6L;7epT6+~Pob@ylx4AnASUSjEjK92nnY3UYGU&Qd0z#39Rd zHO(^Gx_!FLNRhDFGhfwZ^JiOJ8p#Z=D%kn9_i<~*9Wc)L^Xx@7}@J`0u_#z`F~#nV*2yr}-qWdQatC*uWU)u@G5Eb`%tYv~=Qj126p6s)YiaI5JYft=qw4LLut$YkmL z-OZNWq=;LQwEHwM^=VTftA3-TmxSkPfvXNio;2_MJf656x0TWk$sfaw_|_pi_I@3I zOmXvGgS4fKh-opBx3RNtjqxu%qo7!m@1VQTfA9V=7q^!yVk56#d>E6IDQAoB+byNZ z)39xXA3M)Nov@{a7btr@+h6$Y?=!&QDRO~Vn0N1_sXuvWS;~4JCtRZ$UwwY@>f_=` zj|*OfN9m*}-hID%H1*D`&7S%%;Y(s-%%Oibhk_#K0$%n}+$`0_&?Mf050YWkizbxf zB~snBl#iZ$d>L{(3?s+-q#?Smf6e1RTcQ`7#Cvn%kY8bLz=o$T|$mfqeNxFH{zUnl@#K9qycs(Q-Y~rhj zBZA@cig#5l1n>Sguk={I$=Jxx8>|nOZS!RgkipmeO?E0 ze!*~{fM2g3s>2cTDa!PzXT;NE$%!&oFa4uPomBAbSq7;;_kLa~-JCGso+Rf@)04HT z79XTw#L0>3u6t#W6Whz`2{(zr=_0E!McCh68kII4)7PonuVzj1oeh79^IR!a-=OLg|v9-up+R?l#EChyMurm~>!n{cGR; zdH!JbMPSQ(>B1!dg3+&WPn=T8CV zXRS%mB5HFSR#!?7Iv%9?Zp?moM=$R4k^&O*S05?UpI;P~>su?OVLG~0exQ+8Ss2wL z@d7$#aqpShZyc=nk&aGh68wa9$;y-9O{Oe?`Wk`KU>zZ9JGJ52uE<;7CBJ_rB+c!5 zpeogX()q>F0YvF13qTI?p6RTz2(Vxr~{I@ps+eT299I%9&-!Dch^K9mY{ zpuFh+_~Y8QYt9`}j%+%Iik60{%ZabbDKT$Uw;NVZZygLlPP}-HZGCt`*vS1+;6lg? zyZ&>|G2P=mpYVJ12_lc{`KhctrlpypqElba^-ssYJ(xU6;y}$_VWcP2<7t;<6QL$< z`4r3Ns7YPGQ#|?jvNM5=U!~w)+jkz9#RJFd|6JY3Ad_2+v(!~Sz06h$Y3!Zzdu=P% z{>q&Rf@g%OVam?H#k?*yXD>Nx8s&Kj4Nb4m-YLn{`+PP9Z}SdZO-ICe;4R$FQd7no zKhbUz1upUR*TTxqM!Lo(NY;^Z>et%boTLE<7Rv8|_aq+~UTC~l#Ple1<~+Don(u{! zcPW29=5G&Zrfwrx3YAFL z?f#~_1dP7!dO{KZDlk}=P*xL_=2bUxj zUk4jozQp;-!`^h2+_psEWPRJgcJmBV&aesZgHgzZt%1R{FHH1TiYFzHyrV(ucM6Gy zOuxB1skC@f@gTexye3iQ_rj1JQ8q0ES^H>U)w%W;5s%WV@ka(n=w* zGiJ!UBm;jfJr3`C1$`hYf9->f1wQ#bZp_Lvhs1mg-Wk+!7ZQO-$d5TzwgogUI!xZ6 zcw_c4Q2hiv7We$GHv6MEYk#I=E6hnw#udGGqBqg8wXi2Ox2UnC>gTDFy#2SKz*!gq z@pgreq`J=gXDcYq**l)0q?nCs4y`P;(k&HS%8krvOMQj#f_8Phv{G34oMJUueBaI} zlC-&O;iyQNwDfmzbbC4kpYlh~xyfhE+>1`a^CTn_HBxF|aQ4f-;>Y|WKdyCL`+fCA zZo|F%ZhsWNG6)Do&{iac*SV$Cy7eh?Gez-sz7&%7$3kg}N6lWvf~)czzXCs5xhK~* ztVbvhjcq+j@zv?K{ID0fm@jX{<^H12t<_lfBpt;O-p;0OuZ3^?qzhZeJ6I1CGcN7; z#nAcO7x|I!fVL$lvc(^TMp4>;wS z7@}NbIkiT=j^3TE6qgJY)S0p}lTAoyHq7Xh2z+5N3XQ?~6@|1gK6l-qpmA@2)*m>rEbGi;A;ys!`MP_@7a}bvd-n9Exk*21Dgj!yW)H^hwYAZNFIY^9=;912Ad?xaz98B2*7Mg=0g~c!wnZ%;0)3p4TbGu#JgPvy<(Lr9|mqY%8VcuLR`7rEJcg7P6FDZOI5}z@I}jdj+DrDDhB5 zo?I_YLE*xhBgBN=fH4PI8|&8Ss@~!0(59Q2ow8cX{scOSd0O}DxRH6T(cMlsd$r{O zYOm$DQG_iszuq^eCcmK!H8oQQ?f28chbLn&Z0_;BQ>gADq0!D;`$YdrcbGTr#Oo7h zTn3kFdq&{o*BQLt8%*5b4d3d_^jh5`_oT|xIFFPqi4nG&c?V12ncdJ1y2li+FefKY zo$Pc#TzOpWrMi)q$?C}};Bhi8$#r_E89QWowJJ;wzG1_3-=q%^P9PCOtY=JP;O+bq zt024Yteg7>@3>H%IAcv%Yu11l6=_uwwGD?Eua7s+htB8iM0j!erSoZayFRNu6@!H# zGAu(i4HSrGFkr(xkjPK4q?u9iG<-?;7cTOZ%a`Y4JV(PI=9a|H;L#eLOAVpjA@Nlu zvrT^4DHHEd(L@Q*(qAj!^1{K~G_*05WzXYfnf>4mXpCPsA?6-DCg>bfmm#bsXQ-5+ z1PF}Q2p#=mH*T0~S-y4DRFto3u&;G1n?r1rfC%h-i4OZpY_T>MkyZ?$yM zOP|x`8db6Wd%O6?zGG;@3`Z5V>mM+xG@3ue%Lp9=+gr zphjPx7>=1;zgXP<`lL*GHUgm2Hh_r5z`0y9A}X1{k`#2N?3coAdpx`_KL3-gVDf zoaH$)viG~+=Y8Vy`8>~d)sPO?(>$xzDX31yus7_*GOn)W*3;bE<2pN7+GY``2`w%; zHJxu^wK5<4nU9K0n3N=s_mU4hlp63Ok6+h!>OADO8l2xLZpzxiF~#Kq{Fu%;$RGVsyZ{d?`1!KAL^?|x*`KAm(NZ=82rYP`#ta)h57 zhX)gli==a0&+U$~o8HohW8rdky3EQsDQMRZR+V`f>?W!c%-`nNB3B&&2BtLK+1aB$shF8Vzt z&(bigBQH2PIb#}3jyCOsge>=VnOI7lr#+iyuh z5iobOhoQ3fIaiufxlRgAgYgdAM&jdt#R{4FpJbM?Zd`+TlX7ouR0h^_Z{>|>mK3Av z^rWS;8O>J0{!nsTN{t%%6H%q6h~woZ7q;o>g@ds2NP27x&IvkWX@qq$%GSBf0on9c zX1yRnfnSNkm>LljbU=pkFkJlv-(94X9w4}MRXaM{JLImwh_JJAqXgZC+6>vYcU{n- ztw}$JRJ)yT4tsp|g%W3IqcxD!&!x@e<9CGr7O8S^Pbvr6x_o+}=Nyp6x508+ci6Hy zy^4Z`{DX4nH}I-tde8s-q z1KRU^YcPY2)pA^OI0Y5*ctzW-QZ_s?f}?PF@zW=~od1^D(b4%xx|N77BZ{SANWrF# z!!%(z(MuC>7)>H;3z|%L-Bd#3bbT}&PO7<=PGSZ>C@CpbRaNuSJEulY={%lESI>Qy z(bnzV>2FOs$;C|ZBIMR#Ur9hU)YdJn)yR({-zWb@s(ll!IdO;a3o1`<^|=k7O~riq ziwg>J;Zdtg*xyjT$8R(Tkne)+9&-zN0k;O5OBq@04`BITwo&(Bvu(X{2hZCOrCOvN z$LzGe3lxe&Sc48r$#*%6j*3{$v0!2NAYq{?->g1aso!Q}WBUP-Srx;JL70}ka8<4G zdnc2Hb|n;h3C|7U<%L&YZ;H4mCV5sXhaaTHk+1AFTxv3P?dX5C?-?^$YnSj+)77mr zPUNi{_Hw^C^2`YzXcil!t-TcP=Ce3_anw7%yK;4UW8p2?u`gZcULdh z;@~l*rxq7Am+LAj(+#^>JFCPgt7wPLQ|t#XKFZF^6Eyv$Kkc5$7VDmfIiC50J^B37 zSWT6>pM9%VVY?Qcqj~FXc!pfULglogBgbl0ap_H!b=iY;k5MqAiAc9b?{!+qabGWOhEzG|1J#ubH<9^Jm)<&)h#t zN=a?TRp0%ye;q6=xh^M%3O&UXPElk^eoQD?NR)r$ru!X#S>~1()!EpUFS_-x zSkl-tW9C!pp#6&>$9s)I=I<_2wD$dP2Th?O^Po|`e7)F0WUxuX)z{-QTN_hSIrUgt zt5ayFm(f)y35zE- z55a=*%TG^Dsw$0*GN9xY0=MoP;~4Mn9cC35zpZmaTNcS08Aa{w9pbREOY`~Q#Ws-i zwBM*X2VE~lN2_V$TG4N1NF;|_6zkm41EkUVISnEgk=!<8WKI+yX==U1lrpZa>x;U8UzJ1-*S?XeCPclb8mBM3S^DrJD%jx(;dv`w^eXn_ z!q4ZQwD!GwE)SI<_?hM9N;dWSzcr#svnoq_)|Ox^?*&*$OqWNltxczeE)nyonUDxe zuRiTplfZ!`a}Bl}4Q=@p5Tl$pGvt4Lytru3Oaim4*er{>n36ncoiI-$m|`1jri$e< zJvM)nt^bVDh*5LQluPjFI;_-jJeh9>fh1b@rN&^U0#S{QmezXfTE#S`QNQ~LF9(CI zKKqjY^=pa8^hFbTNsR5Ywpmr8nG?cO0bjfBXVM5`pkhz?d5eGJ_j)HP_Mk@H??qk* zR53mu z|8ie_Q9ehMiOSH@mX{i9-mfkMWh|jzVuP{(!9roiB+Jy6Fqq^&I}I;2Ln%$3&XDQu z`>>-s20W_Pj^(dQ8M7(WO?BvJC*^s*Be8*t350A_R7=BPaVw~rIAgg@(xc6u*l`)S zyK|u1IZK0M72|5-ACJlE8EdG7w64$w^!iXf!PdxUAB6>_UShnpe_WBfH#N_lnMIPqUAk9r#~HvwtSJ z4yQB?0|9jKoQ@7=E^cn~!KM6@)!wbX5E?LW!M;Z@O(O1R!?`d>5#%2Xui+){&q0sH z*t7)GkYVO=<9pkeQ`sHPQSBW+tV6;qiqjQ``=Og2j|Cmmjn6OKfn$y5iy@l&RY*+PvPo?CN+AVSh8iJBkk@hQx7-Xw-T5k$>DlgQf+*^}prW=pGT;4H?#~Og zeJ&l$X6JB)P5A|So4m{sMQnevAbru9|0(SAi+h}J8K0m3_zahrER@T|JeS|DJCCi^3w1ldzqHYDYxk=@2q#$F zby0oiBGq#*)1R>CNAqpWLUf=Hj+2TcRapv%5azP^e)=i5o4q`8< zZ^9AOUAs*Td>)4$o85tQu@PNPC=uB1Jl)+iq7yuu>-`K@9&c11T5iJ+ghupYr=JgGljF3W z&a;PJQ^u|b(NbmR$gobg@GUu!fE+oIP;etVEV&y1S_8e;gTbiA0QB%u2X{V)g*kh7 z!lXXjolbzB0H*#Bg1>=f{1mBVdKG6Hfu~@fWOv*w=NlO=F8*FZKMrrG>wEo@q5CGC z_i+{pzzkT^n1z#SJ~Z<}L1I)v%`r_+GZqm&%_{{SSW~4S+RgD&62K}(_A^HgMj7Rs z>dW8|ja(gy_V>`Wshrg<278#R*6Ns_Wk)j-QN&~%aAsx%Z)eZ9n%v&O?MuJH0<&=M zbm}KW^*tVcT-kd|`R!w|;drZ)@ftw}Qn=9JIM~41h8>2JEX1Wf`Mm5im#gm4)2srs zo5%IVocdQRz;)5^n}lb2f*TIHoClmnw~ldPrD7nja2Uz6OyFVxwK`060=gPH9$b$3 zdDff*uTKWnEKYzB6gvW#uFXGyWri~)tM~emz?z=3VSmj|wXv5Po!|eLBGKMywLcHx zy^kAsePYbFSJLU zAaMLKo%cf>AvO5&$^`yNsv41A=)jE=?5m5nC6e;r_PP+B$6w*_wG0=VahbKez#f!G z)M=)aU}`iUdLw7hdsR51VR)f-2BJY?(~XuSW8z+*jyex6 zEL9oM04lDX2lBJg)z$|(-75l9YmcGohsIwe#xyG7mAI&hiF%>KNi%cp^?pjPVHHVH z(QmdcFP}H5_B0}=-pot9pZ>|1$rxG*$OoAp%-$6mGrT@4I}^|^(QTf(#sx%^(EyA8 z;HUzlXS-=3gKk_h;VSFB4|m>pL>c~~@xSZY0j@cJ?jvg$?;FK`1%HJ8CN=clB39rQ zBW)DV7!#Yh;5v7By9bz^()S_cFCN3=Lehj=e%=4?Iti#BX+&;&esH(_$p@}*z!+YG z*;QcLtXbQ1v+VJD2cjPKDD_%XsPjNG+r9#B(3F(P;`84dgynoRe+Ip6vB8mTjtJEJ zGca3d)Fx2+Dl_e=S8EJ@vR~iLnf_0l(FbLN?_y1@>3Si8vyY-`Qm?N1nf|4lYXhkG zE3g}I?AKf|V+h{;B=T1O`b_>np%2xMV`F7WR8EA-4 zWMAI!+yvnR?BWy5wFakgNpL7bH2RROcAV-&w21=XZzq>vJ{o1yy1P|;mjMjQO&DWj zrwU^Eus;9jyZU-;Kl#eSg$iI+z*leGh1Nxy@BQ~io|H-J&4jNFjX4GK_LORT;bOKD z(=%pHx3p3QLr(GOg@fi3Im+V^uKhTz{VTgyo0ZTSGO2d5o~k=uTQ>ksws-p5wGQ;o z2ss2(!JWI(DSt#6LfIPfGSkq>)Hd|{ zFzmsu25+d9fK#pMgZ^Ve$k^YtF7KP|#^GumOy~^{?>ZB~eCHz+lBl(EhtstW^dI&P z97absCg9K<0bhN5*qBHdrwmnsne&!)VAA87% zbKt$3WCRzRiTOVlV|qUNMvbpj;ytN2_S^Pw z-Xs%}c5Hz>~?ZU3xr;M)H9+_s4{ zcGUg%upIR8n?TN_ZdXhuMeS7>42WSXO2G?Yi-weH$q`?`F= zg<{@s@HXOmeGo_g+*L~kra-*&&xL zaFgC4=s%hNw2ogVhNxHPgR?a{A{p?htlY9@DY)ugCXwJ2c(CA~$KYK3&lRf9JMf;V zt**I{q>^6PMl|GDr1hHU`h-1ivDl7WFf9NU=^dq+UyUhh_)rEvye;bCs}2h#1GMP> zu4tF_Ti)vgMVvpTXaIS{r__$f6?T;VKf94;v%<;MK>X5y+We*FO zdHlds30>;yCWK{&Dsji%>6=Mxj+dXtyVXU_{^8kbCy>!xc?|mcTD>Ga&-vtn23IZy zeOO^*%Xh(Z%kGB|S>rLM19`AK(9KfXVU^Z*t8c6fIKhPo1#5%`80xFeO_UHRGBGp( zIz@VsoKBg1s~k?o>h?~@&1O#g#x?Lie}vLPQDzXs-B1m;yl?WM^~xmwD$FuOd+ulE zkN?mxf)`r+AYTSc=v)w1{e_4hbB?OH|MP7sf=)s6}ULTqV@pyp%rYmYa<}_Kp)I09+u>zbo z@bMjhR@0}b!6pHWtoezCTC*5@VmeD^wuneVJXM&HM2CNiBe$LlQ%IP$MnmD zzov$N{i$1$-&|6u{wkyUR_5%GT- zvI3YO%*x?+idF;aI5KhU{O82f8z`*8ycxsH9k2COxxoK0nQY#kfragUEvdVB;OsB!&|qd_4ffh`p4*Cg&vsIWYX*<^9!vNaD3`%ZEAr z%?VYo5LB!W zRf#*Uq7CuSuvhMY;wmpgMAV}^n-Jdt_u}Tyo~5LT9NPS}HM2c)e4?hs+mX(QNPcx9WvC0?wl*`$Y$S zLu-9Gx!|qSZl6yzlW(Qv`o&4k9-G$Cd6vGic?QpwLv?g?3~YPaJ9hy>o*z)qomqrZ z$#_!needH24P+}MZAo^KF9}y87Z`p=;t1Afz@n5s56~TywOW7{1XiD}!%=W341);d zB`uZo4F!$jza{cHMeIY*pvmnr;=?&+S2riy%6$i9R%Mm~)e05)uCGO6Z2jc7ME*g6 zaNu24t!VE=17D7#?r^Z%#+GBO^Rj9Jx3j6vc**}?E`FO#h3azmc<|&nqPMHHK5QFJ zLc{;NSHp8`Y4i30ER1c_t{W#({*Ut0ER~wK{1$_z0$`}haRcv(5(@(_=H^j z(IA+CB0pnXD6)YRaS&47@h zf=a`m{_7g#?3$0IJKCg>(_|M)hOHq#8Re3M)gUm4r>jA;tc;CSuUMAn(#5l{I=B9~ zgAgNJy%WmsI`VC)wv+8wt~U8ZK50_^fDEEG1GA6N*w(8XpR8|bc>_8YMSfWk=J8XT zPK>^wl<< zEs`3Gf>d(WfD4_6P~z=J^&% z7wweN@x4i-O6Vt`y}NE!Ehlg=ZMkjpy<~S#p`nd@Y2uA!)=cnxQt&kQ#jto`e+ZQkar}-Z^)xnV0;nOb16A&^NBNW&-z4S?}Fckph zfZ}L*p{Im&Cd%pmk@CI{Xc-JfE@g3JLzwc#he~2Pw!xZh`0wjZ+DyBr+`=cH1n6(yHFu)^OVmo*gRmj zzPZlI1VtC}$Ak3id5DPobtR~gf)N2q9>?Wv?(Bu1Fxsm)QTYXkZ_KRPg5E}mx-h(IilOi}2as4Eg03EEZ$0p5hef&IM2b1pUww@ri zE_ig-8U9<6{6dMTm;Z(7)Jp%u?&;Pb8q&jQor}X$0Bmc7J1o;wbWkjQi%L!X0I6Ic zFQ$h8l!ublbx*g`qkeMxdGc6JSo(WFz&!B0?C|sT z%wL`7D@(Xwnu}rIAs}I7g{oE%Cn){P-`hH_5`kXZZ9mf73aetbfgmIE1=gRLL${N$ zF=Sh16)0T(H_6DXPg~O> zC*0oeXW2Zz;?2uiVzU(4JAZ(7ETZKNf=u{FCeIXGY4uYe()#^pedHlZZ>T)&l+&h5 z;;r3pD2ZM9)B#@3WQhW4mQwz*6A!Mh%Krx@+q`em3(#%UyVLF;XQv^t5||>(wOxH_ zeM;>2j3rQWfRyWD+{D9s&m!=1jDg+Bv?uWyY2lp(x#1~TrGKfTC1 zd$_RIo0CoKj??}UIi_FP6!BmyI(Wn@?9$Ba2-E*<5?}lU`>0LzY&CFKuQ5}untiL-H%G}rf2VVvEET0@m4btwUi?mH0jAm_gy5Q5RuJ~c~&)uh_ za*i?I2Y2nAkU#D5nrC7!YVS~88;XDA6}fxKo5)34)j<5{TuHnLQ195gHbr zz~y^GWsEhMtUA<#4eOS4CE%t#w!X{ltj}1$4Z!^;2WlT$r_f%U%43efJif0HZ=HiZ zOLnCvIk%`{BRB@H;E6tVCf&tFnmM)!`dQvtRnUXV?}o;rAZ1HT2k%{)dDr=$VqkfN97zf%ttB<+Ig9HM zO3>&Jz`lzj`)|Zm9R~?Y%XZ6*Fkb(=#v}s;M5I9WVk(>Pvindrrprf34=zX0&9K0e9BufffBGp^|!TC{4QDU8VR7w?}IpLjs{ORMYZXi9CM-buKjT6 zGj;h85k)~D%1Yqe$H{Nk&6H3O%mwKr9#1>kRH%=p2z|6gKj~)H-U?Z9w*b`u{jve`QpIw10C2`5n+l4&#ZN? zh?Zr^8Jv8xy58qbD9uX6xIrLF^P-Ep(+$px8bti>7+pi}?A)Xs` zd)m?K&7tZm|6`*koz_FSoVuPYZcgO}Ty84?EsG5s`P$DU4}E0UX(GfnqdYxBtW*y?Kd3r7Z8JTk3E3KqQP&}N|dgFdDmB8Z< z+Q@>*_jqvjnu7=Fze{UvrZ3K~mu+-AGfMM#9%+H2N(O+n!l0Z~>m(s;fXy!x-wm<# z?Yf3t)$A)2oRewIo_?^=MUxR*(oeGSQqNaC&sY%W*0)xqLl;3U%PY>aRz*Es zyN12L?iZk=Wjl>WN_qvGh=xNriZjAp)>*Dj&u8FN3y>2lk!wJEs{mdTBG_hFf`Wa>a|CW#bOL)>E{+?^P zlP!U&ViVi6;ir;^=!K}9PXLJD500B}vx>(#W%qqMzKJsFa#ej;$}wL?a&~LEQ1c(E zFOV*%qaIZ8*uw$YplIIueJjqEJRblWFx|9sWYV20x|B{ z8wpSqk_6hNQc3w1{t>cIygIi#aQ`snm!|l4ElW@q`pDYQo+TU(pe@E{nvh`cp97lo z<50QRaIl#7BuNF#!!~qNIW2Ft;&EYx>W*nL4U@;eJvnE!`HdP?p^P%2Cur;%*LF{~ z+tNk%3oDbU1QjmB!$#h+xBN%(B@SDBChdzkDhB-wL=^F92M6W2Mqr{tO7z8kByc}b zUWKCK{)FniiJG^glYlO7%KenfwJy=g&rU(muDbqYuKDYJ0AY`rqp1G zeSPoOeNfq_J8h5HK&CDqYE6RDK-StO?V@&5gA00fa4@m|3R^z#yvtAZguda$% zhUaD!>8@v(WUN73#H`Q25yQ4fSd- zvbaLB9d(`$T3--^;X?y$lh^lLJgP5$Sb?GpmM}u#K0Per#P$Q(>bwZMWeyx>^>RCS z-Kn4Wcx_KMIdQ*`LgI)4NE*K~F@sK)0P#HxBcKq6BJY8X8jVHamt(Z>;FCD0TmAyF z_XqHwRAIifjszijbR_fzg2-EMZn*+f@)qN@h~`47#AdW)>H7|@xAw|aw_(_5s`!HS?br;NOOrf+n)O$c{`;iH z!|df8#b`DfllZpx?eL9~>kudeeBb08*)>rV)CwstP0NLA4e^aM9eH2Ko_EXtM>yWS zb;x-tizIP>P;3jZ`dQ0FBwF9y>)kWnH4B^_%33|)Xjs_2ce8@>5aqZR{i!Affh!G_ z2@YbCxf9jsMD%z`Lkoml^*x4kqe!ZY?3zrt#;h&96w)al{8l=DOU>c3&)OlV*xMPO{M|RLp6mJMsI*jBOGRhCtkkP8+jRWD9f1m1h*m1heZb8Z(n1hqV zKeqD~atk%Zg<_CS!(KmXD1UvFcUnV?q$`5{2avK&gmJ#n_bAiLMdoQtC0={GJ|$<^ z8r1j8#6#|GYp5C0>2O0JOF{Tlxn}P$yEsRy*?$4x4L_=noA}m#{2UR>x1nLG22>@v zrTv|9NtPzRIDjTyFZq)GaHk1&N?r0$ZN-6?5d)eUkNtA3=?DT;!dqz#%~F4n)ANB{ zgsi2FJ#V<%Ie+j+n)Q{n$i7`;cId5cb=*Fnij0_o=p*nopIZmPf5OwZ*Xl?_IOuqQ zBC0uKbG*>3rl4l+Q^L!2Uv4WV=gG%HyBnQigTxEuYoeYhBL&l`D4Qy2xZBZp3lyr! zi@*f{1T?H3wumaXN84h)x7j8Z94PnkUyc6)4nct)m17k<#-AC3IdI zB-36M1?N3HQBhIZ-yce%w=Zi)>;wjG&NJqtB$M%0Ot+q=$j$RWc1FXtv1*Ug?ISb> zuYK<0&M-)`C!OkbZHIt|wxx+$hQegLyLQk!^f!dt@K@vuFry=CMs9=BV^lt>M*XPZ zGV@TCR0|k0uocjbqvW=HP70DH@d+j(kX4CwfLU zUBekO2eYY`&!by{DY9vW1{~Iq@SUCZbB7YS^II*+UL2i{Be#}reUxA1jt&xbjk|xUPN`Z>%1&@~ zN2_hU(RExj0@f@vSN>K8Xx72Ym%!UjcRq2L$PSkDvi|_0Uq`uoH+0u`@G`d^!G0?r zl=roS1W;b&^}HR$$;T%@JP2rp*rnQfdCB(@(;1!i8@65CId=qJZC&;N1;r~aUl7v? z1avunm>N48u|2{A1PBuvv(|jFcpjH;jn`+Cek7&To2QEITFc1m8p^sLOPVkldJ(;Q zT$^L&klnJWEFrFTj}=#O+pKS!M<^flSU;Tt-U?|hV6eY8#HODtkkf`U648XG>D6iZ z+q8z#qz?@N@jo{xOkRoOk$kVr&sJ$!NApY%)?dRlH?_?L@nxwNJOR*)0C!^&TwsAf zPezVP@^=ZtF(y7&v@yBCDIwM)Z31nqiFn{8Pi;?;2QdU;FdPEs6xC;yZOm>zTCBkx zBy+fI13-JW7nKJVvr0%iB<^!P-J&hofoNq~x6a*3MO`$eLPI^LxVSo70b$)b^^WRn z?U-sDC@@i3YfCdWj%m41aVE~ZKv(4>M^a{|sNBi|9ks3T%F?@q*D5NMNGv_oMSi)Y z%Tu}3f=)K@{HVbxeAm%iJ#*_pdZiaCe#F5X^W$_*cWT7MtI}Nqw6&qFq@sy zJatw((DnQCEGcR3E_?b*&x0Vth={DKGx7_tXZV;0W?Jz2}Wx+JRxy30GZruJhxs|C?=Df$|}K&7RoyiI}?J)*{#Tqe4_AHB(L_HK!u zCYpi|0iL9H!RKU~dmV8;^>ywN7iq;Bh(u-~odR&YL#yiaFXmcLPE(gl9o-Z4w9btC zYGsxZ^8u7dq3x6QF+SDNK9y?4*0_*W*0#4YSm;(8p*x-|$Ct1m)S>Yd?IgKkcNInh zgyoA{?zZo`&U8NbT(RT48b7!oa@?vy%8&=#!}~H#j$$r*xAIRsxAuJCdtZJu!J*NKXzD7CJX4Ag1ad5erWn=ciFpBIku@~d>L0>ME=Z5E?31Z zOK1K>^Am+K6$2WTh`>Kp=Us{wpfSF3sJ1V&z$|aKY0)0Vma;!`*8K)qE;k zf}nFfAlqC^S)>0Rtl+6qO0Md4^Y3Lf%+p`gv3DKOSp*KNJ7elR5R7W~s*mU9Se?6c zICE~!LpH;%^}$+8#%<5SSNewCB{#<9!U%jbGaS*JsPid%%t_&!<}?S zDhxO1JH;P@uGh~+1#}>Nr~z{VmJa((<&K4$aVguA8DxPrAh^lwN7Dx|3?XHXhK-B8 z_(Qx|g>8}yxHv3Vm1Zm@5&k7GQ_!}Ta}rY{ck&>*ki9yjbW2{28Yy$P6+IMrqmI)~ z2k|?1AP)bU`$voSp_U1K&K`XS2~pQe=U1>6)s`(<`{Dcpw=lKO`^I#*POx?P^NiY@ zQHhjtlnG{Hf#5>7SU_A@iJR08SJkuQoO=m?knrCdOGXbdJA>d)HoC$ZnF%ik;}b!& zqML9j^W1NIMH)>#5^XWEK1Zyo?-bR98LG&Bi=%<+xBBgmR zK^p?)^g8eU?(E6KaWz*(pyM|;S;X4RWeaa@#ZWm2YlK!SMiUANnZ_d52k!3-Oni?K4ExDyYG$5sOJ34#Tn$9we&8|$osg(Pt+ zY#~B*8~vpFSNM)o%KTUzw#)AsT1X=}d~4bE>AdVglUf|4u(`8o+ix;ne~1O%Q$^D& zrK~v0!!?|J-IFi4kexr+z-Q2LAgDf;Pe_|dc0H|&P#)!Ed_H)Rb?Gh4@7TyGtz3u9 zw~{=RlB~%jg9&u1?DYM#j$d9o!JgH-8K+ zoZ6@#q;y}v&G#k8fSStsz#117=V_^?*uIF~ZaSmcLDqa^)UVri0+Th)Dq2TdIX0$> zny!8)M-~(}g*_@)J2T?NuFX|mx0-KoWCeL+2-%C#r7(~B49x0NU+!7tt(3Lw=Gm~` zWfdQ!Odm3%%e)7Ry)L22?81Eb4Ydu_prtw=u(ww}~R-ewz zkeP|wKy$=eg8PZk{c&4D6Cx~-!{^YA5Zr^J?N z^_L%P3 zXV;y#*wRw;Hz<5%1yB?r(a+Y80^m%Y=lX>zLLP4f z#&mYc_A}gdU;8S)=eTp6*wOX-v!uzeNM^;!^1(<@y^5Ol_F%YfZrS_gPw*;3znn8J z`RD+~fsrsoN)KIM(nXatG9IaL9$3tustT@GdJQ-;fDNr@Bhdg{& z7aLk|%(TeWDdx}8vDspUUrH4S78!}OOk zT7IW-1OBr@X_}*^*yq^XIxBc{>^i((`W`pkaPD%UBBp2xlYX}0GHX`3sGi>`;2jWm z+=#;n>&9&jypIcyvm!tAqpE>Y2bY}D{e+)gHA-l1Y{$Ls`T=zD2@~MW*8Qc>21c3bm!u z8c8SxxSLT+$<@N|icLF7$w~MBBacrBe6%^LSpdM@MaOMQr}Oy`epyLsercc_UTp{dfe^0K^Ykj)T)uTE z@yxMXZg4hWVg0N4P0ovC!SsxsVEn`1ZpxhHt%|{$FI1yR_|!U&@&>=qbe6tveYsf> zOx=Y;xJiVe%rRd>k52QfnUE7J8iXFSDL@x^h=0-|<=HE!z0O5~;f{`o01a9j?;?k+ zTcWYCxkS%^>Z(voe<}cB>Jh2r+@F=Nv|_=3eS#@=w=ui-5diJWW!sI)wMPs3dhf;>E+7PShF6i71t; zkY4bbUaHchjKl5>g;t$&+S2yB3=AsTOtRZLvr`;9P^}HAsHuyP)SpPU=-oz~ZTUiY z;+@-o6v5}jv=5H5^eyi--kQNP@UaTk?{lR~t+M@0IqwC>3i z&ecOUtPLDCQv1JebXHZvdQc-tk4b+sF{?ssl-z0-?ZRpFiX`F0=Yt&Ww9k!@uT-Ie zl;dR${!W_+g0~qKV*nc0E*I6`ddDW>wJmwKh!{h8sD6xIndV+QA-JBUP5uGGxW4%- znBoT(go(E9`fa|K29W>0AAvac1#;6s!PmsMvU$_JLV@sk^9NS`c#d5x(Jb5LCeufq zylcL;5sJ|6yvxZS%Lm&p&!vV!)v-3!e`Q2ySIhI)OL2s-C?meeW_F4(aTdFOd*j5e ztgbMog|dXxhH3eO2#2dAiosQ?L8!YdH9gjCX_+7@p0aVi~-kzi9G% zSX)bS`^{)U!QR`w+z|z-r<#~+L;wMIu(v)#pqTLPqusS-J@9pjVL%v>=J1pTo+c>? z?e5>WhJv>;OOwfK9jq@+ZTlaL4 ztc_J-rchZCfy)CsUB#Dm;^6reZ*sY94J+$9y-A9ZE57a>qFR@)g(9~^9^#@FQQIp2 zs{M;zI=?R%_%xvUyh;=|f*?|}ErAMFc^%lN#Ij)W{E+Xe6r^nQB^UzT0M_a$+=!}> znrr65CEAWFxgW9bcrSg4(EDIt^e2w-?&EkxXHER+`nVXx-3QjT#ouJP^=< zezv3GDHYt{?U;+inVqlV9aNd7mwtLx=p*VHbTetR?^jG?!HU$usw^(6)Q#wVmQ_#S zpZ#QKLFR}cl>3z=nE7&jK`W647^hU&)#K{veBIyswF%BcEkiswIBdUcL00M{^yqhF zP>^C=MbtX6aT{uT>p#~pF^M1%-H3^xt1Y?_4e(4RKxjbDJA)g}qiwW49dx>_2?jYR z)885x(+J-JO7mBnrvBW}N~_@M9URyLAr~UwG&$u1%Q8DX+oZHZ zAYm#Kley$caxbSuXlq&6RCLN+49>|)ct*e`_q313WNXFX# zg`Mne_!~kIMGkp>u|Y4}yxM%-XXQJicNHwqYunF|eCFe`{OHKL+PdXNo$7VFBQ;u; zwnflH>!vRrG`t>JY=YaZlpMyYapqXJgdja3J|PAhihNH;>xvg&&WCo?lJrL=*j9#y zDJ#Eh4OA!o{E>pa$tjmxkFJ&5`;EHc2TtCAH%t>aP}JSI4H(DgOBdVah)C*40nmF?(%kMMD0jmZ1#erCxDU&}z!-s#1C1ZLkPiHko@cKFza+}WGRXKs@jEWCDK0E@Apn547xtbb8SsG^`) zUWV>n&TWlQMPL&zvP~8{hGQLvdsQ_xjfBf>`|q&ol)m;lJ#9ExxJzO&TF8(u?0k7~ zUcI}NWHFoih#}Og%C@Lpr}CXmJ-Wd2vgQ=b3OBAvJeoRHjFZvc{$#l_oLdOMn`%cY z&h?z6>{^cs%qW-#RBClf4Bu-v0s75-$6?aw(E?o210Y6y2AF;a!V+;4mQELd?Toa_ zuJB8-&Auum3iT_PSAQcpw-iCgTaLv^zAj(hvHs~{~A@6Ln$qR4xpTc;SY>ir9&lZE|F8ZDA>1PEO6aZ{2^Ns4*ax|;zE zu!^-fl`Izj#0-04UcK!ow!VpC%(x25E=BQgi-eE-r_u-;6)frAuCcr%-9G()6XUd^ z*yajt71@iSY#QcH<~0JR)>Aq;`|Q=P!Xu-Ry3x9yKKm2Vq(>{snS;fqe<$a3iGAHX zx)!;#4GmL-n8ee04o=fPto#CGgV!`!Xw*-ueu-$EbkHhHO17{L;M?J_KaaGE7pUrX zml^>3`B><5nH)4{ehU#Yj@|Tn2zp7RXcd&p`jZkI4Xz|UV z`=NGSjF~f5YuaoaK83(73^n17{W^vv^V!#$qG)oO_FO1TQg5#}asi`NR4LPy5w4L& zqsv0hF18!s@}EWNf0rN_C+!CD`A@5*+P$e0;N~JUaF-Ni6~lvnw{3qEnDOz$8RL*=S5bD!5@W&Yxb&Sg!h z=d1M=d>=dfDN?PYLL8IYU1fQgM~LKkf|oG!M|9Q+t1N)hWIwgksuW|mye zm`FDLLjsd7)@l>O*-9A|Ldduz z*>TCWT~snMBV;Qp;~Lr5$|ieWT-UYN#kKeNz25qMAK$-!f7~8Xyx*^J=JR>Z`F(1e zPOovbOE;vEsZlAighPlg^TMlOLm}aG+aUY#-ao;N>pi40r-2y`!XC6`gV-3M6tLBc5 zp3a=gr!Fq|B5R!E(#Z6p(}N_zF&t0rPkXj5{_ID0fZk*#8aKZ31%+F`hqp&fiKP*I z&zmf{ILOR-2go#ln|G?o+81=kgLx4t$vseqyT=*7-z4{@Dq5b~&vE_nWNWCA;+=xT3|C@{nNfam~uZ zY@coxTSlN>GORB}qF$ygSoeR`e%BC1!Z%_!WvU!K=>TJ^;-(=uDxYFV& zt#Q)r0z=G`OE1K9`1ghg66c3*c5W4uJ@(zd!*Or2cnq>At#c|vx*{N)($%oK_zTo` zkF??X^c-MLyUrKSEq|T>-cnru?tNxZq{M$zS-}ap(p@S9URPN+M_va^ARSRl@~#r| z{S9|PXA^G}$<;PmI=;HDWi83ai`2$`q3=id8AA$3Z&Q1!yslT6^ znp!kCvqu}tspQM<=m$FfZyaJabr1TndwWEa1#C$Omojti#X4W^Teni%k5ynl<+>P+ zT*zq+Io+Xc{mYnl##%&rCd5{W&{;h5c6 zZ*F@&C|Jy9-R=qy(WN}2O+t~wq<(s<`4uBV{YwE31;#{s7(U{|e=bwqDF+v0zRT#- zINrln4^-wVN37C3zb+~I*`0Qsfu!~@AG{*w8}DxA~eH_pvv zxOtfYY4r23zOHEwpOS>r638r)u-b_z5koBA)~eb5XltUHQ|W(HnDkp6r54%s*@vGl zoYB!LPQ5<24>kZYGLIq;l{&%3KI@d;{6$4ejT#MZ9HypT-|Q3g><(9zV*GvJFC&!& zTp6kTjpT*?*1b(~KU(0$1O#izHrM zku&>^yhlYR0l6?cBUe}p=p|U8J4ctgW=&J%I25iDW#pfSnD~z=G&x#^?N^2d^&3ZD z#w5Y@=49^Oo5EtA-ZKcpv>~Dl#|rMl$kjFBimfA&D_2si2LD_G&S965CL%W&S4_M^ z{OLM6fTo@80#jmM<(S3CNG5_|WFE;>Otnv*}#$Xh(E zQAAak_#>6Tu}*CC(#m_ZZOZ2T}`i)LeFL4m;6K^Y{|O^J2b%Y{EbL z2@btM*tsUN#2moXRF0N>2uko~eyh%+a)^innTROTKrU$?o#4E9-F|4mx+b_~Xh_F( zuSEv3movtR2eX2B=k?B_GSC28`smwom0%$Szt^A@nu&vh+qq_B>BDu7ZXF*H5NTY| zI$;U6FUAb&Dj4SG2bXW7O3%liT7d~MRtJN+OY4i0qTp`9tTjlv{n$jp9Z$SR`m=m% z{1>w#kA52JQ{*$o@`Fwbm&IQ-$jM{01wAEScpgt)W|avF<)cHexd=f9QF7k((EN{3 zs>?hJ!v(aDJH_%@kUglHxj$#xO~0cZ&@rDohHt($K{ToVqq*+66cLj1fcEIFkU<8S9qbtEbCbwA#ckIp&?fQwvL zmw3KvpYpoedapSUS8RWJN`ABA;A28q3Tr!NUF4sv#l>A)pG^)Hujrp;6>?1hW5zj^ zfauX{2DP&~&Rt%gMQG;;crJ(GRuG}_@u_Dgn{=g1cxsGc-6w*<_f9$r3M^*}&SW^p zpeYo`KZUC25i@cVnCx4c&AQvgbUJY3;#z`i z4(OKAO6vB+0M~7s%`$M~{}M;xVPIHb@Gr}EIoja_95S|{fmV2fhy^97=q8$V*Qsb3 z(ufHwK*>Fz^DJqm5|_W<#~@wUvQMY1!zMT*j=cF?zOf3iL=kseNqp3Y_-e_*y&n(* zIWro6mZJ(w!yh5DJCwn>%35tL>*n-7W4FfyI^JAlar?Z>gdxs+bv^iSmf2kv3Gai| zD=0<1Ika57g4z00@GWr&KmT5TexgP&45V9}cPr7urK!X70x;waN)75uHn?Q@^P-+d zJK-+qoZgMqG-Aj#yQJN9(N?X(y^;9xzmRl>3Ay(9`EBkTdK~Um5f-AhC9gWhX0gaM zL7mg?ug`vx5BbK4)-TiD-zFh8%UWaJt^YBSyE#CSgeqn5%{vo7##$#(YL-*CPxo-3 z>D=|yw+y_ea4WCgFYYr>?$|KAHJhODO3UV|1O%> zt7Wlyh<7Pz&d8c*iVbX2`dqWzB;z2g%fpv}Erp;`p_0BO@rXO&a(b&>P{8TVuGI#O zFp;UdAnfSTC=j*qyn+=XLk8BieEzDvFlN2IjDM!U?oi4(Up8y_uDjofP(>}ZeGmZV zWrm3BSGsKrM9~5ljsA9EI42+r8@`0Iio4vPJ2N+LcJ$`xxLK`EE|P@P{;{^!wY&f> z0kFksSc0>HCu%%3l*AJ@wT&er_>P{b%Q=k$pJ(QGavEz6h(DBifL$d_6fNgw3mLZl z`dZiSKnC@~^ENs4&a$+Nwmw4Bwv+hd6Nt{J`#_sg8Bawe`7MlCxl_e2tF7tZ++5Ny z^UMLl1GYxn*v7$ylB)q-VJ{CRe(k?+2csZERIVFbZ-i`DV-NV?>I)dODAf%mp>I9LB<01@a5kI8ZzZu zPnCMYQVDa7dNx?#!)2zWX=P#E)A!jADov{oK#$X3FV@GRcKmWZXW^Yo!GAroPPLSF?o z%F8c`2)S*SF+GD95A>lz+gEz)o0G$Oqk90(vH`{hOt$q&K&adhs;zR8Dt(^VK^TAQ za+dqHgr;`Ky>6u@276z+KdF0f8Rr;{&E_k6C|xbU9D?ku;DZ#EG(q6}S&3@R2VHQQ z>r0;RI?r+Rw1c<1m=ZUY8`!?t{cZ7bL>#;)$NKsA`&yy|=O8xsxr;nHdqKQ$E+zpE zHdU+4pn+0x!(^QgZFhDnFSu(mU^XX%WzEOWJOj~=Q!nv*)mUH2t@(=1_QYetKD*WM zSB>^#8M{3@-MvkL%A-b!nEg>-=)+U&vK-Rcb&D~PFtOUJBBjLcDWFQjaIcSWy!sn7 z*NW21w#N%=FVxRBl{jCMUE~*Lhzz8tZ~p;oHl@U#E+xw4!j0xk8lmx(DN|ts=jo%+ zlFr3f?miR^%swCc!ss-R8=r55D5xi`PVms8y-M%b zT|`d}1a_)R*K(QH-g#jxIYVRH#(C4Yy4aDdeq@`MjqhVk<-qJu7fJ9l_DXl+MLwwT z7>xIXl4SB4EH6Q`U^tW__C?GaY7Hge^1ew0xkUz)OqkW%bwU>Jpv)X1sun8k|_0u zi>?`mM5jR?5axpnlA4_w!o*~V=AtUNe8=wdox_GY8Oki8Szvl495dwu_XL?gR}vvN zvuZTAt!==wNyjW94b%rH15(Hx+;2_P7dKyc33o0wOHf5d(=5&-({cF@wj;hAFt$8X z)6<7sd0=mRgRAo1p0b`Zr>qZQdS_+wc#HEP2rm*e8RZJ-ebk;v~l8lX@PX&%?|Dy~q*q$U|hbn5GLlQc38~XtM)Hi=&(XFrV(doPP z!B}Fqn9M@%EPMQ;W=6&Lr>AKL=)C1K)_(k*;C}Y#bYX(+L7X5T{Mham4`m# z@w|%?$QO)Ko4B(v4iEhWddlvdMN%IkfaNP>bj4=P zHOS%2Bd(iSIsT@M9*iN3jdm!Bqsi)h0C5_f%r~o6{_%ue<(2eB$_m7<8Y)ra zr5(&$JPQ#S$l)>yp&#b6>PaG?6%(;H?O7dlU%*mIY$C=NGCXQ^K@ijS14bL*(-9DH63q}AO+B=g*#DmP;l(5 z&gqt0LrpZvTVMjEq-81oR+A_!Yc)@*E&rQcqex;y3Y2R_s%&mb^XyOXQj$BUM1|1} zpq;gd+LcMN9IvHKy-^`Cx^u5hR_%K1p15v}D}izV@Bil2v-g_}(Kp?K>@nZI-<)EJ zt~LO$m%uKO;;S~qS#b&s$Bzg2=s%& zoa3tXpAV1CsJ3;9Cv@CAYB#F7@oR!D&4an4T2$v$C!54Y6AP?vB0mF^4JL+P+h=c4-r!j9w{tiK?D7k||K2k95lqRFzn^q|6_S9!__+h$GdjKmyD5gVOHJ zjWKU4 z$#Qe+IKo7+cBHBj>U>ej4iKu*W^+9)Ivt)p%xmz&3aqCzB-b%9(sT7$daI&&3&WPO z^6Fe>^rwxL+{O$5JpicE_G0C#72T=<;#BIh7dCcz z8)Yf)`_!k4E_5#YqZ=|p&MKQ+_|&&Bz28o-kiPDyvx=~DHJz&Y%27Q`)k~I#1K~p8 z*r5f!kL^ZSeM8az}uX^DW zD;d1ZxFzeLby9EYW90mp2J+o1CwPZK^IZcTgM2IqWMDA;&q;jum<-k2dC$|5`FDVX z-7*t#h3zrDGz%+A%rq>#^TzXtbCaJtf7ZG5HsKGLfl&8553)7RTs2#y@rZ;lXERNB znQ~SnXcownGdYk)a!J3?h4AFpf|sX=!KuACdxUuuoUS4LO*i5fklaQW*MiVdqeGce zSAd*BhroOaWz_OOc4UN=P7&EM`hz~-4As`8)oUHj8dqS`s(0*k^JbAHXJ@0rST0*@5E9Bg@0_@&Z>D_H1wxTp!2N zR^V{rPMxBI@$A5KY7FP?Jz3&0 z90yx5HPk;9HakFT`z`I{PzBGS9@C;nJ zE0DgpSUCPjlukygrZVl|lxTPJ)$lq>%RpbNGk&+@-;!W9SKc6;C6Q9F_$V>9#s~U; zAM`rbpdR*sx~imt41mxPwGM{n1;QTP@I{3H;)v>z>BldwCStm$y*g4KNEmJh@B4$- zKo$l^e=;pRvrBbmx3N!;9icrhvJCZUpabK>UQv%?B7u>uc)Xw(b#7d$UMod5X!SwU z^ELiYdFaJGa5JA=y8xjpYPN4=-`SnFE*~2ND63aT%BW$MiQ!19tXF48ewewDVJS=onqKe4Zt;!m9+u645<|ao9FgT*ht8z6D z4H6T$At@;H#^JI^*sm1HiC#i7DOoM8$yoF{73g`RjzI=S0s0em#bW- z`F2K*E7ouFb1Q}A#d1wSva_axpU-X)mrxsia4ucn|hrHlFN#N zC2wVek2bm<(=JBQLwtvB2*5QADSt{~A26{cab{QiHeKk^mZ?s2*#+<`9s)V`hg`G% zo|;S6m$_dU`_vuk+bW4PKA>Bsh$|U#wV}Uuq0V~{f;+$31qV2k_O*%?wg>VLJ?n$6 zug2g8z7>GXjq?KHpM%fut6YmsZ(3&0WyALxS6RdSB9`aNFm8+Y0A)*P2FEo;tWego z+L-@|KhYzhpkfb_p6f3tfCD@daCKuEESX5g2J+` zP4;XDDEuDu7vks81!8RGs2#itN=9L_6B!x9Iix5Vu%Yo!6+WX>#d8$52_B&Wg6eO; zAX>kubBLHDvp!1k9OtKP#Y)Yhb``7Lj!WoY_82Im<_%DgNJ(S|#RTsg&#{aU7 z02^1zH}@Nk08*+Ft$Sk>2{Ll`A2aj)Yyjf>^`xrIYif1r=f0+)ArU-QMY67nEd;rl z`pKbJ)u)9ehn^C~$q^!nL9Vojlf39_4GaqcLJ@B=HYqncodApkxf`|D=V+caVwu=M z+Ou@^$>QtzvpN@6o}B6XZtUb`%r$g%UudGrY2MigdG9;{9kWU&`$-Xyr^-;*93JH* z=hl4&i|5EGwmy0R=riJQ`SdFxc?jJY?d=1CdAxKoBKz+tuk%jttLq#lo9!cJl!F#_ zqiDrGha$-LOdUQ)W@p>}TmK`l{*h58I@?c*tm2i>6|B$62}*amDdayjj;Q!fUmR;c z>4_iq?>Q&nD^<)=y17Z_$7+0Sr4hs%3WVYS?KvnB>z~}A{X^4G3fPr+gL`#V5E9u3xX9FHRz0EUP{hX=DW?E{y|RGRzt;!IzOimX zszbG2uYX8I+B{Z%qH;+-}C+*8sY68dt)m0)z;EB zF({;1;@`1wfMbEKLoU}N1@Tc|b6)i%A24F%H@&5x^kA8Ak`}R~>QDkCORhqcCKldJ zjC-v&{Q`5je*>l*veK980DV=n_=qRHRhFLCh#+=7WQcZu>rQhY{e|Z*fRS0fcM*22 zTP8iqLwNb=X4{-;8QXQk?Hy#d4XV2A?>}Wl4k;^%*CGkotKDjKzWtobKE8}}(|1q~OVQ;LJ^5L*cwD_Px;Vq%7P8o|QoW?n+$%Jm zKw+6T#N@JD*bkN%Cccwe{o}mJ+qUR;iR{ls%4nCp{?faeaqzB%_m8TU*C+H$*02gy z2_OUyT?C?f34Z;<4jA&lKy;qF=gZ|Tg27OIssi0u{p0nL%TX1605ye9#Ss&y@X6jB zHz)=v%RiL^xqDfeTL?$YIq&YsJkp0x<#Vh1O?PwMTooe0c{D#G{WJ`&d<1mVBevU9 zL=~LV?#9tWx7(W^)>3l+QT=n9`X%A#|xOru*UOLcu+-6(ax`4z@)eARL-G(ae?iocvMgA2VL7TT1VP@HC9l+fpf z4T8qGksssNp{p&IN29xwP-UPxhnX8`Gj6=0Ho29PV-8;t*&N66Bg9BO!6jeCwd_G> zcB=K9GyGKwK~1d>dKnx64N#zh&5&+yGkXBoTEnbTcqV`uc~Ex zETS0V#M$T+zF7C%52fn-{=+V+{l*H-KR3q?AE$>UUo{#{8~vS(n8fgcNhZaClYj2K zn7lO?`wcW6e?uylnqr-2SOL-eYd;}_$E^n=(>->D$wU8c0t#YuodEFX3TqZpJzsFp zota;}>mSMoQ}lKZum4iCUt}tmO10eyoI}`I%R>eB`Cj0g41b}pmwA6=u9dR10bY0KNMQLfc~JgPgF($kq4PLaFL5{^|3-OCg~ z3h*1Ja)RVTXfoag`!%bf@8@LQ=|F-@d=_w7Zl}}&Ok+sGG|=I!?`?XC{ZZUIcnLp+ zv5`1Zfb6W-bpwc*QOwU}u(B-)G~3k0Gdo2yL^KJl$SSM7o*p)0+*R3dYBK{jp}^9w-&z}`stF`UQ&rFe@G}9O~@+uurq8nW=9=lNbl`vw4+EAhvVb> z{b)TbL+ASbq3f8aXIGr|=oy!T_L9;5STM8g*0btv9#MGuw{KSoju*Y4s1GEmpgZf! z6rA_Uw~H%Ape`X2o&?r>b6sT9QQWH>S>ZR>9c9cSdsAYz&ip>W=2l5l(-S~($o32# z99m@#8!jN3{CdD;Rnt;IY%ZdH0q0ls&K9#>{1E-T^Zi&_~4^RRHTmMxb*_K3jiKhILDq=(7E^3^$NpW zz~_L?wgS)owJUcWrd1JLG@UX-H}dw&2{J}L?y3)tt{#qg8*?fhdu*dBCALxRF4MGt zUooG?l2d$qfg%YHIWM=nY-)P3~!j6Ey35U z?Tr($DmQ3_8Gp0~CU?byt~_yaxW>iowkANq_eyy&o7IQ8;t3RFp`1sz(L%S?mtGU# z9f-eIPtZdA>J!acA`GzlPsgh|nNR%6`Ky>7zzNIvS@@F1WB)~4@%B95vU=wazB?tQ z4;HN3T&9(w)`F32o>QXClBJKsgiPE13t|_QkLtk4gZyL+;D=#m7IeZ=u75gh0pMw) zk}?3}Lr4QOZN>EmT08-@OsUiZC{C`6UkU$-iYkN&8P&c5ybA@VQB>kUwocZuN0qF` z1&KlT(H!{nUX#qMVwj4U3&!KfQ#2ZDenA5H1q^A}++!ilu^-1JKQm28XOmic2POuY zvr8ZTxx|Y0+7XaI>SoisvttV6Zog?A1)K^nzU=u8hjMF78+u>b+1-~o$AV$=>S*ow z4o&GOQqC(7IAK+U)$B!dW_2j6w4m3h8?B~N%BNRT9>77z?ZRl8djokNhE$?H{HOVH zPk6f^9=Mtu5AS&_DD`XAFH1bPe)5??X7g=dXKrTZz@k{LQkba$G6!_yJIAIED)Hm* zD#b|63TtX=;)a(EkM_b+d{$QG)8jAM9YTTum=U*>j@?>2+dzLl00&sDO`Q#U>*Gp` zsMtlU&&DDuxTZ+QY#|B&u~5z;lKaU(;uDCqq5a2(5Cd!oYQTozbo;aQ$+%B#us2O{SLr6*xe1=bTs@@_33eOeK`0X{fk)-1UXpOyVxwmJ@8m7earP?& z4-PS*gz{9=dQ&-`vZK^;r1lqpZt<#vOwtTm)VK;SjHt}`($n)RVINQ@L8WvUC#zGN z8al^V(f|-V_!xPEOWV0Qm9CW+5u4T+VN?2cQTIW>yOu5S} zW%)P@CuOl`7nagF>zM&y!|0G>x8?n?6b;ko+NP$h_Mo{H81us~^%f3e{RG7{?KJr1 zb70{eTIS(^0g^|*#d$3ut__#0=diKKOvKm|6c)OaU>CfuAF+aI9E)cXV!@in90BR~ z`3IP%Co*}&M$Vz@`gUt<*fPi(jxk$g7{Fb$WHyP)gV>;hBQJwP(5uu0W;?hSBJ;G= z8i6Z@hxMhGDx&roN-!#fs)hv({mZ|rB0_DdWT+k2@gR+V+H?IhU}E)ZbRIm36+K0Qy6fUBnqf^s)IHaSqK*&YZbq?wL?Ic<7;(D%bw3CKz zE*7t^VPXLoU-m5QB^++;$hq8olW);J$OPyB!2c*&1!8tS&`yHM*zg$-=QE=%D?bEX7b$Z3s4FjUgrSLDhUNzd7yi5 zaZu}sp@bY4NZ(>2iO@;u>O^zz&5Iqr42_yWa{JX*kKz}QXJOY00T#UWR4o&4c(H%I z*v5KJWVH9jYa9|25NF&r1o@&wZwn>EWs(GYy76z^RAL*Nd5XbgMdn%l_c)aU_o&ZYu|j zb#hJU)V`f@{jpWUE1PUWOna&cP`fN)DR)ib*LvEqU8&D5(EP{7e-6i-YfK=dC|}Kh0)$1~ zYg}`!@l>#81E+m+yW5|O&o0xPa6x5XE*uu=mMioA&-6)5Yp(+b``m?_{><2ml#6OXAzMD%pu0{I6&;{8=JFV6nGn@$fxBKaHltOJ$uoS>;h zFwPv>tmB+vW}AWqUbdiwwY$@fckM8AVA{uFfPnD2Z^J=Eoe5NxG|o8iK^)e?o$f>` zwU$6MhyF^4GVIa_D>P2u+`b11k3Cck5ur^0CFw2=xBj-h8*0ZsRU;XMrNlFQm_+U0 zX-iyRXIYpVE(+LvwVQ)CO2i>`dS_vNd_ak}tH4gn;=b2NA>M=TL~cbQXPgy%pI&Xn9vWmZl2&Y5Qt;em3B>CseE~$W zkIH*Zl7f7KD-B#e(?hXN*g$hlnfT$30We-7F%pRMJ9o+)B)f)?+;;%;Pw;&*O)fL5 zD;5}EpnHoj9ix@|g{JMpp_{S$>+7E3oYT_|Sc~+8z8P`X%{$*XQJeiedBki$T-deu z=zM*fARUDFs@5sKv1lKK-Vym9C4EES{3THzKuBU-oU^(;*Xl;Mg^{H{ud3qMNRvCl zvR2%iU&;;E6dx6@#J5!A(pNPWPvr+St0`>WyXhM%<9X0hp@p^BbMD;)GzI8-PSKUu ze?RkQv@A~wq{IW9PEr@EY8sUqpi&3&!5(^azl;d1s0AXO)VnjzPsz;xA5h+1RO<{; zR;rY6)Q66@f4;8L?8%oe0o5})PXl-jVSnN{5jobS6z;@cyF)0tG#-fo2WHq+DPa{s$r)k&jA3U@iS0HdS9e9_Jh!j0o)gNFP=^@49l=z7*wZ4WQN zmaA54ZC(X}b^&LC8CPo_fIj(rJ9XgjyvnnWxA>?}ovAH-VpDRRnScKLatfF!*GybB zpScjwpX=n)oBD^#vvT9ebAEva$yL_S!0g@=_#NT2q9piDPygEHdZ+lL&`I}7WSw$} zMMFu})cS7W1WpqwAOL-C(?U06bgMm*nf_ERhSA(`T(4Y>Oe7Wxc3?j<8eX|HqpYgh zyE_}tqvX0Dzr8Ug7XpU=wgbB~FuPve*N+{2mm_iLZ7f$T_I8CMh_$!t;tqEEP>ZkA z1rCNxbuZ)HpfUzzXXOQ@u*P5}H1K7M<_T1?`zhjZ*rmj#o7{hZTh8`z+;8gK^7XC7 zQxNEUdwpw;fq1HkW;?#%6KepPPgnT4Z076^l{mk>WMHrGvd_A?mtCXJYbTR`WO{4l zxBO z>2Z?ywe3YhwPB+BS~Mt_|Jy%YYF9vYZqAH1(Pdl=+RxGW{VIrC1U|aW>i~A&@Fn1L zdExK%-tA+nF>pZmHAPk1R4%)X8R578)Ln1AaP@&~^-=#)BuLsxF_SoMkQ>V$44z$f z0qpLd_677dH-J}WX+4rT+CKX(+1M^6`@1jy#kq||M_5RtT{@*`@c#kbUV2^aSSj`1 z_rhCwzTYCd+kq`f>iyfU(ywW@tsyU-Pc531#n-hv#lT2hksyK6l=Ic=IgSqN!f_5W z7MSe>386PTd7({EAm&CYlQWAS`W=g~7-FbA>~I6Up?NFszY!$>lBM7|_myw{3xsM! z^IBn{5FRy)#vJs}^rx5p_jYKig??ir+_URDf3hy#@!`X&1dp`~;(*x$yaECCPC#P@ zl>@!Ksz(ngDR)nnohESo=NQje835lbM;RsayP{;Ynpg z#1-iZJ^emCL-(VHu^vqzaLs1%*rK1FnkvLd-fGCwiR$djZZ)&S=Dc45x&>72MTCW2 zvctj49lP;PqnWZCNxymY+L_57_-2^-H9t^vd z5onB^eqU@TUnuNEKmSDYK@vFt(uPTpdIsq`JSD~`Is}aESsjYLIySLdtI{-)){5VO zFw1xV_XncivjyFIK;{ooEM$KsgZJE+6Mk~&n=lKI6ED+XnQUJl+BTrG2k#^7%Ce;z>RL^76*pHT;&`MkQEX|$+e|qecF#cnDeBQspaibvlO8mOl_kv!^pq%&Se^s=# zC!Ht0EAciSZRq+`u*}$&t;Si;4n~gPi>}JP8;l19-?=Vqpz%t*q$rpi049w&1GV7W zw)iF}4w(+Z518)ws*9PSWW#e}~y!BL(_{T~p9_!{U=@q>Jn+#G8!j-;_E zGc|oc8$%=P?HV&wE56RM7KYVrxXmx12F4e~qrFgE33FIiPro?6~!ABhY zKz*R-+MT(@k!#E#WKcASn?^_;j zVe%nNR0rCearz_GA^0BT5O92)sC^zUSQ!NpuH?yC&{6&dMYhl+?^R=;oA*As(aH&v z9x5u=CNK~|>9C69M{Aq&5R$HE3^3br(BpNyIBvcm&N_F|i!evZ_Y=Z;_>S^$!8Lx6W^PyZ^k2=ti2q^Aoc^uPFnZ$pk- zIz?%06O9CGz%8e0c_8g(J^Afv*gqydxHEG%u7W4aPZOQ zQUpMY^JKL_iFoMqle^7fXY2$V^j-26JOIOI3+T5}=-t%UhR(Q@m&F#u`(L;O2rO=s zMsBAh_CR^?8=oAClai!M7xC`&hPtj!LE<}XE|T0pgTTy_L2V|lL~_V)L4SQt0Sxf9 zyx!KNt30mf`Tb!hV^d-I@`^7UO?a0x^CX#2PjZt^;Ps26yN(<|n7 z=Zp9rID+fI(ftkW`RoV-!e-g4I%S711=gq`vPOM#h63X+vuz>h`@%(=x+|LoCnOGY zMlfOhKY%p?%-+iM#jRTNYZadh_iNq!c*@7Q1Xtz(0?gp}F>kcdRyT;Ia|oc*XNdeD zooi>a-pFn6R}8qovzLBCxT8NO-5K*9k+tZ|yR9I6FoHCA z8U860NzfS|x|&(;jqid;;=beZ);x}M_k^#&VF@XgsNgEuk-;iWDUuxMs?c^7z_+e3 zlJ7zoXR4gA&PMy2E^^q@UAy(=0og;{piRePM-s%L@d_@QF9(@5ultzIYspogK$89( zOg8SCz2XJh#c)umb7nG`&ru8x4pg=e5({1=#j0@$4KqpZ>PI6*E7J#YVCE<7YOq=I3O0qfv~z|kDU&yf-=HItZY-Onqa@sYae z@Ihn%H1uGod99a%BCM=-SnrQA-sh4Ylq$wwc?+txYW&ra8xApi9s7{_v@WsRd|C7HKvL*yOnlpEhXdfHOw zc-l5<*{!_9(@gTzYo`i7hRHzG|8C=W7Cs9dI|`(r@Mj*W`_7_ZI|TT#zU}#y!z|1R zcs^ZUC=E&dM|YgyG9U(qU~(#`de&I9)a=|q#RVhL7j>LLQ^pc!h&?C-@?P)=dN>~H zKya1hiKr0Yi=l_qrT@Rk#=5{|=`MBOKDZd|DQOP@@Eq9IXS>WiZmt!4z}x%DJ|o+izOIDkFeIz zQ+Fmto^`qPx1vIK75F z4P8}Ok}`Bv_<%t!RoXfq?6o_4vS7e-f`(jCS%WaA?LJuK^aFd)Gq!O1ZhcY#+ z%8OY=Vir(-bhX5x_c%N^Z3OJubAy^wSGJ@;JPL!Ij~2?z0yq-TKtdX7^Vl%NHh3_& zn6c0d)EbbNq&`Px^TK$2pcias9t%`Lsy}=Qz`G-5pnd)#wZ-8ba4|U^@N-CytLHwu z{ro`)ll_@RGgy5qkO^$);5^W7zOiuCv)s2RZuZR-t+t#%xJ4wCNL|}=ci3x{ zb1RLr>_pxYwI3?~5V%x>RrHyYW)(p%2JfM5{6^J7S>H?2~6q)}r~w za{d5DURzgM(7RJ4ImMbo#N9dE;Qis*-+8xn&4L+4m_M*I`QjP_UY7tO7nliAX!1PJ z=l0myT`BYUZn4o0Gac~j>Q&=&AK{)I10ILD>0qf|93YK_zV499DCxbG6rFl^J0mT! znhXf36XZYuD0L^4rd}ODsZ&1&tsEmKQG?OZO@Tp=gY?QVKOJgteF_HHis_10@zG(a zs8HE$vFd7=U8pTlm!qo9_VG(rlpEGg2Mp&j zSv)o;7xwsAWpV3L+EYTPQ{e}G;1K#fk9_*Pz7IgJzwLyEE>!}W8;mY~*qRTh=B@Au zjZFW79OTIp#b><*uFRMLCu*wz^ubh#g8nD;xJy7B>+>#wGQ2Y_3jmk_4QW_k4Q+ot zE4~aEFsLBN=9{d2Vg=>Z{>V2@rF7s2FIZU(<;+MCfmH8Di|^~2ynTD({XH=;+jTf< zNrt{Zq}%(Wu@ZQn;QwD$PwS=R*kmd>I}0?8p}go{^WPV}MXu|d^pD}2v0gwUVNOHN z7X#OJK=+%_IWN%k4;g5OQ-zpwfB1{^43U^qi|Ki9)BfHG0m>9?VXSDDqNk@*Nbvv? z^fvO* zeb@*9E_~`ioWc)Su9sWo$+s&mRNlL^75FnbxAT>+F&FErg_%XCSr>^l=F?3e->=p9 zSmMSkXw_fCi75b@2S&ws-uI+)Wl!aeS9{D95Nzq4+rsOJ^ypyG%Y@ z=jf-bV>s~_wusKmY_2+!c|a{+sQFJWFU+kepn1x-#xPaS5X`H}7vLH;I;G8IM#Z>v z(oTi5F~P^_@;M=(23<7+C6p=a(odY{TbY0Dg%Da_wLII(B(E%5E%)qo4htEdaDx3F zwiat}}m49%_462I6Sg=7R(Ib=2-=jb;H?Woy$g<6toBrO?bZGs!WUT$c)w~;Yp?BL+wYTxkpR|&gyS4mmf z6T;z9CaItu2qJef;rg?moM7VJAuY=xrtR0dOnd-mW#Me@>JTSlEMcQh~*` zbfT?3c;{UnoYFBn@`IoWO<#1SZYO3z%hlv*u0vZzkc`Trl zdI9Mp$7WlHA>o3pn%n|Gtit{J3i zO8dAIS$>ETa9IP69Yhu4KjkVuW6K4|xjjGzB?vC}Y;alNqE822O>g@sfWy67YoiHE zsi@G$qp`HkMX`#erz; zq!^Y{F%fp%s&p^Llh~{5%)!day4Q}Ex;}q%hCK)LIF|V3;cn%-c zr|~&ZC=5EPIhD>j`uJ0yU~^p$DTDq8oO4#g4@3bITFJ$}r@Slp8}hft)OG3(#7Ug{ zMgsNNzZbS3cRj!n?IQm}R&S)3k-E?V8)Nn^moPf|BR%RsCk#21$`}pWoqXdChyJP* zmSC`ER#f8jxCrmdzWXU9VP!=o-g7y$RrRWjib9)=zP5pfKU>A|GFjCA&gAAyr_AB% zHUP_wMh5Sowi^-8!V=sUn3izZ%bJz2OP_+P`1hJ5tTwjFtqLvHMNG_Sd%v|zIvms{ z3mFgp5#-sUr~X{Hk?V;)&7OlTUSI|gGtexL7~`B`(w;LXCM_fz>(8CP^owlbj`J9m%447Y=3Amx{jIi zz0-CCo8I(R;rGkC#hAUS@&&1a@a2r#iGw78^aS^x%SU(=bWh5&MtkjOWJKpgh(wl+ zrrS~AdSE8hr>Cc5LZoS19X(~&bw>6YD^QPI_&a~}wxf_k{p?2mP>&i)5Zi|5nk z5m6xvPSIud7X&?z<|ZA)XY3Wu>+*Tk|JYSIm*8@AMe1PZ5*nAM1Bb&ct*x-b7Y63B z)ozN%&a;)jN_zYIQw{NlNk?lv#9=MC@sUkyvE|`J&i;lcBKvvYGruo-5)|Yaysv*i zk(#1b2ookDE!+#Vw$R%~rC6=fJv0Q_5a*bPZ4TdIspyqYDEi2k(HPa6^l<7Vpvj?psO+N8XrYp@BQq+DfEwuhl73TpX`1NNWb{Gmn_tMtIympEkfn#iip&wakb%-;&d z9~N(Fzw5WheIp^6LN}Hbl&RM%ImW1Ya9XJ&#ZDs2VVs&THwdiQ*OE5(WI~6BU7?E* zmhwc~AZ=vi+IoJ)h<*?Y;J(@$fc}FDx;fh`qc)WimX?|_vUASU5?`wW(q>FsJIOda z&g>0utYskp`{u#2dHn8Y`frJe>0uK$;P1P4V?<1Ta?VFoSMpCe>f(ksI~JfaVtx0Z z^U-3Obv`DRYxQ=Ry){oY6_sL6odvo$MY#Jf%8ABv3Ol`mrM^1_mwxecS=hFvoW5IA ztk|TteadL*8V=~)|3}$dM@892?W34T2r2?1rAUZUf=HLBfJm2sgi=yNHv@>Il(giK z(k0EnAR^t}3`h?#bjP`$dB5+h^ZVnhbO^T`d{a}26NVK5RU{$(VwBI0eO}OU5O6vIRi}M{isEb0(3v93GvcySy0tb7wV*@ z)Y+t+4(EA{9M-?=*R2zSEPGbm@POL{UY%C>|VH7GnEIH0;P-G-=Cs zj!6ca@2Z#dr2)U%$O;Ad-)^?(=zZE{9v+@Os|(j^j`Mbxcu@!2+V;vOe#ObV_b)5! zFw%Tv0<36nM?OR#Wl=tz^VQoRa+$ap1R$Z!WJ8DW1!2MGPp1~4Or73ATMwid*;xrz zy0iRH=*fu7-KL@Cjw?jv%&gkkJ?78i$zyeo5^*Bt`gMd?@Rj00@duAze{#V8I>|(k% zss1pe@ND>>Xh&?+-3eDZysc-4t==ALBZGh&Q&rE-&YnqW$&!o9?(BRAvJ=yhLXlh= z9nqPJ;erd*2>VW@9VVHReO~jkpIuKlp7hVl%ssC#D{EE{k^h}n+`P0SGh2K)_4_t= zV&QdZQg!bqqLhFF_f)^k8*Tt((Slt2bz-@2v=c4gjrbNv`;HSP-$6Tf6XQ)Aip_{t z+S_+dggxr-5>hSoeGG(i$8tBrj7dR7%P6H${5qt(0~9=I2|x;I(|za;RElLoE8N1^ zvpseUu}@S|6Q3SPVAO^OlHdm$B40U7z>Ps8KsNDG*@_R%nM|8SNb1-&a;};5#cQMb zK%zjeUTJm2YHjDReB?vsh_2qxFfmQB&mh)>8T#CG+u!Y+xvw_tndgA$fv(BA#bg1P zM1J%B?i8|U>4mm{z*x=RK03RCqd#T}d$9T=eQ_m?6G7dASzjRt_U#I)#`{D`P;qlA zy#Gf17Ts<|O0+fTve61$J4vOIu;yEL%cB*9i_puu>OKPUaD`_rjn>{m$9^ZG^dvF) zIB;}Xss2pO_lKNRI4J6IT7brP%Z^%_3rj1DM0nCaAcGOi6sL!o+0@)sz$Gg!a)QPj zNl(A1#>9znf7F4OzHJ`YDk`(cV9c=@+4%47h$%Wage1G{1Kl29A?kyG0KU^sNLF59 z)vKMw?&0=I4bvvEY4sGIlpfkT@fJF}s8C^B6qLBi^tXneEzRRGf=Qm#jtAG_{*>e- zRqvFPQXOAx3@6upMGvRu@fnwBE@Q zXEXNNsQy*6WnzNAVPmO0xuGcd$QQnAZ1&yhME0)Fy6cs$!Aak@+`LR71hgY=$F}ZQ zrVT><3A$tMlhJ}oB_?svZcVmg(iYR(p0X3g*duqgGdp zDNeC^qmC-r3l6PJcwwooqEhhnV*{Dv53x8%!RNXnYWNpArcWouoD>_TbEbdFl<@`&ZLK%*pkMC!pMZyMp0|ICN3L~9l- zCF|t|6W62M<|?BQp4PvQjwp4x&1qEx1V5JJ-P3w5cge;pV)k`J#?QqsVjrl($PYLs z=n*|E_4Ou{@8bCj6WRk)XW7oHwL^TmR{R=)lAi$ex-yP2jrFHpwDxmK=C&& zRtQ9n-;Y3*d_fW>T{uL~3;x1O;%;z4tnEZ$_Tv#57CIIg*Ui+Hp}|2X8dDgo?<=VY zSWUa~cTQDF$)oqhhUcb|jL4LGkI+HqLqsVkQy(UbypxrcT3*mN|4A8pu0|?$+~QGr z*8507I^z83Ddngu3Eq}u?}*=RrbZ?i)vDVJbnwpZc&k@H(q7@ zjf@!Xi``lNp8xJ8uyJt<$Dso2nyWoesqHR9uUSS#DZZfbCpo{4-x9nku&`bHNeA0w zmA-jjkYs{i+u0tM)}6<43hPCHi&tJ)zr_sy1^epVkRqyCDFMVGkrkFj8>L{m1Z=91 z@_hRj<4Su+{R=}rG&SnvQIh9uQ_cJ;x{Q23>A8*fnA+hvKHU)fKr9VtKl929$Fgi&@7IUyVu{I&i#M?r;;NnX!x^ zG)mmd6>p+L2D_W52(KfL;k5;Ik`Yk}k+kMx&z^BiUvGp`tfsftVFwQ~&O+lp*VOFO zX-ZsvYx?jr7@7~%I4MoVKdAK{c^wvWgFQ{7f=hj0n9M<9j_0gn(!x=`HZc$G0-sIu zND@E-XP%kBQL6M74?bfuEX!%lOjng9=t}NCPzy*?{r#^EZaXLb!am}^M8(O0tJSjk{X| z%6m(2XXaYM%0FPC!~$HJny`KlKuNWCXQLgrrVc+wPt$KzZ^ z{mu(Z3s3G6uBx)IlRmP5<$e&oAAqDUcy^Gxn-4JwE$ttO1-#-N`h712lPl z{!O=^=nPeddX1Xj76Ur^J45Q5rymtU<97Aeq&)9l@hdu*OG@Y-Q@6UKSKQA|E9fDh1@0jRQYz?As~viR{O>-fXlFrJB*K1yJeGK@i%(1p zO?-tOK6v{+UtunKft!b$LCl0s*d{eC?SsO_*25%+Matt-QBF>ctVDNjx~dBpP*0O+ z5qZt)W5REWA{1C?J%f|=j`>8k26vv&tL2)iFu#pZKQ)M+2A-60g^1TVJir@xMEE5fe%UnV4OXy{VByBT6Va9ndP%5;y1##!OL%$TYw*BtfEWls&Z(W;P%!A+`0FgYi%z}Q$ z1@lPE1#=ZEHv>fDknaHu}^^BFZ5)zdtCNE1LQMZun2q z9y%h8`5l!{^&irB&U^FSpkyJ%RB=t0as1-Um<1=O-nLw!S@ARLcJt{}7Y(rQ= zew}Y71taRKfSPj`<;Y0MOc~K$#Nb0U^1l2aJie_pD>R3V0wP9AqRqYBS z1J+BKcxzo`Qne_uY-v2o^Ua6=%H)Cg)Ng>H#j%VQeo~14TPRPVcD zp+@8;_A$){pi>m6`PTIyHe$wxgDEV-6fhE*kKnP64{IpsOa@R^lD$iX~ zn-M3aKECdk9waX>Q-AFYCWfDxQ({&l?mMk3y?NvJ_FK^P59fnqVM9w{nkk^|=qp_U zSK-^rY4|u`D8lA06=R7wpiB|p zRc4XF*k(SGP17o@|BgMk{Z-0aVP-G<_S@6Bam(*OfjN1#k-{6*ELe*#!v6W;n(5Vt z0>=H4y~?dfEC`1#@IH2I^T>?{qWQu8C0s9h_<6YO^n7G+`A>UyJYOP5!$2;x-UEaf zu4S7pcJ^RpM=EN$$tXlV_Max!>hrL#-eU;vr+}W_dD!$xvO_%7O*F}P9GWFfHpxI8 zP%rMZ+wj5@`;r!VivA|9<6;vH{>0zkzOyx>!WO?K6gjc-Ii!}2r$z#8g(Da*<)v0^(Jc5Z*Ck;^q(q2xQ>v%ALccuPMOjR=g4sYpD zmG?+ip7Ii&I6Vuk+CT8Y`+aY`fu7;FCiouF(!H_JAb}sV0gt8rwX$bSkxfgwYu+6E z@udgW467{Ve)bzpEx&5tCopkb(gjkRJO;8Wcc?iRXat|rg3o$Lxj5ogT;^zX+GZS`{4(HQ;e^y=(kA{hby()Uouq51`IXwga9 zh5!129s(R>{ZEC~k$~Ao$X>wh0%r=IrV;S3PZkTzq0WA?;(Gwc5AbRd51}Gis+cP@ zsl}$B%^0&S#ccgCYxx9dyJ@4!#%eW>?o>(cW_>Xw2%W5&D77meU~*Pp_-h9_A1?_w ztlK(Eb~AquQH~Q@Y;plb$+x~|LE<-Wi5Xk>*!IRAq-wnWlicSBL=SU6Y>?8$?Bj6s z&g~v{(9*Gv2A%xQ8ir}ApeT*+Y2oMjZn#baURlwY+Cj|ADbOr6t0bxxDmJmg02sQ# zaQ~Yoc<8@>-)!XTCsZ$=5Sb$W=d53)B2;jWUJncm62ZWi2hgS8s5Kr+KIaiETT z$xU~8+DM*QdUJ=Xo0we_(pCI6zrU)^uj6eJ!Y1~%@z+Yk4LoVfMli|@;+l+{hrz3Y zz9XJ9BnI*YLw8R#Z*EXsd4ZM0e)DNe2ZD#)zK=kWT9ICa+^<`BP}-pjc&=wG*BNWl ziv&JGZaW;d1HMZ@mQMLqc#`t7b7Cm2KX@Y5W&G)z$~3xn4fkHsq4(14yYT>Ox+fT4 z13Hmjr1y))?=(Cc6omflMRO`Wf-t~#7Jl!$9_LoI0A#a>lqMNYM;j8__#qicG} zWBMkcJz&9!74FBVWrUNrKx`VGl7NNT7u(W6SN_zTOl@8vAxJ!e=X?usev4cTIxPePSFsE>ul{Vw_yPtKNj+sPDR~@ z_YiFMJL1`bK<*PrVWcqrD_!Ry^@uAljZYH2luD^j8E@$UQ~x64`OW``X*w_sLMiYn9MTGZ9hw-F4Zk$O4x(>tK`~3@^Zu9fFZTL^?9=R9 zTqew{p;yKs6q&iEpGcLMWJd``W)0}mJ{jKr`Vb~@>8~W0A4yUJ*B3HQ?tP@MMU{*FH3HV^c$*EmCAbwYmvL}X zu)o*A4@BynL@r)2r)onQxeD=!ePCQ(vCnVsI{eLk#`5?P4{k3MH0+MFG3|NNOw|-&NiV)nfNt)$wigQJQ1#ml>o@y7WcW#Bbc< z>OqxS9Us-n)Z64{Y&!Kv!2loq0tI604iu@@nk|ftV%f1}^~xJ?M9bl?$r<$*!)3Aq>vu!b;r2IODN>{J1S{0R1KFU@;o5x3E zoT?QcXIQbLUZ+k6g@7sO1Iyo(Wby`xsvOvF={Z6J@awvu4pCYD$*#4vlh&)WPQjGw zdJx8j{l# z7eb(Cb9SY{x#wgZC==S8Kkh-ogxaT?P@8wd>ux!mrt@DaP*{fE)3gabJ^zS{4)3^m z+~awxe}hL_DaDXLP6>}L!ge4?^w=<6_x*7^V@^(W)9D$gqHE45FWh>!XRY54@jAdg zViO{hMj1o`KtOhno4rA_`UqN)D*pdjyFrR8r>3P?thySSFULxQDEGV@KP!5x}e4Vhvp!r(XdkPPE{7kXjfwS zmk&}Ev(e~-Ec^KY=hy`oly%Rw$rRbklH$2UewOwofOj`-_Bhb2+KI4nw&|=&sK&DA z&sA(O^e+h4XslF#@$epN!GVtV=5Eiuy9ma6{tOCbhoe$b=!~5sZr-%h&(IZrz+o)c zt>LGKS|Gg>m3L#IH!tmy-uY7E{<1!(^-`F9=gu5&A?I*nn43$qR zdja7e3-f^)FTL1=bw=c0GxW>pD+n&#t=s8Q z;SEy{FX62`WD$}aV4fEONQ*^*rG`_bFNp~Fzn@80hoVY8uqKK+L=;xdci6C9zb;l; zc*JJa$AqA{% zZ`qQ8Z=?IhyNdqyIb7_niWjLj`H0I)#P$ zL0bEk5sc)-h_ud+*PhVUDQ2dJsmbg5Hb!3t$v4L`Qh(YaB=0`E%y^kgUh;?SG{ziI z1{GFg^3Dq94o=k61(h59GABD^s3Gj7qkBEnh2B-$qJ?B9 zrX4ka^;*yLpy#_>??yfHc>up&si|s!_hWPBRgX(mFWZ?6{BL%s4*f_@u`)6FeG1sa@yjfjUfuo{DqwwqmKPJK(c73pcEL3O4W1a`CoM zb*G+jcXOUUjDZro-grk(5X6&JlpU+M{TFbOKAUJnLTa0V-QLQ+W0vez6uZ!P<~1g8 z@x+x4)@=*4;m8_qc2Jg8t~2otbBqMLpj7}-_y1YFa^93(p{=Nxf|#;ZQSER9?8%C3 zky%$fX_?vH{cB$(XyJpGyOP{~bPLa^0?E_gOb@)aa9auV8JH}g>vVCz4xXf%lj~}R zAkd_Kq@|~269Jw~@*X$s`*p{s)mCWjo52v3^pnI+_?pkiWw5>Vis5y_isi;=KJ(^UY|f|26`LHB zv*Qpg&;*=az|Q?9AFxGv>P15a3c{Ig9tW~=2+<+;{K7(ctHSqGd;94G$BvGU7=J!= zF4*d{dvs>U$uQ&ORcO98iOZ*Mj90Cfm9SwYtq8}#7^9YVKMb0?g3nAWYpq9Igg%!@W=%k88&^vs zqoJ&TKM6;F;MD9(V0j-3)63uJG%#m%Y$pEdLjWEblwqGXf?ta4m_b*#9Tmf|Zi-Qs z2{%vU6CV#`nn%_<SMZ=|@uBryjyY|gG#rnxGl<8K=MBT*~sq*xn>MkzTN<$@{txkQ>v6$s_%ExyJ zO~=6I_030~y%%TjYFOQR=+~Exju?F4D=$pb0nQ1)mMGxB4F*>e-Tyqh3ZLslyIre{ z1c^B1n}fGc$8Oa3pphI{NlxxCDkA)lv5>k1j$RlAfr=)n3-V)aF&V|2{1q?0Yc&N5 z?toXeL%Ojrq!fwYK|TeRo>2cf(&yrBeX)$@_44wW@5T#sB$%cEbB2#(VzVnF~U3EjI02eb3!|0{d^b4C=<`K zq}V0o9$NU`K52Y>ynH^6(tfHuh*1V8ScV5#Bk?DV8@u03xlYi6Uge@H!`A!p@$p?? z%D32AYB&Gc-JKGFQqm!xtvUOSo^x5w`fa|mWq-cMEG#TPk1sL$M+lirG)4y!`!^_OM8Hp}y>7#R$1Y zUyK9kxNd!2oumTiQ7PlfFIi4*$zOh~D$LMtBN#>M=6lSn!eF188^cZ|loby55#3@= ztqUXhN54OKT!3i~U}QG0r^m%v>(#+mL!=KxA$u>ishqy}Tn8ktu{On351(JnsF9Y^ z172|YtFB=dH1By=-=uc4L*${AP|N-~grNC@KG~8PVL>h-94BmD{Bw$4NXL6AIGev6 z3USienvpk-nI~fId!xL_1jjMJk1kYMRl+7ZFrV{E%Qt{tL`7S>=Z7_>jb$GhymbOV z`8p(~?qQ{-9y&!#wE9(qJy;O-gp+f`eXT7EF+|CEn7dJ3X~ka+7(oj3A^Vj3z`uu; z=)SSI-s4Mu!FY&k#Kvw8T@v*P0`OnP^n#L&+$Wq+rkDQ87}iR6 z?;M>eKQ>I1@@HC-(fPCd0@2Uo57Kqz57|N~F>nOPL$eG?Iy5|Hui_$q>YK23W!+Fc zOWGVy_yZl)5vRwuh*{0=p<^z!4ZcSTr%n{cyQePf-M{Y$mP)CHs;j9P)pw|>shI&S z%zAbXZ!G;g1Pn#_s^+MoqI@M($dg^B<^bjIFdU}`S^`CS1OTAj6)yn)ZCMBxvvrD- zA$xT3=IyI9ynig2Dz{S=(Il3Xo(saXcDwHWxe^NcY!=g>sJ-Be1sHgrQ`&QGk6QdX z*3T?7-OnN^7*0f8-#nPSc_OMmwZ{T1m~4lg(h*v{4HmW z;Fww40S?IH2W`Nb?^LXB6sl{l4vp|hN4yE8dA4lZJlDK^#btB0g=x=zr*7ud?pSzn z=V*84%*h;Vmc(o}Eu^D~d2Y_P@OPWcx(QxCt3WNxbf8=}`2P7Ha839tst$WN-SFdNg`8YVxOXI4A zePx($5Bk96wggV_HCoPVWe53HW>6Px2C&Y7@}R-)zT-8JqirU3?;rbEPHg<`)GwBe zh>8<%M$66F7#y9iW#eMZ-!fTH16A}^Gx3{r;o)3t~#<(5!i7hM0CPy;D zPim|_W1>(u`R6pjv&*i8q9W|i95j|I4}{ZtDlA6QJr7I4jul?3?uSnvw_=@K5DHJ| zUY#_LfrJ>R1<;L}e^S>#9PD71N*xdlI#m_MeGXFi#t8V1y1ed4Nb{8r@b(cm)acjV z7$@GSX6+-os&ujIWI}E4FP<%~oelb_{b^ zmWjmsvwtbe^n)hq>pI=elkZVtq#~z28PhP7p0Lp3cnoSccjLHABqD>TTTF`5bFTxR zova7=61}(ha6Zopx%$Jdvqgl^l}mM}7;f#EN>Y{l|*xS+ZY+N9Gs~3gdvA z9KbP*jPG@Uf}QFnQV;-nn~9*|$;V-@i!)w$_vP7Rc4}4`v&nL|-i6?nkOfjO<|N%D z87>jA8Z9FN#*+bCI+FpK@>a#XQc&=S?zZ&L#M*B@V7~eL zFF?6K@;}Oji%515W6Mnk7DYSgm%sSaMKVGp?CDPTFSVdqpoki-EV}r@xY8?Wj9IEY zdj%$;5EOvt&#>>M%xS9fp|+O*y<`p&)Dq+dWBNZ1QYb;)u1xuP?gxP{nbMtzzuoJ7 zA#DOMev^sy-nJh%oE5lM0OcXd$-odfd;)|D1gAqvZsPJ>*xw zA3DF)T=)|;v7hSS`P}pT0Ptb#0n1^%_jQ$B~O zU@eWNJV!K zC3I{O611VQ1F{kFf?ND*s!{Z1At&_is>%v{=$&p6yVfO;Br9bjR_{4D>>W4rjzAh+ zgC|m}8|cZLw6s4yASt%tPU6t#GRS+gIt(a<8sc4B73ftsdb>@Ej!!@{2OekQ3jv~O z-R)7fIq!cq58CQ0J4`(GKP3u$PwM#va^HZ@<`0(>-aTrk1bRw5ywD$_&-AeH{)>W< z+d!D|Wxl;FPZ3mCxJ&_7`DxM={6+D9asWtT52*j)J-%tkZK|sh&ynt=yG-V+`kr+ZFz`y}sVm^3@4CS|g+?J)+lBH^7Cp8#2r`ND>S`i2t zkuUC&n=R8H)wK=-?8CvUjezeo;WA{wJotq1WZ!X9Lq;W}(DP3?l2)Pc$o~mbCG3ro zQLWD#0O15|SD)iv&(|#6C>*Y`;C#fRM`rwiV&DZN-GNAZp>wp3*2%el&HOJbnzGJ+ z)P)15NB9>)Mi(&DQnFohO3%RfI8?<*M+_ICv)4hba(Y-2ks(EQl1|kco#6>2a+fOY z{%jFBfIfSuQVWdkmp}vk*9z9^v~m2cD59Hx&v{|qkmcuNQXYfMs)<*W7!ve~?|l370ng6Na!L}&zjeRi!w)b;MfIjGb-oB8 z?-Z-c_p-h~h1rkS-cQtDCWttbx<-OIAzPP{0eln;$5swrs`aPduS+6Xia_c@LJXc2 zCW__(u5KE(ew{d|@!m^q*1B?B+Z@m~Jb(;apa{k>0W?ZVF--M(|5gj;KabKXKE4}+ zZofv0_v|UaEO-{-3ajd9x&cSy&XeS~Qk=mmYW=J%h!hohQHk|++T5H16~L1(ERxVn z7trXWI-PIDXD(G8{cNf^7aDmiCRPtNpw}%v(Q)fitH8W?58T~9rq#kM=_?SshtPk_ z)}~e5g+^NAV;fmQD1xz68f z_6hhvE)ljLV8&pGa{FwWvZ(M;)P9L{(1Qe-_L!Hy>IVI0390kz)Tbe88xl- zn%bQ~ETDm7cj?$(S)^B$`53{U`;j*$t-C|*earlC_d^hD*F3ssa-9OSra^=cUf#G? z1?180LOo$1;i6Gfli+$9hjDTc)VVyP2{ayN4Kno_z!#+HW&uB-W!;aRgH~AFVH#Mu zd|gFJ_a~>G^`ci8*4(Ubn;e^6UZ4|Uzt*?IYqjz4zOL$z{5v8|H}2Vh+#+d;Bt}%P z$D&vKamHkD@T(}lyG93&3qY;`z{f9&(qkT>RD9oja?}kF`hSFX-yISe~ z9jc`d&2e9^)vQ3^vc85kj|AHA30v|a?oykv(ZVBhJv7Aq-`Ug<{zlqvKY4C2eE_f_ zBM9P3;_VnBw@@-4$co4~O>1kXQBV2R?h7GZ0xskv8pL>gvMVW85+2Dw(Y!1XD*!Zi zyC?q1gBV_VOqXXq1Q~ZFcC%!?3iuDAZ-*6kapoYM;NGa|PkfVx*F}+%tRBNH;%o1S zHxK*<1a+*tN$wZ*d`h>4ST+M6*)y4MvHJr4X<_=K)3{9%(gh&x_!bH%(4xHDR?yj~ z@L%k}!w{UR%b^t2B022=P!~XrbP7>mWubG5I@;+d;;<`@*fpkM10H&GY-4%iM1CH= zEaDgz*E%Y9ufO2adi*GP#g7!ZU#%sU>jtb4R4wBwrN?}ixb=VP1)SSw6V>zECS<`4 zgbvMR>oCrByfZ`wf#n1d6cXrlAxtMidtzJ--Mg&MyV6k=K+Omw4Q%}l{huJR&jd6) zHdz@2PlQq@9n6RtkGu*JLbK2LQtg%><_wNZT;?Cb^@9n~jT?ogCrXmui35XvAXAI4 zfY`XZ#0Un&5GM_&OnIoN0QZ-cXZ33kivbuu2&X@lkC~@+rl!nbFxt(n&`^@P%6)^g zz48UPhu%nU_O?=HAV-f~r}juc*qEXD8}@nN1L7ccWE9ZFQ#Y#DtIVmePIQ1*7dzKLG|Bfn zxle4%(!b!DahEyx4EBu`B(4qCL8RIwE8sM=E7Vshou*7&>TJ}a39_%hSz^1)E56n_ zlf0h7iIpr0^buiqbl@FX`eBnNUEGC19mo=9o}&0LrJfcL()g|QRSu)WE-xb1W>I{R zF@zCfL%r<#hHJY3(vVr~3^a+*Lo}<;e_l8NJ=BdnW=_|imps7{E#mPqNH>a*oP0$Y zoA3dn3?>{e8fb4)e$V2OHC7Yq2LI<1HQ51mgRi-r6oqZw+PshakNp2J1$-00=xHTD zKz#h)-O2FD{RY;3ZblvJT*A==rjHA}QDBBm&0=m5nD0HFmQD^xm#>!1DP1SMZfn=g zeq_vg&>G`g=Yb_&CD^Yt6L@Kcj(7^{QhIiOuFiFSSqq&4AEG-l{IZwN#l4*~e%}5z zfR}tq7RKDeB41qvid%68LqVP2`oBtl0iF3)N{1onu}Q0a2LPeotrohR;NW0JwIz{e z_VN(zfGfp4Fe$;(QW~se4}txJknw5VQ~Nt4PMI6lqx&_BSCj72bJjHOV<3sENZSTO z2atEnof_`RgBJ##qE8(Q(425RehClHw|bYafH8F3-0t^zxr6Y`BA#z7V1Y^i6d9f! z&w&0MR(IqIhBt6Ro$q7>xfv#4#+6qT;pzL z>Q2Sy*?+Ay#c%^uR0Nl4kx3j4JlljVz<=W5vHGT1Z9lL4x$gizXGXrTj$@>+5AcA= zl30o#py4k6QzV;)40T@r4(V&*6W4fOr*L%z9hfXq$tJLE3#Dy|BG z`d1cqNdma8uY@*b@76o|nmhc4LYW53xzS z)=0wxGxXCp7&~AU)g7fJ3#pG(^@QX7YuWgVhrDNU9J_V~j^jH=4N{AogeQ(okpP^fME0Zd{IyFL06e^lAeqU5Pm_!j{{j>Fr^y89aWV9m zvI94wiId2F4RYXZPZMXLXp|B4P1zgOHaHnSK4J`B$w`KLFMx^=su~&^I5>ahfK()I z=38xt!h7O?Ao0pGj?du-4=?z4Bi;)xQL(trReeQX{X}ql4AB!O_aWLO?3wOiArxyA7s;0c`M!^eNzOQ*lbtfYQ69$1i?}nHU>mem0Ff=H%oiLIU9B ziBzn4!|B*@gTjVl_JOwna9KXq9qhlqs8SZYB)A5W#ORVE3Jd=;5zG8lI~j5IUP~JE zur3o6^#YB4MbS1_83wB?-|m2@x!)bj%L&3RzR;;HD^N+GGfZJ}>*hS*zrdA`$3NKF z-Cr$b{Br;=Tn0mU>{cZX0-Tk#QPp-S6+9J}) z(l>^?oo7RL9D!Q^bKNf2w$PA84!(`C`RQ4LOZ_%~b&~*Nh)B=_7Y5iyM*ly+(9Tfd zsOha3Pz(I| zKS{pGI(Gi(^v=EmV#UJ)FUeq*&4YP9HpiVc+2ZC{a;B$SZ5u8{;bc3kIaQA{tqv2_ z;|W0h?Zq#e)*=@&)(6 zNMLB!{yn-U$^VC)R`9l7!}~w8br&GUu{`=fG2t9O{?KZNSIa#dk_`L>jo=OZ1NHAk zq3(WX&0>Qv$VEBAK*0|#Y=j?WZy%p#yteYmIH;+u5x@ds%v8sudDkYHWX6$2G74fy z`(6iNfVs66hTQEtH1#+xILLmv3{{BO$WOj2yCmEUb0V^*o_bnfCkwrL>>=}ClK<{W z6en*>91NU8TvBw~5pcrq`(*$V+}52*1wQXA6`V>hMBM*PK(Ac(vt7v4Q#UrYr{@Pv zSq@E^dh*tEtBT(@q^TKC}28GLH+99!$Nxwp-z%AGG=OA%gL z^M@7t(5Mh+1u0@61L10BYK}v765Pj$#b#c734H_Nxld<4!_g@fP7Uz3y?gtqP>_{F zL~0HgSp%wnPK|eCkS?0u^Fr`!Zk>1haK&W&bj%U7p0szj_h$qe@H%Y2qJ__YASdOt ztr;vczUl{_t0a)MYUIRo+JE|vY>FR8?*@em{^m4fh_~ZT^({pzYen(4`e;cK#3tg{ zjPL;&e|c)Z*%DX*C(-qI$P@gsdkd-KyrR@U{K$b)jt*(JsfRgrJQoryR{TUsP+j`-lsGKRPThb2UGs#IC`S8k1Rsl?kWGk1u zp3S{6zA5_`rVtpFG1!x1hfEf4+O8pkN9|PRn_-1ibm691VK<0^Samg;H~M!Z!pS; zlfZ8s-;CdQvWtfEkK=xwQ1?XAn^?P`uM7~q6u7Vxsnc9F2(E$@8*a5-?UP;9*u)*!<5Hr*D{+~TsfFfh2$bKNELKOC7s6;9z z_mgVqf2912Wo>kCwu#l$VPB%yI#LnnCVW93m=q{*v`#jWXBX*hKUpNkV zVBv(>I1wkN6@=dQr`nOoGtOHG1wwzfWU<)5%!p43UZA3wQPa@@l=uvl<{04Uq09KR zbxEkuaAkS^_}ce(9U3n%`^e#(Oy1+~XR<{@rbq2>;Mf`}EoW7CmYeDtBg;*hMW6TF z%=g-AZpI53#4pl{N|_{YT>~u#`4WT;Hat+d?PlyTlf!|im;{5R+_!v`}AAYv&VO0j8`4dx5rLlI8NHF2P$_%pAekpXjVw6ioDwXC_?iNJ3{L zc$V?)|L0%|x!%gsQWdeqf-)Oj*xc*DOAMy}n4ECW5u8&R1tIVkF+d{opAmI*%*rMi zu3!jB>u!1dXu7jKg>?n~4 zS_rx8VYt}x#X0Ij<+NjqMC$Cu2296pJ>>W>a!+Jc*CB4PTL7eU4z62G8bB+e1s&cQ zW~6@LA9cOa3ii6Vh4Pc-6VO*>X7+9JPdjKf&Fw&?jrn);e;!NwbNOt>&kEDfa-K0> zbA9K4v%V%6fO&CKuaHP4W@EgHzZ8?JH!ZoZ461+}@Lm#7anz{1qx~Hcikixq=o%BQ zuza!n{IW9ua$KH2#Ov2$n_4%RT}@K{?ehFj4wS6U7=zTD4w8KnbMX0d4n#6Z_fkq% z)%cN|?Vrm5AptnQfv7;KY~beBE!kWaugNIu>K1OGR^{d5xMd=qn{=nfI~~&Klq?ID zmzSHj@o+BJn1cZkps2~uQDG*n>henpsoAR#VwBO)wQ2j#`y8ZF57F8l$C61l$E=G6 zcE^3_3dx(jvb160W8$}nNJP`&ee*#9Ydon3Nlw{2{fCvFxN&JiAru}08 zaJss-A#lqy!og;Vci_ChUX5_Zl@%sWbvHLD)d@JT9cc^!=>-^pOj3Os&rAQK153Zn zo9NP0h1Hnxd17Q_ z!I=NMFtfTxi?qW_JxE7vh`CMx7xKzaYlw>|v6tA{q1(-9eP(c0W|=QR`Pqr^?=6d< zt8f**M2e2pRZY&l#!k>zW-H}m=(Nk5jIe3e51nG&vjn-CxEYZHK2$;bL32;_6`^X5 zqp<4|ff@*pv3f;8Cysg^b@C23`>t7&?r!8BfU!8B5p!>z>_n&e5U#C_oYvW!{yvdk zWYtTL_`o1jgZU;4sB3f4{rQ0&Oc15J+QH$}Fu-5e}0f={5M5E}?cxjgDKi;R=BMCsbrwc!m z+v#ENVz((Ey6vHd@duqVCRaJuK~L%(^8ee}a0|*b>U8QSgj{O8Np_{vV4|By6^oYT zFNYctxu%!S8TrEZj(#Xwr%2;wgX7-3p)om*)MI52OR?&|3Xo4mC^;aQ+V@>j)zmFY z{g{QD)d2+}3PS~j08Hvbn!@9jUNjka~LN&0H zSZXXkk{@@4Z{!1@HWqs#ndP}W3kwUwArjCW@E2wllbJ)dz!d*#1 zNQKdR;@cUjy_Lle^xXD0A_oVe`DjR_$WKSds`7deLEi|;l<65NLr85?sf*cTW|B(? zu@Y8+P=5ATo_{g~`u=rTKU_q5;rsmS8Y{FaREo{%RRF-s8$RJSHaV+hC!|<$AD(Ge zu#kb_G31(!uBa^r?|5e&fO`69p=_7GTd+-3knQqro0F5LU)L#2`xFH_)99j{gcL0; z>yq6e8%}%5sRDzA9=+Fv6*h+y^jEA8fjL2HrYo)4W@{KszvuM1tW5u@iyhch^LeKP z4EUA>W8e$=zmY%PTVM6;HJNIm^L!hzJAvF7yfDFb&#h%+PA@!R4o!mzDZAY6)g$N5MghG;Qd!WOaFy8U| zz2YuSo-F(eq;gKH&VjIXFP1g>?e@vUM)D@wxckS?x);F)Y2@EOq|NAFXSRP?Z}?H+ z*fGYpppG5zdwN8Csi!y9A^*&{Chs|A2l zr&nioK$WWDODQ20ICTRjz=iwEOglcCP0-N=Iw|PyEV45&a05}>6_2E2x4pfSovBri z2Mluq?iY)^ML#y3d|yhSPS!6XdOQ}%Y#SBoSqcgY9EJ{?IQ3Y2L@Tvkz2dm|?Z(U& zGg;#x?0nk#t;PF0R!NFIrv5^VvLi^>-gVRA!g>sUVRqpu=GX;qx5O+BE7POLOv*vp z^7Ueqr9P@V)KOr|$0*X{Y_kD#7;NdW@=C8ppL$6k8koZ0|OShrt|C2C5ZX-Y=2#d`SjxA zKu?U>6Fz&?a8d8L?pi(H-;q)8DK5HQqR@_o)g))-;@vb<>piG4l9JWd&I=Cp>pH}k zUuYPg9a9J_{GBsg>|E*Z>*Ek|-0koS(VpLMqmO9U<@?a%vbFL&{BDk?W`d-o*ZS#I z3G!|Uz9X%lHMX6G;d*lYoNJ_6zD1mL6b~+K+&F&y)pLlbsBW3(ZG^cd2s|3k`YNBr z$4|&X=`!;>(-KTWPqo^UXML2`U2B?iUs;{jmc?d9a_Tko#Ny10PErE~e;%QZ7Xr;s zx~#0ii*%0UZr?si7^!_Zedx(CzGP0QdsuxT#NjgF^Svmb^`k%S6U50H%R;|Xo!;>Y zzF}9q1Gne-$3XKdiu8HjsN|(KA@sh}_Rz)ghR+4cVS=Q3WpRS!_{_gEnUzyuDY&ft zE0+Li@58pc&%+cGBL5gLA1kGc<|Gv{uwH z&uz$^)g2$#fxdMKkNq9Jz<^fd^wA4b^9iSTtGiBUc#-?R$O{ezhOGJ-)uT;(w9v|k zgQH*3$y#Yo;;wn9kYkR$eOX6qE6l~P$pC!L^Qnc zI7SCimDPILbKD!(SVx$=g#HAgLdbWinCI~SOn2RU2wtG8+K=UlTgfIvl5CgoiYdr| z&w2&&$RVn%u3tdX7(+*Pik-k7&SmJ8E_tGNR-?<04PeTF%K5P&3F~=_=F=I>f zBG|L<0Rc26`Y89kZx`P~L-)@-&ia|8@GnkES`gsPRbZE6fu8qUKx;`y%-_PB;`YNH z7@N^rf$cU=SA@l6+3O9r&D&$OM#$X*Y*b&#vz7Ig7}L6`?b_Ew^BH6@GUlsy2Nnb$ z5eJV6(cUW7iLk!9l#*}P_LRBj0|thrMEK9$J=$MAFHmPw*ud7q=V*<(?IO}+o{@ry2X;&Q zflG2U1!blK#x5gBu?LSHAs2e9?dIzXPyhL7F@rH+A8of~dSdbE+}{_X76k=n4~@vY zn}^KQz@KVnF7#?F&?($ryYH!Y)fRWVVl?X3+<}OdnJD$)Z$}yCewXrBP4|{kR3fgL z?GwL>&QmjGh>m2HC}wYNonU)sM-saJBaFac>&gs?9U0tQto|KBX|Vp92DD&xFHaS` z@f*J0dzH0#c*QSOI(z1Chv@w}I4Ay&4=n2qMHq#F&$!?bS~3rkLFiQlA}5Gwj4A|9d$Mx+_dXl3r<0iM0Pv8vVI*) zD%f?fO?nYDY11-gJE#=2P=j@UbmN4CcrD7aYE7~qEe6i=Vz-a9b$R(mzINqDgk@P} zWm_=Sz}Jh5Gb}u|cB=~;C8aLR9P4>Fx4mC^R>vl=_!)dy!3WPq&V^%Y*xlRV8mQBk zD{IRETbx%PaER`SGd6_40E=khaclhDzN~%D|Hao=hGp3;;l3y+Ap#}kUD6%W-Cbv%*S+_-&Y$D2@6zvj*Lv2>+%t2}tXZ0& zruU=e*NOe2ag~C;sr=4SNq%oK6nSO&=-IJFJ5RM4y|X(F_%H3RONR`Mhpkn|-y%Ej z0a%BrHe-U<-YT8JLWv1SMeQ4>5k0;`cX-aiwPlGE;s=}1Nh0Ar2|>ZAX_g$lAoCma zu@2sD^P4TxczTCXLiv9=oV&HgiaPqyf0rCAKQLFl#^1IVnp3*&C2Hp6^mMg!%7%!@ zc`+k2A6!!@w-XvxV zpSa%9c)`xi;cW@(wNDD$DIJ)#^!V$~kzC;i=mi-Tk}LK20!~aqtfJJcxnVZW%rCfWOHxOn(mH2 z441AZ5G&_fB7BdFe{k&|e6PO$q)?^Ot>HVFCI5&#eM9K;V=3PdO>Q;6Lf<2i!#$Vl zPh*HHt0FWwc4Qd)?}(jdBz*6mNY7cU_V6W`2{nv-k7R&PVmI>jqL4eP)azmD9rvK5 zX#S$!f@_90{3c8M(NH|G^&Ik_2pTA>(#*vk8S<}=uu+?WHb(sl~Q9i4P@iA-NEJgb+OQ4NT^gzIgM)2)*7 zOf~Apap{pux)G<19UGqVM~ry`o3A;GT(aA$wTOoP`!oAvJ4R$-(JJh0zk}Yy>Gsgv zLF`Sr%|CmTN%y8J(sp-wGz#s+8HcZZcE4XW1dZjl9^NeC>y5`q5E+S+8jCWBK(Q zJhzCp2K5yZG9_YZ3`uq7C7jjgl;yM*3H3&wADH_0dYkBu;7nju97%N<4e$0}6pJ^k z^&ksBd@dqBE=E|+`X7_Wg(Aw0#K)baD6jGmcgo%#Y&n*!5U9Bv+L>Mc?DUM28l*Q+ zYbRN$x9W{3DHkZIRs7mcSex*@%iU>@E^jVC~O*;QgmY% zNIeXC?4I)-qlo$!<<^mg7iKA~_IB4m{8I0=LAz0s$K~eGc=1yTE2qf;M?PKi@BsE( z%s_IGl}Qw(^==BZ#l19N?6z#-xi4Fm$^uhIviKW~axo3CHhIBb86k%^0b+9S z&P7Di6%xkoyfy0;Qfb$(hb4LNczY-P{CoVd34UnhRN zkAXdk-S(xUJLI|VY}JU)w`;Rse_gl|)7ew|)*SwoN<`;FhBj-99Pce4z{xvr6L}kL%r1pieWE7S-CGPJ=sG&A&&jN-LqxVph1LEHB)M`v??uC zD$PY&3`n+fuHo_*Vs^MW&RN0ebl zR4yta$ARI^m1XXEC1-W<$4Y%!!w@c6TYrDQ)GLkU=X5Mc7?{IR+Tc8YL2vG=`TfU{ zUrol<>1|qgYAmzrT|MWyTL(4i@J`Z=G!?zG{i78dPEootDx2q1im+ z#55VFS@xJx^E6`i!wwGpd;6pt?<5+y%kA=c<`VG=WgSg$9q23u_u@v^hCy|sFkAER zr}fw|D*q6>v&4TIGnc~us0ik&{Y!GZKI0R9B;uPh@z*xx!Y4k>n*QZOM3>D>Lp~_X zxF=kC9|!@*rW?~fQ(=!}WC~iNhv~!hUcN6ZDr$b3cb7nfLO4qcHW#(zK|@3Hwj(;T z$VLa7>|E14_CvzbS04k6>N8V9A|6Dr7^Jg^3`>mt_8}HncKLf zkdJjp?)URq-5UVOlkle`T7O?&L^WK}1(llE-?C+@j(Jk4>1?>H0$=qOxhZoPw8< zN{RZf^s#ee1A-p!V_URKkj`WG_!vB@oz(bhet!6 z{&^Y?c|%6Kw@0AY0jE9v6VMkZuk+W(q&iEU2vlgv0=a>*_erpoJUJ1Rk~H4Ux*mLb zl6AdXN-|l6Q948An`JbT-juD<)6m$jepCoAdvW=XqJ=;N49O<;p}k^Nw~G_oDf2MF zPl|jnnYKqQS193{JWIgd31VOM-o6@zk9h&@b29sg}rH}^)y)vqK+G9W-C-=S(ecy4nNSbD7#(pgR&J4kO=ZfqZr5Xy9#YTKL)83}Y(M|p z&WX=e0KVQ;vD0lxLyWktWg6hk6IRZD$3izh%#OGYl)$}cR%*-UqKE0c_ihT&>abF| zxs0{PR!pafo_$Ah=+u7c7cVMx@}Kp7dpb@^66ksH3l5zF-8<_ckwjt_l9ndAxDSL% z&ENE&8G1i&FIK3;cQq7(HVNK{7#f-Q$am<-c7y#-$@AtUWW@>!ojuwWc@;h3ZwmBoR;bI-*`JDQCA!#!r?50 z1Zs&4CgQd_u>=CH=Oj=H%JT`y6f$4RJ$84^QVS>LYHA1dz?UY)x}A8~eb@bgWa}y( zxFKfR`C-0L8bl12jh%AM!HOJq*^%~;`8vt*cc}_%p>us%!LMJ}NT2Cqc?ov}_w}96 z>2#U?LqF4$7Dq(%x!R*i19qyu{;IBy7N}7kwUF3170FFo$(fdCfqR;zxu-#PUlyw4 zW`Z#=hDj`gtAb_C@Fk*S-m-QQA+Ny5xsYBMAXQ{i4Hn%U-KFM23HR`?Ue`_4%vMWb zXp+*tjJYNka0c8JN)lA}`D5Di|BPI)BruY-=6dWX0*PKCnC`Su_g<90dndHrIJMce zrB~Q7&gQv|LqxO?=dw<)dg^etIpOJfxTP1rZP{l#aGUC=pY4&YLdo$Fy(n3l@d_@D zQs~CRpCu7h!ngFlA-D-URfETGed4odTj zNg**9-squ!zTuFTneHy3ByqwKh#}Z%jr+5i;LBWuE$>*8SZ8Q z4lv^&^jDhA!lCN@d+^?HrSup72?~dgIkXhIM`}0H$_>xF-Q$z>daC;CJrbvOR-_wz z^ieNy4}BB6D-~H})9Xx9_dw6Z)JSmSoRkG*!zX<WgqlgX??VdK%s3rdz5T_K>3Gq7n}vl)#?Z%7*(Wvl;`@72Y%yfp zKV}F#LtIx~pR)3;$@1?cPf1Bm7v)qb>K-lP(Vy_|i5A|k+7cBF#oC%{x;TEc>!7D1 z={xi&(=dhRrVT;iIT~fn`a@q+--!gG=fV!69tKk%hPUC+I=lxx9OEQ^e z>P)vyPJ8H_^VMxUi53-Mg=D2C?t?20D_CoC%-11WeV3I{B*XaIpxcBmk-Jb;v;0UF z=0O6BDYf}^`_3wT({+5y&#Jp!l2LLU~~!Nc7K>s z3b?dm^)ghZ{cd;y5{i~hrb26zs!>O8a!C)3r2BVz(>*-PKNV>#;I<{v}>QS-gW?2bNV_~DMKY0Ax}@kKF)k1 zjS-q$0_(i4?jnpmrml`#zKVtb@}&s zQ5#e25<@Z))_w_SU)x3Alaib%dWl%pe^obSB^m$<7ai@{$Zq>vXxaw4?NhOZK2D*D zF0l%Zi?dlUw;f*Vubzvw{gRjWwXj$|!}2IC#wjMo{_peh=H74YBAw06orL;=Hv{8# zdwk^E#p%I?rPuj;DHWT?qHHFs)Rmip{eDLj;!MXclEx)ESdanLG5;^HRV5Z5_hZ1f zM)H4@8Vw+p&gjm}ec0-vR44DPjxA&P@#XTW;<2Edl}hg)2<7JD?K)z2 zfT5Hm590ErE8aZoo_hfD&M^?kJk*7H0%n7(x0u{5Y}YH7JFZlJ+jT#-9vESBs1*6k zzHc^ViJ9=QlkL)p+o5bDFGV@1WFsf|ynqfQ7@#Zie_w^)Jtzlx9BN*wlk_tOwDYq? zc!yC_Jjr#sPru!5-%6<1ocuM+7h|`|Ec5+u={mzj!!T;WAidxA*5yAEtuh+CBgNLo zB-`O9sPkt7bRpDugKStf0LY+jt|V~#@GoXSU2xv_6LSL(!EAY9dxU@abMI9fr;ayQbH&BvXOm{PP^btM z3Z|A$`EiHq?Gb2evCW2UvkfRw%cPU)->PKOHJiEi5tEmCzBgz*SS|T;~WsZA=8TxTTeT zEYhl#+w5od3iO%bM}a0%(Lve!LE@(Tns&Sv(MXnV4gQOj zj<9+6huaDAR6jtu_XE1`@`zwG}cTR5o!)f>(qIiqOVz6IIld;dlh z9;m`;76H3eOKjsn?DkSmNM`T! z4e`29p$&D%(l37;>fSh#T0gu(IqaK2pTCdM$kfXwi~m_wwD@T%tWe1d7+0DVnP6MD zUs3$1NShNGM5cB(Ak3s8>g%-Thr8by0xqm}CB z)QV9;hmXU5_MZ|AG=Tq34i_4Po}MiS!7*{ZfLD?LJE-8-Q_t~N`68nDogZf>nb_<+ zj|*GR*$wF62)>E9gRwnk-I%0jk6k#vU88<(b^d^aHH33(tG8o^Nl5yZlkMMN$gRDe zMn%pKEB?kna=Ul$te*as9Dfkyf&Fipk~zXi0duQM_!z}onJ(UpjM_EM5uP4|Hjf2% zRIo%MA4HH;&FX7qJX05w>t8Bxe#U_k_VzGH_urr-$KAu?Lfp+?^VJvwurnme^LoC7 z6gxkgZWp0bxoLQN1o;pkqrc+OJJ3l?{JMDefnGKh;rD5( z7l)??E^K~FxA-HY&7<(pmb)97I!L`#Ijd&zY>7w5kE{N$A8p!9SsMIEXt~{L9-3-u zh-8VP+3bYZfvVd7U?N;2d_Q`%69hpDZ(kVuW|CCJsuGZst zoCOy&&7twnAd)Iw#hR0ZzEPkiif?K?FxgXVLO_Wl?Vo9+A*MmC|FoEi9n)BxFOlnd zyTmJVJXcOEffo*PmH0=#I!C(wzYM_v9;87Pf%Q=KQNRC^@iKe?dMVl{1uh+LYwAAcY) zoqHLb3B1+-Q+7(iJOF>z`=)o z@AJrjq~4gs`Ng4bTIBIr!r_oHXYgpvt1L)}Y~wnc=K)AE(agc(f6GKr{ zuRAI24J5e+t5^-6igW2F*O~9CW)2mTFn8u<>80b;y{C`qKZPeDH<{*1{X9h6>881m zG=Vy=&jLK9g~M=x()SQ_j74<%RHH9@#H9RETC4C^bUOt#A`VVExL1Uw+%QGFMOQ%S()nH8rN@t49pBt27h#&_`BEs@lZ(nbhk#sbIRHH zY%~!hWft_yfdR*;RRXEQvSIU*FbLu9}ZLuQRH`oSrkb7L&WzSkqqv`0}8H4LLdEmRxN$h zR!_R8#x?d))A0h;a_*Ay@z;4xokU@UY3Zdxv}EprS$ieLIa~b%N67Cmsq!xcM0{V5 zzfP^87`K1~Bcol1bA+wH`Fo7A3oefsm>hid_eT7zPiU6kyQHcP??Q^3wrTj)p(ARNEQdF93VHv)4H<48&^My`r+G{sFg}=%+V( zozFc~$I-U71V8UoQ6glG1Qq1ZNV?r_to~0`KY^+i+ygo$`;j>@Q3@AU6ua@Y^poVN z`*I*pkHn>YC_@B!3Z%s})SSzFUgJv454i00OEa}S?EcnOM3lze#E2*p660K)Dge8? zx)z(Z2d$C90E!=;Uj96Ih;0YLggXs9qX}G!NwrTz3>szcK8r!==5i;bE;8J<`T#}8 zO@+DIa6a6k%o4-F6_F%eQ6w-%ZJV2Xvz73-a_T`mGj~tYp4C0jm&;ls==_dko}m@gy*E|Ln+jWif68E-$p8;gDfvO}5w5m;ddd@wT>Rz~2$ z>2H-aphtTmUK$$2rzrsK9{ePH_t4TVurrm|;li^@ZvoSh%M2#IeK-?_b5-g)PSW&; zT?DU3@JKHJ)`g02$@kxW319FjniB$Ef1XMMUqlDZ-!%ZNj*R%C8J7hF=Y(Vs3favc z@dY-Df!O_5E~|HAx7fT5$*=7vOU=KRaBcUO@vs3R<*Is|J(vJpzp(qglrxayB5FEXFRQVe=}<0wGNvxB0SUQ-SYdE)mSQd!D3Sc!)xve6u9&yZ zspq5w=*X^poAUg&&c1w2C{?$vxQEATiL~5>2FcgD`6op#vz4yeS9D+o51_BpnE&Y+ zqa6#82c1gMWN4ZXtByeCU8F46g@#(W64S*Z2IrC?Ty^L|wDIb$_LR6xa#=x+N-fl9l1| z_jCmj{#TP9h|!=f!}G6=R`{1Nie>H;HaSOF0vs8vy%bCiAt}F~OS8**sk4_Di2mv5 zcAUBAf6VF!bHPEPHdC$PM)d=x%UQu)tK#T+As;07^lMbmhDYq_Z7EswH+rMJz9{68=i}A4Y^7@xnpI=ymldM z-s|~yF4FgL3V1}n8xJ3%kB5=6;uUf{%6H!}Yj+tTUSR@RrM19;lUiR;&&ZDL68ek) zot&QWPp(^SILf1PPArrOi&c8<6#ECrjV~m;ZC|3l*-U<<-sgkXvd$EX#}%@XJRJ~c zT-QB<_zyyW-?Xo+Idr^VfT6Rne3wI`336CZd)jp374a2$W0gC-flG=*xFo?|M+$er z8xHch+bV>`RvlI9iAF3rfe^-K`zlDX-(XX<{mr^Zt`j@}LT7(+wEP>9L1+1l5(9}G zLSLvQ(cW=B7J)o+=&O+{+KW@bh~7NR*LmM6&~|@ekMAOaUJ_yqTHgB6e$1gmesU-G z&EB~y2+(7l&z1P|g(2T}(Fu!{EdocPA7s>-;SMtL%M3AbT6vS23EGwUc5Q$rlr#P_ z?@(T+Kib6A+qIKz%|Kx}zFl7nVDamo)#$%Gl0=@5_XaCIX=~}QS*^vgA08Z6 zV`NxH!EehIP947&etj(Ak2A~>xfhb%WN4b&v*v=o2G-jc$u&4ZX~196T!XOf&w|^w z1KCg^Jwo4HcqRmmSdYo9WU5$hj2Ae*{rwbFI((5d)${qxkjxt7XK1qrMP)FepR1cDX&3v zZnU19!MReYNp8J8Nj*Gh2jA{=J_*4L-q_Iv`$p-1-PQOAHI?MVxmC15Y6{sc(E&JH z{K@-|LEZu#Q%UgqNv0?YDuxJsFCwy3Zs7YrA^@v+50r*?3P#P%0P} zsDmdxmF(2nVEAq;B(mx}|5%Bn-9b!uIWo->ZN`+Z$k{wHc1XS*I9}4`a9v)r&?*Yi zb1wUHIxviUnW zbZ^(n*ksqB_Um+ zKj?2`ZWV0Pq;W*H{-mr<(rdfhgd4>82R7&!yM%o0KDOJOIsVeklh; z%69T^6i;MW4-w0E3nvDHVR|gYp(siFb$6HX;4>kqv=FOo9Y zeOfq5X}n7}hw9+GJrzgROSxv_N93d;pKQ%2K2mud{{bbF z>@;g$-HptB1%VboYF zx(8MxCgRNUz00HVGqQU~r`}gvW}@e+8*dF6Xzc8JfjcPN-(TqB^i2nSF=x&eA^a#{ zXBBlBdw}&)@j^srlY<&5a1U3Z#>4Pih0bf3c=Pf#5%cB`8_5{d)zCbc3ZaLY6^;&k z*0jdlh!L1iRxHyQSda z%1RrZE0sGE5h~vK_0RlSCY1uQxcYpM>tdT(Q=LVDYYP4l&6_uf+q5U0N$-BT%ET_25V#Q5~u8E?Y zuWd`zRhND9NXeelzPgHs5*T zz1=i#S(nj-iXEixzpjkT(6+1l^0#=AVR^KS}Gx z&8k26k~8YvIK_}ug%6cr$!Ve)m6f7JF@u8S9`M(fg|gdO%imU@d! zttYuT>Y;JXKK3o8B`^W_InGZXC%r+;eZuRd4OMW%X<;w;RZW*gV7p*L4P)fZVuOb(&P^g9KD2$tw1M7czel@xekKl;gtSN&FT?M81%_8vY>t%{s zL$Q3(*1Sza6}>@awBLKkGO!D_u87XzjjumY=`( zj7h}c(UL{{EQM8nfJfpH(o7YkS5u3sb4*{DXWfgm(~B6p0Sg`UJJ08V0*8r~K6$_+ zY=O8ox}CYV#VrACNnlf;*rxv!8!{zB1A9us*wu#$7XyQ4g<4rgUy}z!F5eB?xiE|y zhSl@Iq;TX0LJn~`~RSu7icXwC}q({L0 z!kGR%OoP1qo3C$C<2fiKPYJb(u1wms)W!{no)G`E9A+6NQp7t=D(N?-aOAs*S~DQ zk>DZDcfWfV+j=&BRSe&t(dv4K{$uZrfB567pT>d~xq79E1c>g8!AQOIy0z5qn;zLF5?WN4BQxldxZ*By7mifM4= zVnFs4w%ToNeSKK*sP-Zneq7HvX-_(aSGcEUWt+&YfjXn!I<$#G%|f2Zf4ik~@dycc z?MBX**nH7B51y89CAk1Ymw! zC9)cBGnrj?LeswOE0JpW5W~HP7_R7hAkUEbU_cWBdD*w-Eyn^LdYXWP@S5`2dt(O2 zS{dAde!roW%f0&Q^%R@+E7#61PNlK?2W+vAE8)C_0>S-Gwr_{U7FvyhZvIj9hn(NZ z8)Lb%6aQk$wkc2%>oRSai6Ot!HUq=idjaA3P{IM(2YMPfVPvvyfWBr8E}J zKBm!bE#yPdALV1f!HdMdSi}PN>UnUiXSMdz?cEzb%{c+<)8!=VzTfB!Q}Ednm4_wu z4sQji*I?S!RhO5Knf;fdd9bAUQ$?@)Fn<3#0^0$Ho}#8vITrM>0Onw77a<3_bLnH5 zGqn9M`X{g@wz+{6V@>StcySO(nfE zd+x<2rd98X4NPZd-Tn{FEL` zAxeMlPHv!e!k}o67;0}A)c~xe;vw#J~OF*XLcWcESpgJ7*xOA>}`T^Z?u6I z$>4FXT_9@@zxJ$JAk$KyAJaWr0a`>+pXSjA^-|b1=M#PwFF^E9qG&aOCW#U*xv|1v zy;k&j5!iI!y5^V^+faReN16-zwjvZ@4P05_HXrW$*1n7T@x|L8C-(cc$*o&`jwU%(Fmb(=BbL{lkOcoAv-yeI4*`snZE;aj+DCQ=U8>9E2o{r8M*Q5tEQuWer z?!iL1AewxmgAT+L8_VK#in<(d2tNn6i~K@-28tM2Af5ib72g)9lFf~~FRZc|rxJ>9?Z5aLmr-AMh{7ZA!0WmJCcICS9(HH}2(8iLr= z_blTnLuQaH`-0?j&(>@Ng6sO{K$TMzbAjC-VD-0?gvXwQT9Z@)u7fj*(B{L?9&cAC zbt_&z`a1jYX8|A_+vo`mYsbcK&VMq=L7&)D$P(T)2FyUfivhebukKbMvhqXbh0p&z zu?QrVds6bs`B+dfUM00at>Fw-N>d4l{85ZAn8M#S80PVWIg`DBviJuy?_nyp;|Ff5 z3J?BA1JJ3d-N=8=jkE9&BNa@fQ0r(r;h)urNy-aUbfAy!2%!xkZsSS@Kj8Cj8afDT z=SV7EndPp{!oHuYna1B=Y~55v5NIpR_Qj%COl0ut7{Q_JU|bYAgTDp(877;>T2c_t zJweLT48;8Tw?5i(wDn)`^={0VYeUB&KSdB_8$O5Jin~fFC}++!etebwaOi4GZBV&u&gXp^ER>JbwV`@B9LPLSV zrN*Q^c37vON%rvL$XWt0x8QMjGPc1%W;gDs=n>hvpUa-Lo7COT1$C$4KMZ zbh-B&j`xP~ zXmB30B3cxzF9>@rCw}3|Ul; zb*tarGWY#ugfnK)zH3q%MBZCsHJ{=iR*w+gDCnwf<8=J9klG^F)_3H2H#8smZct(m zNFKJ>*Qr9q>HIyjN~<_0%6Ko(ctHq_8(&r1hT~LOVhpNkrVm9v1(E56v2Om(lhcor>-(%GqFSOSRM7Kiu~F-6Kj$ zoca1V*ZM=2x+OO&h)hGL1suT73(79DkB76Qklzg;sSfFyPe89%@Zu=qc=ckYZ20S_ z-wg`E*WFjpur$C1*35#9A39orgnDV~^9%X{mV<6^ef7Y?r_R!Ih;aAUDb|thl>U&u zffv@=phcw!5yTPBA@w`TS6CJ5)fIx!t4 zH2cVG6Dxg40pV2hUd|+pxNbe@Hc2pj ztQ8#N@G>6xd(`E|FxS+^1bu-7tVDoE3m;k`BrTkZVCWg!jXY;v!ak7tBB}uQFp3~8 zgIuUhS}(d5h@rcw?4u%xBr`29{-e7e)mvJGX5gJRJ6s>A>l1bFN6g~Wf6QWc-5YQA zam&@O$Z#(k?eEk)j&-B2)}eDnm2jk+%xa1PQ2*RLRt1{YFWhuv->eTvwgNF^m`c+q z>2oOA2&j*0apqq7$h;AmnkXVg*EW`W3ig@1@8}a$@QU7%u%tw45I^k+M#`n*TYJamjkg3gHqKrz?^vJG1AHL+VpQmZ`a5k&-O>V`)Ok@l9vqq+)rlhb_)|&rX!h~-0Up!xOUsi|Ieh<2 z!Vw6m0qpDNc9d%#$4+8L12Ng5VDRAeW zkF5(%(u)#ay#-9(dA!+|K!?xlRxO7_2furnzSQ8D3yg}UZ~0XMmEg97qh`UVgJrs_fBOPH+zZV>-~NKQfee$$?@*L z-5pj1iFL#;@Ltq2f6$xZ9_VcUdOW>^xUXQoJ;$xzTl+B(I~wBw0dfsZPf@50DR(~h z;dw#NXUgr_sc7c}i2){ndv?i!a7BdDQ`sH$0BdSdm5zLquQ@I5bd~6Lk=tAX1k`cm zlo8RZ)cYB4QB@oK)D}ZpHk+C?@6UM;}5Ts!)-mSQto*!)xASm@_#j-4oi#h z)wx(8Tx1QMM(wY=9bQIsn|!+cMt_r$=MVse?B7ptb*wl5oe-fU>)i!@&2B=|)HiC1 z#ImI!?i6B|6q0m?p5jMjUAm0enJ>`JLYvhji=Ee5aUW81JN?f!@2tz0vVXvyf zc{GO<(h#c>=?>F{zM18QFxMPn&;D!3%1Xu7b?=VnMdP`3F6>TK_P71hI~a;gq{Ta8OA zOX?6DL*+rlZ)Nbb_20@^s@j)hrgb!5lc$Oevwe4`V(sLpScA8=XEPNMG9!4m_HBBP zg9GW&CA4qJHyP>*hoJR{13`|QeP6^?G92s_Wg4$EgGT-Ih+uPZx=0z-_PCJlu~Kky&t0>lu73f~`fHqal& z)T`-vcYu7t+jAEn{wcTju`o?F+5?^Zbru+Z$kI%hFpNjH(uwWLitf&&%KY?DHJP&3 z3;rN#T26@aqBE+HvF~l5`uuGcgS2zbo0l2g{3AvK0=z-&{`wGfbwa2$r!e69PW_r8 zWd16IYI{;qEWvlXaaV~9FK*I*_f>jcHe%L=?uQa{Nu_*V{tp(8o{$eQYOS5cA%_@s zJkR7AcKRLY!Ji(oE3q{6@h{$?1Cc9}A~y~3sLoc$k}O}R!^N;&oG?baTIUGf1z%x) zQ>(fDu;a9QfBGH7Sc)uq!(gi6A%cv!q_U;`Ks7+O5!kaFbU=nI!$zC5sYn3G143H|tJlfWGIVqatTspYBMq9D!(o0ODEWkU+g`Y#cGiaC{wcklogNpve&b~orv$K^+ zbcFiolZgz6Kgq|<8K!EM>av5E8U;3QR2WGXs0JAJM)q=#hv%|GV7_nfkMBD-cw4I7 zS09(1WFHxCg;_(Nw(*Id95S*dOu=(TLI;4?@R!y5A4K z)#-AR{ZT&8byE>9(7Fwe3aLKIYvQH+-Nc=W?fJde$vqwqx*Qaj$`H$G-Gl{_#ZWmW z8njy?QDQhsmBBzsPLnci76l63PO7`poic%HuQq>OSj=^H86-v}J{|!Nv*P;4yv}51%*LQO*{y4#H<^@%F z$?1uu3EULo~U|SR0uf6Z`$8KygSvuF=ya$&|6qLIrYJ@>S1D@8_BcG z#XzNuQzL@Oxa82e)u3LEJG;$XZ~br%MxsCq`NlGdm+hNP-y1_^mBD+~V# z)6=wGNb={=RO`?8L2jYuzssl^%(d(tV@@^VkSq{z92XJK(MWGYbj0a%Ls zenocsW%vu2pa7FOEWhbeIVOeYlG*872&d}$Y_aEbUFu2a^{5Sc$(YK$qV_8;=oQ&W z_f5kb>v$jxY%uZ8Gvh?~1=o!(a#>XI!fq2dA{L|ZwN4$rL(+@1N&FN?qSE7u5A@(= z-A8!MnRKCBY}4nN0v_Y6S!O;c;F*_cG?phNJ{h>#sX0~Xwg$vtB9Q0Qhk0^ zwX(K*Pyu%UF5%;UeAl?F!Sy#RI*MI?z7NS-4f%ghP>PRh+uvG#-;}Y}!_C@R`>;LQ zeO!KNKb7j-0kJ$kul6JVOm{knz>E=Ui&`M{&{U#G=?i{|?yZ@>xo|lfb;Kbw-x5mY z{D^Vp+k%oEq3jm;F6X-M?7@VkFxfG>P+vD!Ke8_MA?~WupdHrsloTs7b z>K1nFs*dMOk*d@b$n?}_@9S_vE>LB=QW6q<<~fEk|6yGlQAAZuiUQI1Msf0Xkjo(+Xozivo%Qi*R@Jiwec-_dtc9%GZ zcHuq;1{8|OdGqy(eYc~3HC5pJkU;cI<;RGBJAGfpvAyd6`qN&MD1BC?%_@`fa_g0* ztwOT3?O3@^)pmS86joqXK1+_rZ<#A9QLOjg1)>c>e*O}@hGzvnd|EfYZ^TOuC*p9e67|QBLvQWDIauZC!YXD4vCEDgF>gq*aBzlf1 z0cQJnuUZJM<@CI_fNCFgPHF9XgTrlIXPY*G>ttjx+iR+*fh{2m>sY0|m#5xWZuj+ON0 zr3p5`1wCrduI2a7(=GYo9IX*X9M#0$%PYuunx0jCuw}pBa+bqgBzI5eGK$Z_t|3Bu zBM|1Wywi%mXae1m(54f|@rTzBrlrBjNdyXsEd1{R+>q)X&%>92&2!nMj~_g2Fz#zz zus<*ffAm6GdDBo?@+V=s!nYdXb9-gKIHs}-p`i<|aMcmJw=7VMLnZI@YRdvk*oV4a z5#mZ-jeIKDSCDLXhi>^o#5owfoBw39X8`X}hW~!E*w7bF$vDR*d3`^H4y)SH@E9BP)`0tL6 z>TD+N>5*Gp$z_1{=fz-CzFHO)4kGNPw3nnQ=ebP|*Pj(4pT& z>X2?fuj2(B``1^aAUk|5;BW0I&okzcqLQiFor3b>VhsJJy|XcsZ_pdGprlBThU7|G za4A`l-6oSnZ{hezs}5NP%U*=Pdk0SbV0ABtpthRL1zK#st7Y1^6`e7Gs8#cAPU&2)6x(rLajVE(1H7@C+i4~qUlD6>!=5;id&*Y!fP@z?Ek=xhGqA+O78lYhJ?eg#olb}!{VD2h~7qRvz94dh^y3K{7uxIk|2K)c=jMF ztvzfk2?lQ9qNaz=I>y}JHav-4p{jnR$};%nC$b zG5EMkf|`)}XY{6DXSX!n&2i39rQZMF)hk}Khpf$& zmtM**++uz)+iE^1(owlSN8+-x5NI9#n%NAMlz%^5+bQ63v`9wV9szl$!i-7mZE50$z~|LfMhyWx{;a8WE&d_#}q_`^*dI@v2(DvMJ$Y`)kS5vpScir=hNpMd1HI-h;)$kyoSJ3 z{u4%4mfZjDI{J-`4wK_lk=~ORFADn9ZBk*?f zk1v>yEKHuM%w1>eKssx4GYzLd4;`KsJhsv@s<^sbP}tX6`tZEMVe#W~f_$AzD4*tL z0?X~pGhX%Y1d;c}wr^@@ONfq+zeF;_xUFvY?w=nTrWS|O)GKc3J!HOSNxX?K0B=$s z)pt*f(HFnATeolhWwgOF>{ab_-D<1FS#a=>!Qxc#u$UTlBVn2t;#r%r(WgmH!_!eZ zM|ZZ2aM{z+%#`XK7NkRPI*)np6dsldhGdOfRa`}3`?K62cj)M!yBj$%Cfyn1dU9HI zcnSJIellUY|1o$T?{ES0xV>e9GO^8WlT%TGZ)AK#Kl&oEAC-5m&AZXyyf#N1Lb^yP zw$qRgik2Wp=PpJ|4AE2?<3c80$c z%ZP{7Q*|jP(K(c$rA374{+U#csQeGUaSQ&c^ZHP`CEP9Z{Sf||y#7Jj zSGG9`NR21|&bUS3rN!NieHd)v`4;Im3aW@xZr?LiWfcm|(#Z)#R=qN8jjURf#F`

z!OF7`GLtL6Xt(`US7OioYl2>Hj+A< z`d~N(B{sorW!t6G-}y;cD_#g1$k&)aiP< zLF;~W#TpEQ*plF5**dMn`3N(6unE`%z2<1f1pY``#7QS3PnVzwv4rX3Qk z_(z9Z?rgpK#vhssc!BvKpCiRJJ31+ps&9Z5>!xB?hFF?5cP(1Y9zbP8exy^8Q2Ei{>K*sP^3gbK)^syTDn0gX^<3z1p(=jlokn-~Ix|9u|r^W1xP_kDI|&dh6OUT2QkfNr97tS`~(Xo0#+ia9xf!2h0rV}NnRF;Sgcqq-VQ=^gk)88Dxf_-dhI4a~!;UewM zl*?&f7wXJ^=eSKl)y$^rzR1qcTt4ZJ8PuJc4Ao0gE~Cr-is?;5#f(PnW1RPGi3NSC z&dnWA?#Jgk`c?it99%x9+iu9^+{bK>w`-{(64GhT((s;jtPfG{U8iz4rMe~{$2s>7 z51a5_q(wPocuV??jT<+?Tfc*%e-b~Rdj|Bp7&897a>$}{|Fh^E%q-qKHv$w<0y=1(#yImxfoJ?H3>W z%SNQDW><~7{-48^EFm)t=Wi~l#&bsz10j5L2QAK)R)n50*O>l5yy>)qT5uRKSWbFo zv6|LF(*FA?&;f9!*j3CK(%Fw?aT+-Q<q)@0)=cgn zGRO|DE@^J@uDhR7;A3!`UtN@?3Tl!6vjV2g;ronAW{)Yqfl6m3=R7{Kulv)`W{&^a z{Ser5yXA=vljk1ujuD4U)g8d4(|(RBTW*8P!cEV=3<^iCw1awxPj22Fr*b*>P!L%s z2lPA9XJQuvgvWxTz43(?uiyJe2sz*RP6Asuo1D$8YTT>j?L$p3uK9U>H1CX)qjCNP z!}?ooz_JpUC!J`TeI#;2hCh-Ya(dt@tI(V$?ZI@E6KL`!0!D*P4ZAS5C2`m4J^#MJ ztoY4kAf~`FO4HR2+7ln^$5tO9Ino5_azLr>eqc^t|i*t z2>4uOl)b?_$F5}89qEr_(?6!q&&pLPa{UAlzwikWOF^Muepkf0+w6`N0hRgOZ;SRE z@tl5A+0~@PB<&&BKvYxRGj>S6>tv-<{-W>oyRTH0)(54Mu;K?LtltDsNg1`bo!n26 zBYlOV?&wCDaXy%msBN_yG0VRg$PUWGN^eB*330q)uWkMnqiKG6M@b*o;&&nYWK-PE zBfjy)XE}Gp{Dy8mv2BHh61TLj2ya!T*-qol3@GkdVp|`Jj?~_@*M+nI9{T0yVI%~` zg(2?4J1R}O_PeFvqlbjl^-N^2V9V+0Tmim5)wBE)&y({C_QFT&YYq*#Q7f5y0lp7)Ozf zRPtLCx2{mWi}8U2P}4@bZHU^lZzxe3z(+0)WPbSP$FcAe*-jF(*gU%{-+H#U-MRrJ zi;ZpOWqfVv&?sayRY1_My~f=+j_b=lG(Y|Be(GFQqyo5n!@f^ZbP8luFph%neRnj1 z`KO&Jzee|kBaAQsgl;EY6lNPq0>_X*rnp@q7pFO8LK3Nk_V>UlR<_mf%$Cpfuuf(U zfTFM98&S)S<(EqTI>`tMS_X!VeV{UB0XTt?%&P06*QHKHN7z(oDiqvmAecNvIVHXw zziN}pYU&jVZ6w~l4m_|BRV|+5*KP8GQ*004)dOiHIIs767u7$PPkGNU#);EZ4OvG$ zU9VdH)2hDuYnT)HSev$!buAg7P@ol;YPG;55{@f}Y%BIMf?|H?aJXz(tD=%h;L`;$ zS>if@4qe7?(m_jB=(G33K1l$vxVn0t4XbWCX)y^lUhvNZc~&xmWf(krW?$o`cpS08 z`Jk;U9D#A`>2dq(jvCNKqZoIF`C&NWN;wsON*?L#cS*@Dna@60U!zOCn7re(`q~%^ zU{H|L@4tO>TnHgF*tTF@^>J>`t(zZx^$yp0A*~P9K%9MP0 zd;$%2aRxJX0frXy5|v4t%c=>c_4+=*w0!1PJeRY+-0nB;lh2kwhTdlH=@)B!_nFGl zLU;-n=BQrEkXMB~j^XW{Sf1d;$4siJ-yOSJb=TnE?+0h`lKKUR$Lst$!cuy{kpiOD zmc3A9p*KU~`&+3f<3)ln!C4)mToZCpSBSyq%D<;RZ8|^rxR>j5lo<9vQE^VLyz&A6 zw!)N&UrZse%7wbE)vcw}oXHV7cO)xpTx)8~YAlhjJ})7x9{x#ud@Quj!z8ozfTaQ( zcWfaEB=yBd0HT`nd)moA{5NP2mwDogO&y=hJ)2)AL$LKHz3&|Ln0K;cCwpTmdd0VQ zjcAGHwq-*zS=Re@5x!$92*oxP6&WeNltnjJcHz@Zf%Ic0VdMn!9zM7l&lO@#2AeEf z*-&)bYv&s&E@>X;y@pBPF;>V5J-<5!j`YCX0mD$>TLycvOSZ53-N5;Ir?hs;pkT_2 zpN{(n&W1jP;Z;jCy{s-QxZz^){x8pOw!LR4V?R0q9|aT;?bn`R^>QUGZ>F;R0^rY) zp^|#ZDGiGj4SNM}CYo=k53nN{!Q|0F6#K|DU5|!E;Bj9$Sb*wlowP15j%W6o@nB!9 zle(;ilP$eVED9ILMCjv9NxF;{%VsxhLO81++p&u=AjQd{5}fH-vA63x#9R&+(}#;W zslRQObX=rFEZKmiT+vdE)nDcLD-4wJ-2FZZ?R6o@tkrGFYFoMwus(Fv)jI9!F1 z2>h(goIUOp(mDLWS>Qx+craTtwt?7e5d61A(U9Zp&8SN5=)OFzkxh`mw}Wr`fw{xb zl^-)$md0-Q0=`>2RaicBiAH|UpNtJ{V^uXnCL@MtD3_rA(p8A7?-MXHmRG2aCXI0bz4QT zl2k0>z655}zq{EMswrMs@3qejoac_9%0j(W#M1@lc$Gw#BmyyAoQm%8L$mqIplI5^ z?e>TzdjEk||Gln%}@(tyZ zAXG3NkMxarcW^%Z7lDUtp!L zPw(*7;aPXq!;M?F4Pw1)edW5YW1Tz69pK!_sxoYu1jCB1mJWpPo|g=P<-B>IvM??D zY0#+SW7CWNv3DK1eAP<>?(`tt4y@y7GSxHA;O%ogi-KI4pUnG4`&Gdcejp%e5(%V` zEq{W?l^X8$*O1+__2RfW7kreyDyR^3WyRGgmEic3)rr55E`&cKHsg@PR zXHA+^fF+r(!S$5K`S8vHoJT2RcP;=*zNb5lkWk{pX*GjfY&18?B>gfq+h&}s`^43R zrwcN&4+$>oj0@VjpV7t>f7s@*CmbPFO*G}iG@A;6^aqB##r{|m^$-#9X4=g{SsU0* zdxEvwrlr=}fv$IEHjR)~?B#pnFA1MCT4kdf6F>#!K1pSIGvB&N>j-D)G6-pmkb4kzf~)$*s!ptzJ>rRauc^|31qhydY4e zxCgU{8D0)qo9$1a0QvJHMxYs&#lIQD?glmgHWavx^4%LDjw?sWpY0@vFEJXLzU?lr zcjg3+hKwvM&xP%D{inE=z9xWm#!5kH1XEY7O3hT2tAlzzN9qnf(p5dQtU_(`GG~Q9{}x8 z;B&?KV8kB@YJ;k2mBbI5-+_G?Jb=nHsS2C!x_eR&{#wUPU>#kr2Pyj1k6}F)vaj#k ze>{K&rTZzfkgKIWM5x#24m&?VlK6)sG6bRrry5UdQfl^Zj%aC3vEliIaa)=7C+RMl ztuw*^_aIBD{xuvuJ9ZGFxTY>Lu>uuw%7}Xqk#*Dog#AU1Knue zecs^wzQ*b3X8ar}G*xVXOc7pU@!UsvPqJP0A^x6Rq6wL7!Xuta`JEevD3QA5ix4f7 zu$%w(4Heio^cMeBH)wG^#Y$MOBz_iGWKraw4x1+V9{4I>dwTQz)Y?uDRNGK+6xhNy zJ^AuWc;Vm@ptr*ObYt(UsXyJtpEA)NGFf&!5IrsJ1n%YMiQ5@k2sIkSH=70m)W$oQ zcE36*^QsF=KY;Q%>Jmp{^7q&4++~tPRTi?*P-zkrfb1KI1nwK)ufH0UbkV$o{uaSa zLKN0-!D)Ie#EjuUGbhlRtAd4e{#pl3DgHYi#IrfyZk)3 zs^-&g?aoYmiG92LvrH`KFFVomH&%Ck6lt^ zrHoRZ{^P>>>9XkOdUd?caka16co}^EPhG(VHJ?R$58rByWn=cq!J2jKMxya`6m!bh$YVMA^ ze|J+x`q1+ zlZ13TlL`G!mu90dY2H6|Wnpl4MQ;&|gBu#%sFu)Y>!Tvems7F35}ojVM8P_t?x(ZB zsFcV$b&xE)!705~Ga8r@a4FnSpsp0Ue90@8V|(0OP&**#vpAtqdn)HQ-mM>Jg9Chv zJ&$sSt|gKPk$C)c?9vObj-^ngnd{b9jW@mdWD8sN{S=_&DP7RR}Rn7hSG1BS6 zlbm@k7C5*4#Tl2CttC&{MA6eGX93u5n)9o|wPFn6ToV+kM3|KK$B#o2 z`e**>48l^MYd%o5ylL8uTb5pOj9K8nfk*a%YSG5~m!Cny7R-h@Z4qoE0xYPVTVgBS z6psATE^PFB8p5>8%cAGp(Fdsjq$-o__RKD}(XFoR^$o4NZ)y&O(o}Zg^yB0OM3IY? zYnR!^6+*7RYbWb*fG2UBX4XO@$MC;pK()~lnmd<#>_ZKpfbiYb!_(s&>D7DQLYIEHL#m!zUjQS{aa{h!~1e1%JH? z9v}hUu7Pc5p%+@yy|y5^k*)EyTg;Cu_2l${V8S2-vp%A=dTfapsQlXn?AU;KRcpj@ zHf+&+ws3E_I&Z*P;KRJ1=TMKeEzIx9x-O`sYR!0sV_^e`ZX|M0PFVf7*T)AHzwEn+ z%>eEXjf~V;lMta9t3GB0k_GhKvuXjuvWw(>I68$%n^7-Gmo+0_2+Tk|4WH8|Me8}D zfpD9;;3U%Bo<ex!?zGy+j2dndxhRk z4dkUDs!SuoMVKWoX0>T+8b$I5QMgNG`% zcRH}B>e{FBMdLC};fm)7_)e|pIl80HPyK81Dqp??<)O&to&>jzn=;lD`$3+#n^IDk zff|5dAd6-Z7u~xb4GlQgf5z=lkkPO#kPFQw5MfK)Y%YdA%4J!qIvhrCz5>q)OE0h( ztYIpo0+RVoy36xWRV!x#eXam)a-H)Q0${}t%+J==c=mq9>+Fu-%yPC9yAN+6Kco>r zCid2QL}5eq^Dq#q$urz(`->!hVdnIK1AKZ1_ie2>mo4V&Pogf9>cPQQyxsrmE9+T+4=>M!i8 z%ARTnw518WYgGuTsjXtkKU9?J(yo&Y}h_BrBhTS=KW15mfS zf>qP@ZRdQIMx!FF?`fURPu!(C$BI^u_xAVwm)6>-ZTlA=1p!m`d%01n)6?jQgx1DG zH!{w~xDU{;$U)ab7LAInFJBf;CX?|B>RT?B?0_M1fb%p-QY#SFG_K{z{cXtmVCY+9 zvF9EB`6=zmx@TlL1m*0H2(L_8fxf_2pDuP~!yW^ws0K= znO$CXX(zim?uz#IIdLpZJj-ip-r{z7=FD8Ylqd_6Xd8UH(JUypDf; z7)NmNJILUHGCth}DONl+XK)i_ZVZCj(od{zUS+t%V>2EJ57P=vg$(*$YQ#3vNJK#?Q~T#eVujI0U8TG^-yfli`M~`{b}yR}PLG$hHLv7T zJvF;hy!9o*g!J+BPi|`vQ5n~ISh2cBkXNhV+813$CfcQs z55TumF9YiXx5G`Erhhbvs{JMP0U+9`ohTr_-t$lH6F9<~R$clsaD>=pW6)plU=U1N zdLTEZzghD$2O91No4>`*qP#2*7_?J4*h9X z&A0NLd@tiU=>{NzfFoaE;(G3A0J`&QwnUJHx&j;0P`9X0R6h8sC$CG&8r|@xt9Fy79 zD!`Mxk_yl!w=PxIRjy5^&u|yW-##zMt*<+wbNTq@s+4rqls+TsJ+Vk`)n;R#8Ea=4 zE1hR%eAStDqsZdpo|-NFkwQJoI{GFx!VyB9-Q}AN?*^E4_6wx^JTB+Ey{#ZWHU7XZ zh#`+9U!JUE%u9FwJg@--lEw;bk}}K(Z_+eV!Zg^3Ljl|kSf}R5urA9#tvpQ>qwnmX zG?mDH^9fh82#A++@|j7D501EAuXY=$#+ly41w}-#(v2r8qAxtds$YVWms14Cz1~On z1&;&7(vwPq-7(fc_3tZ8=E)&9sNeY8sqkp(I*+w&sou?Z>Sxjw z3q^Eei)%R^@2kNrt${JFwPyr2qT)sj2iuO+V9Dcrj{8!*;LOd2Lo2Di^YSf2 z498Q_+!D$|NsPi3!-Y*GADt4{ZE`S@fy5)8Xz4sSR(fT!Yxn`Qiwu-&H(i2jLj`8b z#9LIlsasJwQ6GHpzbIGg)0zlt5M)fzS52(r|uD<5?h;P~#QS+R%` zg)i7rp%%ea$%i5aI?H&7v7N%eA; zj$&nW!8!1Qb+dcO6GrZ+HsR@K@d9*SbGTE&^@3#+Jp%Iq;|+>IZ7j~LxZ!jRM9RX1%omQlqW@GiIk_Vxs+xp-Qm)^e>?x zFgS!L%fJn^WG~aOxOi=-3pS{k+FbcMWHPqaa7RtSJZmIeF0VYTX`#>%UcDzZ*?OGr zWIVxdY6|?vl)ZlH+Rb~_3a`cfw&XEgPu`hXyXn0NaZMx@>eIB(!s?zCoF7O$s{Hjcr0=Liwpb1@xyrS{5sv?3^H-gPc!_ui2F|nSOJV8aRL>sNKu5cV~Os1$1Ie@(B{iCKb5(3dp|o zh&yxycYH{Q({aOPOh~+Taw6ICqXp)oyVy6;%WFid{HdhcLGR`{jFv<*J`{Pb5G%On zcxy3U^4A2#KDb=~<|FnaNYK1#htG1P(JRfkrp zD7tuuP~_xJG-o zEE)_iQ|RYAg-R3g*Yk~^CqD5-;+Qh2kcG+j^e7#bb`Dt^qKti!v(^u1Pkx606u7tu zkzJlGf!Rc_W!$Hw$nv%?&KJ<&AUw>+jOp=4Iu7G>x<;Revf>n<=|P#F$Jc_@t9u#^ z1_1RrRJn!H6g11wW!&$$E1v^*>;!_=5Gm6EJ5;0YJFs;8aF0Mw_x+8`wXMYT-Rqka zkZ^B9p#7L1OhzeY=DRy@FZh5AYAOh-eMr!@6cz@tnQ+K3Kig5qA2+ov<=TlG#3%FDg>b3> z-&_WiW5 z-;oG(gxSZ8d38|!Ou1T$?qV;{LdgcTfUcz2O-3i;?e|`s{aSlTibGA&fCvei9n-yV zZ>%Mv$;TNYR=rpW%tinB%=DN+n8N9xV70<)(M_XKzwkukpt9@Pr$1DOtZOfGA!&kE zzEnWleM)~fq9{ejpY62dsIPqjDh7}N>h3I8r{(dElJDQsKD+fXKpO;h|x z*38DMGSxmnMtVT2ZIh`49`Ogv`+i3rq$0z7Pxogz+2lU|IC*T;Z~hw}jmy5-x%$xx z(cY3Znn}`iJ4r}k?`~)$54HxrpofCyHs~e|J3+*X@Swqb!&R5{v5J$L)EBAMN{oL9 zrV^;A%2zA2D!|_(+1r=#%$xRCR>jUp4wAWLuReMd!z?KZRqHoCT4Pt)hx$GlW)ZEF zV;$>{KcP0x7i}>rMyEHqh#?4Cs9h|QrQ)a$T6qa9w*MJO!pju2gMIFA%i2(IhgG%O z-=S@t{{!8p`2A>J`ne(aM_V>1F)x_ncVI9A#`<>xv90`V5wM$=ITlo?(!`h`4P zn_qQWo%}rJWq1lSR~s~#4`x%(b6r)x=1YgEBCe4QySIE;+SoaYG z)jon!f~h^DO60$MHM@mW$qaBIkAj^<9^Kt!4heW(EM(id@A36oiF?C#^8~FCH9k{g zpnL{*Uz`p!lMVJqKGtwZLwi;)*=?(;3&rZOPx>6W-C)hEWij)Hw3+$~9lAvvR2Jl8W@~u58W`0=3(@Zbz`I(;qR$Ko5r4tmPT8&BV!-XpWv6P5eBU-FbjMLx4T7@FkO zywv^KKDAwbp(G}r`}$J9v?=_E#|c6~>+PH1vJKjkklFJ#c0fA%lUs_X9qg8y-9Gwh?Q+H&#LsRTuz8JD5VK2T(!{7oM%^hJn}*YH5w9^!hSQLgLm&f z$?I%#T*oN)ncKS#W|7UO;#RqD{AXD4qLmnM30S zRqn56A2rl9-{!r%FjL|!@X}}ioxz%mVYWhzQa1BC?k27ce<*U0D1Z&a#m5qJ{Q?|m zv!W*i2V%emCn%e@%OT)4Y9~%o$^UxX^0Gr$ZR@Mei1>ERp1*Qkr?g3mJ;LOy1_GQu zo~1i8F4vA9a8|Oyi>$k1E!(=-D~{b{O|okDw-9V+c;&}sZ<=6GfXtgbwU{2vZ4U{t z7#~gx2qCnX9?xx81phXEf=UFPF?{Wkox+gG{aywQ#r#r0U<6(h3>*;X@@s4Hgi2ZI z69$1wp{*(}?%WvWH)2?y!T;ED?RAIZIwmgpxMle0?fhkseIdRHJ{YxN`UzlslkB8)cCS*o9$v#?(w8*#obqcnSnrCFfYNF0Lk|D3XCuCB!p>@d3=ib!C z>e)4LSPABL1%%JwqVT58ntA-oEBL<1c>};Pbdit)Oe?$EwS<-BsanO>C2L04wF4nz z(2ei=lQd2Ws>z%mEYqRt4u0j=oTU8p(sw=8#}J1Usa|H01qd_UtESh5oL(B5Gv0P$ zvOY#DnJ}@is;a(-Y{{oNeB!hA?!>0ylzz*AzVA}cQ7(*Zw`5_@!*je~-ursV` zW?*c=MvqDlnl7AtD9_+k)`h%BLfdP!as;zy42EXs( z2d|=iOSgR(LX>MO43v-6y@=z0t;=S1W9M_gviIZpRTR3;iZrb0s+{hlG-`S2r_4Cy0WK*c4^c!9dil$To$$?3i7aMp`RFK*e} zt;`UQ8U_mkM6upiNQl?p)y+`htF`@h?giEk&2^e{ z2!%H;$|sw%tpC5=G3USeP-bn;Xc-o}W4W`bb>xW=Z8xWY9{&$VsyafDN`a*i>1XBI5K*A}rTpT^o8%x)F3>hgEggW) zN%KgQ&8zUaF{RR8_5s6GQ!KOF=kb%g-2R^zXdhg<_fZ=!L3*E|KjgNOMn{{O-YZoJ z4z9v{u$U)~I`=*c?t1si?%PZu=5IYJFA~--De^hPpVn^aUT}l3N42@!<$-@C@+ad1 z$0(t`%odTpI4qMA=B1*do|$2L@wq+O8;N~L;Wtylk?OUMC;BhCp={lv`jTWXxP`IU zok7U4ec6EWI)l*Cz|~3kbjNU@tD#RGwtqU#IkRy_%^m{UrzwdnW03am+zv7yjMiG) z-ttf`;n!+~!Ms1U8BJc~pYg2kwQ5I$a7&`+f&t>4Is?rjjOO%mVAlzgt?Qt?BIDej6P^`uXY2raq@pl!n zMlMy)uysqUCbXd#5~RC&1OG_xfr)5!EXZQGfolO>w5QNv0_Dg(sSN*nTtL|hn;vFw zveaq0tJvP)XQXWqfM0PBb)uAzsYd4}X(HkdxfK%CERC!L4~(&sP+B4+F_;0EneazL z?Gwah=lnmzb^LHh;etwBhHZ+zn|;mrs~f|`N5{)q`9b`;9L2WShV;L^&5!(D531!@9=o+BjzrHSWVF@{`={Kc)-uJ>tXrCkb7jb zl^s*_<^Y9}=lrZ+-;s;PwE+k1nsnT<)tD=7*c|+yYfN=o9gxToJ}N#@OneJHKvG>X zf3R6hP+RKuf0m?tbawva(gSHeRRfBji!na&6GX{(KR#RZvoXRg{T#34=hu4HG=s*i zG@SbkqTIxTwV4wBTeUtav6ka^=Vz+1oXz4Y4`p+gHx~Px2QJ;tw^jp3Nxl{r#e2@N%AcgsFG(-M{{TXzw1O`h51i*Sb&D(-u zlUIw?_*=vUeT_KoD&Sfq5%_T6MfrlO9}iNL7L`yZD-CXl}97el35Mv5I zz1I`7IvhwlupOy{{YhyjcV}fHZBxHTY(DzuSo#23)$gagIUfC!C`J`OQS!r2aX_x2 z$6p~Z+*-5}WN8P6R{cLid-ma{12mnBMEz=8+sQB*i7@Az&2)VRj;g|7IHc^smivD* zcn%XvzEB*WMRI_59^q((bQ0uTHjIOIjT~>HJ48vddvTK}j711DJMHn6`!1HQ|C#}j z`i|5E(a<8)cf|y&a4(KU2h)|z3wQBkw|(fOOVbiIVp&HHUsRuC*Dvk^e7!yi=M`s@ zQUaY@P|;rKEqFSI^|#_XP+;Vo!Ku$kx7&zbDO%rxz%lGd z3SqynACEeF)<7)W?+kbgsgMe?XGJvh0-Q^*u;mg+l6PBb29j^={MXDws})8P{<(vV zDvz%K&4U}4Y$s0zrX211Caya?AQ6UWk3_N3AdP#E?UuEqm+SH+9|gh9*K3v_|1!rV z(R(NTGb%ave_mc31}TG|&%5<>SqE&EkM1^R;B-=_LMY|ZC7-7Y#0(#;d7sZ-YYp?x z$zTV014K`MZh9*DYZ^Oz-G}2d#Vs?iJ63Y1ywh6-UjldrV_|;$r2i4xGWM82;6^~bL9VAT;K@x=F^Ft4K9?(>z5b)5- zaar=5l7@?PS@I6Obe%vQX7)9Ik0W-lx1E4PB+6Sgq@^PEr_CPtq`0;QNOFc~F@?By z-Qpmh7y!OiP0dSC%EYq^3x<41wlQaFS0uZio8fQQWj4zwJKPA6;IsyK=s`D5);;^B zpmOw7DXEe?)eTO0s3g?==Rl3^H>oy9q?L`plVi_+)}=LFQx;l>p;c@+$Gv@v0`Q+; zb0q+=VmwX6LK@%KUzfWMN_)UFgo7GX{io+pi3Eg3!6`GK_;Sf##{Bgr5A(`D7(Y4u zwP9dB_p4i)&(u`cUc&q-7+c+JvU~D`V$(NX-E}EG%~1>Lx%j@hDC-+oX~cX4iKPwj z&ptA>H#XAqT$D$A$Z)~gE%2WEts+8y{K;}`MmhniD^z%{F$+!3Rz^7ru>UM z^1~uc!zSsg||GQuX2#! zyM9Ke^U#IFkyucLdkzwS-qrTvy}C8j`Lw^1?E3)7~uxRrj@KscNf`MD_E4XOI}T zB@3-Br%r!sZNzxqj^4?2f#H8?DSaMNXPDHkFQVyhA}k4IbF&YZEhjK^EUJo%$-j51 zZ9s3HkaisI@9$4lhQil#8Ig*}M3b`)#1!(xFwbyRF&ksSi(K}K!RK}QWO2pG?zHBH>Iy7vl!w$uM*uCfYCpw3x!DIBYYDBb%U%%L_&uu!>a8^->F#46hT5l;4tkk`Q zsDF!iNBh_6`$rQ?BarIPy%SoBzaBVrb&?OX1+x!5*PKC#vG-08HPv)B3e4uW7xKXf z>r(lnycJRt!J~X~*QTowqGxM(j{SeN9_yPc0bgeVayBR@CvuWk_5pA7I>A{)}-9*=OA9r*8gA3wu0F5YCFF#1$-F}#Vhrb^@%SRKq zDDJRhdHHWY!dhqa(5$jm`gYT=zsm85|vOs!sF!-k3Vig~ZwOwZ-3+3P% zd3P5#^|&~P>un1)U{7`<`C5v90reGD#^gTQ5>IJgpE#QflC6{%)71g z>7*Xd&~cxi65I-MU?zrHeZKvJd*49a)m=Wrwhm7EM08)BQeeN)8N6YK6oVZbxy?(+ zn2;;@xupDbG=gZx1`^L?KNBH$nUW8WwuX(m?|?uf{s+Rc!*$sf;}ii;^d-MTo5{KD z=1+Auc%#4!)pK(jCFW!$=6H+2Up%^xWbuO6*A)HlYr-4#_&nBlWe3m1&We85y^22D zS*@r&=!NGN7ptIWcQ%~imMeo_{1qVG)Q*m@Co4wde-5>3{&{7m~9%sWFXM}q>C?#Ha&6lxj=U?emdX{r3 zgx}Whgbsy5D??XFiQ75;ahORi+3!x@-Q`51EZ0_DFe1HU$-PjW=HKg6sJ3v?S>JJe z@97X3mEH0;z)SM!U*#!`%|;37T~@jyj&%~qmu7W7xyyyJPu?mgmVn(}18{w7S2je$_uJS}@hCn3a68ZhT?WC!O9QIP7fFVIifoPHHJeM;zg@&Qi+R3?F~-Lw0J7iGD- z5y`U}p~}Rv@T?QOcN+{ej8RN>OuJ4%pwZ|V=(V%fF)}<%FPo1-O1PY_k40prXw2{! z_rnrR{%@&GrfwnBIen*x=!B!_EwgKaA{Ibkr zZiA|F3%jQ#vGA!(!$q@9?Mc8^f$o@`^+c^=gu1qNZcwjS*Sl!!(xHEBXMiFG+1Zr`qJ_a%Jzv-oirH2R9;_N;BhNi%0JT4SWC$J^fj6j#)Vf5|^Zl7> zgwuI0oG^2{8h9uEg+L_s)wBej0)xOO%u$0Hj^lP1(I^gF%m*vx zOP@oLqEFq1InL%T^m5wU{djFB@>4|IbBoiOoL~L#+hF+Nvt&fWD`97vK^Hs34F`?r z0>iGifa2hD`_YUX_o;mA2>KK9Ww$dFF~mDa_YdMDBHkQq4E-zg{revLTwt%NImy}I zI%o^7hKYXn4-+d=e_&Y00^>+e%M|~pO!xg+DrKhc%>+yEL+%~@u7qOqf3I+FDH9XH zNv+ z#A-nS=mo$8o@~6zCtV6t*^&U~ouN-`-*|??r{cAW+qgL=5lnE;n?J?pbWZ!yZs5W- z!?tkRQ| z_`P({G8+4X(95{oD+DK?^OW4W_=+*NVePATCx^|>_a~nuNoSPKtVE^~JC%ZbF z5t#kjJ(>FGY!2bA%Jj8ZkKE_eXNnG`^~?z zCd=O!oE)xXJ;e}?fw^CWzkjDYdvEqsEt-#lqxC-rqb+P~G&RC(1UHvk9Xp3V-U@0f z%{LrfuW@tVe9o$ilneQs89+#xTY?E2d@7@$B~06AIpY)iwkM^4Z>f7EB8yq$U^zFdIX{Xu zrI+oXb;`|F6t#=pIzC1KRt)RZq-V%OqQvx8;`k&r8gZG-mru_2CSvzD-GdHx5}fkC zFQ*S=1g!j62vzCJ-`qrxjMX!9vV<4&c%$NOxe z1P)EcR6FCu#)5)^F%dCu*Dx{f^BPmLejhJPIV+?XpNnV>4f9oS!Cmzpd%tfW-5{Q_ zi0mAN&l3I-r1H84%LGT$0U?P8k#*i#AXH2v3iZpB3dX(<)ornlf@==7P3o>miku-R z_7SFVo4txv!o>Y4v2(>e@_Ga_+u5L~b>oxh!H11!1+#9Z&k_;d)yA*7#DZd13t~O& zV~cHN)^O|h{|xo5)=7IP$YkB{dryHx&(p$97utJhCPl-8+9jW( z&wrBwL-=(z8B;jLz1QQyjoG+byEBO}6K@oa&}lzOs8~aiXTLw7%r|N+M2^N&o&K6ERUOB_DqE_(k1FdE zeiaEuvu_Ad?XRwt9ZUz0m2Wo?AFOr@2wI)cqfKAtMLBbG=R3TAl{j{?Woe83%xQVH zLPDA`XCB{T_Yf-ez5W)mQJcM9SgnJ`$*kAuvVOwZp$Fd`*I%+SYo8=?9)GnOgx+P_ z9bX{hjn2d+TFyE5bgw$D>F~OUf<*MFt*!P?ivzdC4;5(3oS#j1xuMV6PKMyA194{o z1uh6Cv?&!8)$Onj^kmHm-GxUp;c;b7Wzp;z+7{(8V$+!8u(T_J#GUgO6Wt+(Htvq= z>)6+JmF=OFSzu<~>bH)R{z<2ila)T&{^Y9JbYI^~PAjixH;LEEKUHBx;ab@`AktE`v*m7ZX%<>8x|E|p(buI`h@~8FF*Lk^$K{(Q;#F10B(L@41KHKFsw%dcx%C+@ zWwebR`nUn>AANJan<^{TolA!_&OPt(UcT?SU6q4>da3gjKnCX>=&?C2+=5Kq&;PtC z{L9vvE^K`F98X?dO)bY&xG1rxLE$6bp_ZZHxAt|u=VN+KU+GsGq~yy@EEN+|F=z+Y z`>4G>5eXSuQN_Q1O;%rx=s`n*h{nC6=vNvMJ(dIa_+>qoo! zX1~&V9`2Jl{h3$O7|m0UzOCnYIuN)r_Zja+#3HM!7(3AQN#7pgMMS8uM}m^*`HSe- z*gV~_>&f1mlvF%#a_LtlDD=(uxDKXV%nqma9?7Dr=dXv*aJ`h0@~0AY3}>rbCSYQ< zK5jAxf}Ku%1#DH%r7O&FhE;4ZK*VuUugdFViZvngAx5&=)l{i!7Pz?8p}HlTi(_MP zy6wqB8bY_d!Wg54-Jrga4-055Rn>2}`)e5pxKoLoy!>$7i{(NWa=D1#JFayLRltlI zc-L5E2S0as$@%-UuJvysFP_cpCJXIrTL!AifbC16@22;%tHk-ZZ7JVW!zDTDDN^($DCl55!XzS-OG!lkC1xq-0(qDXR1Fj|%W&&d zmYTQXQ~~8&IZ-+z!fuDfQhpMz`t%c=7Ze58Y?UoR6fVdt9dwq3UCOOa*KX~l&6eit)fbA$0Db3J{U`1TRd>#AGToKmwOgatW!omuQFy|MdrVL!KvM11)vP1ONL!Kxz z^KUFtno>A8&#qi)yV~3(&yJXq-%Q0^;(N`8{~$3v-8U^4AHQ?(`M2^cjMA7@53r2VAc{VsRWoR>CXG7@{C(Mc5pv46cNJ!uUI@M`XF9Fk8CgoAEa~RBp=URHU3Re6h0lNM>Jt*Lh)jX9 zY$j$dkvBqhGezt(hfkm{N_eeLmD1?hK`R@9+8Wyw!MGQ8l(LBIkJHi1nj*B*(_89A zEfIwTjw;26tpy%V(V zT&H;zm3Zpa=zMi6RdEKXz!~R0QOeSA;x?x*dXe;(v!^qxkvWzc%7OWI>KY7SG;g2!>&h@f*QjN z?dL_R^OhV{&$wFpqSfC@ClJx)4Np34nRiv{t*-CWE_Fjnf#nD$wtkb1)z2orIG0Vn zh)m7f4(6h7y|YmY3w{(3B_O8efE17k+SJcHE!#6`C)I#Hg!@Z$@+xduS6=>J=U7>! z*^B>=z4wf2YU{#AZCEMl5d{HJ0qI40M-Kvq-jOaUz4sbWQLs=nROv_wHBnlC08tT8 zkQyLDfKa4{&>;}oUGco0*K^(<_s2KJ9rwq#hMJhY_u6aEHP@WaY-<}EM{pJ*8m`L= zuSrjTixOAZ*<`PD+s%LGs(vjBH|<`dy}WE0i@8p#oLN0rHqk#p-tHTi?c1;nUhl7^ z8+_+j%;~6y>RP%>JgTY>T{3IynA=Ser&V?={9064YG4V?Sy}bsgwREQY{_YnTi=K7 zbIY2UvW+y0YYAG4o0wR8LOwU>8^G4L%#n-biTU~GcgJQi5SXIxaLc(1fYUq+!pED* zC}MrIIY*+cz3t2@$_g2^)*DJbNQ*)Q^X1?sO_?7Bw-eV}iR%%KD1}n!wnAk^MXMW% zIG><#HL=v9;Wk(Wa}(8vF-b(0L-@}va@%!;vU1T%*Op6c#m+OnG9FiHano?6{mD#N zE?_&p6Mm}+G5dQy^4Uu}i~DO9((>%0rEe`zA#)SZ5h9h453y={pPsf_SL;Tzhh&vv zwoCn#$R>eufd2&!1> zi+6;gz2Cr7~rQeaKE{Ss|Rq{AviQefyM$2@0bWc9<;+lms$RlzR z`qb4myGocDtzibOz@q%QFMzs+)@vY;h|VM36PRsp%}V(_G<=f0E#a*Cl2i^%O=hP2y_>sy8SRoaVg-vuC)8QbD*3wM!} zl*5b9t&k=vPq$LUoQnWIa6!zgNIm-_`*${}Rbb#1ue?J2u>GAPM8JZ3%6^S753gKs zg~lO|Lo#A%eCP(vw$K{QIJcBrKRrE6SIvYD-Zvy`J7&K#)TtT`LEP(&1;u^(?81zPGj@uU zqHDopqCfs>?x-pZccHr9QH4$o;`oA}|GZRGdf5 zkSeQoj{1RLJ&E5dY$K~c2@KE)&WJjn8uS_{etxp~tRo7@5lTmFD5Ag0Z+C;C zbFM!X!Q8d?aBOsy=2M6yeikhb#-5^rCf5p9lPc{ld zRI-l#m|{&TVa8d)9dQ;p414Ras-2A!eJ&&NgSH2mt`r*ROYFT}ZZ(VNY7|!meg<$w z{7sOw9;L26N3nDE)^J7=pG-x{)2QcQrWiI3r`|! zo-`W&q4DDCpAE2zkl908nX(XAh3z(CqJPvccvp9fMqw{og+Y;)r4x7*l?7c0*| zUC-pygV`w^D_+RpduPJK4I0{{E@;p9-fe}+)vZtI3Rr!Ew~5x5CU}l7ED;kToY{ zut992Gl@#ZhuCn(^1>fOt3KVxOWjQ%3RiYYIKF+B6-Z;+!>QQ(9V6g32&YLQlLA|< zU|N51sT~MJTo>TIetOW=VSe}h^!i7&WVqj{Ym*P`)nTm~FDE@dtGJ5!s@HJNF1>Dj zCiF5|t9=l)Kl*S^lvX*9ONA0EJR*PL-1c5XJ6HU6LO>ZZnLq(9zZJE3ltDkebg67nA+GJ!MV= zLl|+FvW|rt$oY}zjz#2s9B#{Aax*ta3$)Gorcy=&bK!X#wXD)-A}Cw4h4z_Ay zk&(=Z#)=moE?94l|8ykZy(|hhblBP-%8T8f$TVB&L-LltB`=#CxNq*HQpBfdo;}GR zXwqcQA8(N&KgdM|rtp%6OdHy}y|%gV!pc(1Mc40d$CqjJ+6edxBUpTT!kLUD#t_o% z{OU7zmW<`;HV%!Va-rAkMMamcOa@lkutf$-TSB=nIQ# z{cck^)5m%q9|m$DxQl{kx?7zpt12~4T41gWm@-qfoIN|)z&v;~RQ=iFoc#OHiSxTF zuL&Bkz10}=Pvj4^>#4wDGI#M4*<1%%S7l87t8u=gn_F?u2BLreez|PDRUSO=mO@8; zutT@ogdiKYwy|Ap?uYdT%8*!2qI-bS5;VKN-<kN*me$!P{GBUzB zO>Bex?AYsFe39FW#9hbB0&P9-YmW}NNap3K?lYuzZR=T+!Jdbp)j!uz?}?AKK=88H zSgfP{ou|t?9Xbgaap*#_@W(?;&<-E?N=K`~h-skuHL_+%f<#++hw3<3zjR@ z-@xyVT0rY(txhMpqB$XL;Y3K!=MxiLG=J*WE98d^qaVGq0ichTW9fSur5VxjZ1^zR zsIQXJj9Tc%EmAzCrTfweizZs6>kxfUJ(D{RM8KRBy4-sYJNw5E^7i_M97|3jW@XU) zr}p;p4Gy7vhFyg`dgVq&yw$(lyVeoBr~%8@<~`MkTi!zUStb2=q+wF5}6i zL6ToyKBw9dB4#%ybC!irtF|BHt7SNxilUKqopH`1~3#aB6nu_spLWD6@l1`~$ zBH92@5!Y%@lg!)yx!3WJINO3{D?R*tZ76*hp62kaYCJMemzErB0wz%$z(+7nR7;Lp=q@*#qCPJqMbXtOAeHOolv7`8o*8uE%^C85 zNyC~WbUM{~VIB7=P>c(}4fLOct*Ip6ZW{YYRH~AF1Tfz*^|_Y88n(8cp_k*FYbHi==U=MRUdTWrdNR~{S!>)T=_QKF{O6B zxw!J~i01IxSN_J;W5L3iVcK_tz~Wikd5L_wn4=sSJNNN!Bz98c0*_Ek$9E=$@ZBAs ziZZj*s`*!(&>uak+e2a0S$&SR7a`O312YAUm_xj`O@ z^tWf$i4F;R@_-fim9#OFk-4LOjGpZ^Cl}YXFU0k)q!Um4r`z9T>p;hI^ui5^{q84^ zIdSnyaGBCYTgJwq7v>n8mmkY07m?m`XY>sEviL016#IM(R&W6y_MucT->-HW81ysuO5G{nhAm+z}u)AC8G8dk!zS>`$}oueRS| zxX5}Tk+4$yzD5~nvg<)~S z)|i^@8dGO0E>3E}^0t-5C#Jj=OA_izNU|0mbsw^`w{`ef_l7b$Y6IK?V9J2m^i^Do zF;=*%RLZIpsEkH^DG}JbU+Q_`l$^oAAR`=W9G>*LbJ`%J&Y;*>sE=yZBFQQ@tzz=E z1aW{ohj3+RqFKWZY_-ziZtWT~!fDWoYEs42L0^o^48SvItC$?gDLwkF8 zomHj-9P@~2zFxlc9&DV|Q#N4c*^pZ-_@jyKt$5)DT^7qU{PWM9ths{`1|^x9 zfW_B-7<58lZVh96d7KO+!h>Kkd+!EYu;HCo#WG?X=si2TT*r-XCrQI$x3$^@$2yZt z-^`jpJKoeT?UYCOxPVP7J^Fkf376zWy-aEsw`Ee@6kA$u4rap997v0&Rh~F`QhaP4 zxVk5e)YEmZwh@imx;e@oTi<8`<@HlKYMP6|Ue@f+_bQkrl}%5T8Tz@t;d3k1Z62bP z(Pz!Eq~-*As57@#BW|f#kLHg11sj?WvPw#52VAQTx=yTa8JZg9#K%9ViO4pvv4n=p z%GI}aT-=-pJZc~%(&H4{*JfAFD<~280q;{iTvS+S;HKSQ@YFfBPvVQ6SVD^E60i%W z$lFH1+yK3BWsH89zq>FA5D>71Z0&NF3uK~9?{BRd%w*_jXz7L2c~`U@JTO|JOx*zK zki4Lv?9yEE;Qsh2*`0o~t@@E}p%cSh-Tw0$7c+AKsBKjcOS(%9Q;U3x80=2UqJE{e zG)`*#>~wV3;&A+Uk6nxW;KnbXgnAB&vE_@}+4Fec%om-u?Wv(g%%mZ|huS>Uk3R_&)*pC! z;VX8isnDjlR6{vP9Ya1Fm1b@{hY=K*bgUKJH}UcR1Qek81OLa#4)ahBSTL;FREdAuALklxwVvk9^i zMvh|GcnM*Rsv~#@5RwJv*^!@b1E+Qg+GvHXw{$$l;q}S|!Jfx>Om6?&oCk`~=!`2W zFLkZZ`0U72co|ZN)lZNWG;%b+{?PP~0Zv`eR8RaCJ3Vk*y|tr1S3?*J{>Dv`i$lq7 zMy^9yb6PA$m7Y0f{QPR@TWOCinuPMSvaDe)`k^0c*#=GF|U z;}RT^{A*m&kkh{fYaiY$E4QMuut4Eb>E9+Nu1ppltl;kB?I957CQ@3@N_^Lo1@ z^^XYTdE?!MVJ|6(Xs`E70;$;Z%u{p`!4t3vRkS#j_;8RNMg9D%i9Al5fF+0p$9UOw zK2IiCnZP6JgAFnEIwHqe1BM3%Wz`ejayN>{Cuj1Qyw-p;LB>4X|MYwOAj;2|+JQFJ z7yqBGfM@m`XD*!oih^a}>V;e1+)EM0yBWhy$NdkCDS&9j2kk;3oWP%J!6B3*XiwuEd zZBnn&(71K@yL6CBtWAESVMtIN>nyztHr*>EpfyKSvKLj&(Q7}7gZMNml_$Zh)cC$dj$Lqyf-W1GE2qfrKBU7pO-{k zBGMeSWyB7RS=!ec#8li(ma2EoP1#_L;$Yika3)Ar1-Z z+~;He;(PFrkoHUL$oLa~#EaT|dWiCrl5E8e34rO7ZxaJp6GFs|T5kKGEOUh5$Th4@gtgkYm#D8%VzwH`JNyS9$hI#zo7ZVcs(C=+ zh0-QN9(yxXI^O*Tg3UnmI4$ml2d(IIK84%27j)4~mohcIINC{EpHn06iOQ#^h=Kr; zPdktClWc(Q$VzKZQc}z~Axh9C9A(*mPb0!6%FCA89~k{?(;L`Td-WI1(WBQB6{=m1 zkf~3804_;oskFB#=4QU5U9XpXR8{AAjK#ziF-qeWMb7DsWdxEO*@?JeIX0_u%C7jb zu>GBl=)J)D1`n`n2JjI$IXj!^>yPsobJaIYu>n+YO2;~2&(uqnE$0q+UB%x`I{l|y zhL`#hr5xMMiH+E&G&M({I;;!5eS3ZNsU~J()&wJIt#GNVe1-tChKDUC&Y+b-a z2YwDGebeVFUgfq-%@5~R17z1bfXDbT_6@Tm)qXRQXsPg?w(4Uo#{O7&4nj{?(e?YW zj_-R#lbwsul|;!e)2k5uP5X(BfC|@bHxh7bOxkj#h&tZ8)lR)Ou#LX5qRJ`cW`9YEG0V(0Hnb=jE83`{rKS>;QD!#17)e$;CNfKS52;w-&Xg#7Bz z%fU+fumD-$swVI5bU*XWH_?Q(CFIspjzSj~tPAq;B<=-L8|t1{ zAw8>X5j+#BD8Ja0M0mwX^-#+$&fDs3GieIGw=k&RT3_5_ZBP~MF_`rEtm3l&sm=Y1 zxE6H1!#p7_p>S~+iit5cR-5Ml7ML|<2p*sCW`r2Z^>p!R25tcEUagMVpRlfU)G)ar z<D44f?)VY3pYgm*G?Lz#gKDv+Ksu2qi5 z4ciQ?Jy4~v3S6)ph@PPce&HuqymJ!&t8l=J+&{_h@c~&U0!Bh?AuIGcpVozexaFn& z;mmb6;jvE(mx9*5KAQ!R7r^no-DCZ+3%j<4KgC7Foxk_726T5EP7%)1p(>!Ni zZ~yFm=%ON!63pI~ZYVXSI`T)W@JjvB&ShYX_Ja^xQ{5tzo%O}>EkE)!W=CvpkO^T% zsm(w77C1DNf|sP~FKyd1?3ghquAmD*j}qdNvyURfq_Xa>t>MDzSQ%I7*jBUEG7Ys{ zhqE^1?x^t>`;zzfiaLXHKnDcO^g*^upVz5baKBm?8x>`#-Z1cf8S2q_7z7E&0wK>& zq(}wVf&kUke&|d$H;3%2jo!ijOV^=OJv6XfYlXdI;KnKf8UU`_+|1xqVMW8)&>M5F zt@nBFS$UOdfLKj}qaReh03nkP7R#51&Z$!NweynZnMCqrACAxi;%O@1yk%KabPajX z!y}6|F8KFy8>!GGXX zG5m$J`~)5sXGv)`!DM}Y5@4E`m$|M!;&n05FK|!tratMo_`b> z16D0ZziFjcAyxTsI_^JGrhHUjSgXO{MnbsnQC2ieoPjqAmfN9?Y}jqgj5wS}l}xQg z)CIp$i+s9jKl^F5Qy-9Fq@&?*&F<`8`Kw&um#&>ymEsfXKqMv_Ly3_}(KD<=mLNt7 zVyz|`8pTxI+|HQfFp|dnXmF~%mtheqQn!F!bnTx^LKqKxzL%gS&<{d&<^6S)igi16 zMr{=yBPGwEVIE5!0kUBE`9pU%mNGw5=u+3)+=e}^L$>I&`1qgC4qa%^EF~iL-qAMd z+8RYStcPc+`k0Q?`(w_3OP86iT=UbS>jiOVp9x=++pq=nz8=sEBKNkY-Rrd(B&7e)Jt<@GWhA1ev!NGF}Akz9#@et+Pq7Dt=*#9!s~sZ4(`v%AT6Ncgfx(rYgNS z-en!uKB<0b`lJrI4h7dq&ox(E_XJ*MFbCWjA;#_{P!s*j^V`6ITj{m+_6qLrWM(jV z+B!Y}p5Hw(Ki{40|MgRiy5_SaPUeX0aub2)cN&5_kIl7FhYY;;AhxNyBAqlZnR+ob zC8u`C%46Zh5)n8w`QC^$bV3(KSWF4=U-OEJ5JpD6rE_yE;@*__XOnpUg#}+F?MP)D zbf>YkRWk`YrmL@iFSBL7^O(Zpl3InwQyfB-m$?1v3nYlhEr ztHxhMXd(J;+KG0WsjTlq2z$znRvPX&LjfTRXkwanWSX{`^yN#i^n~meUv0-$XPG4z z2DAb$1J_mMgKi6|e?B(~JLlaIb!VijtG6Yw(cL6A*tdJfv`E1iSu|$`;L6W1RU68U z;QPtxcdP`zM6DSSIpjx*q3to&6at%FNN4lht8K{E1Hw=n&f#R;mMHWr1-1WS?Aa^` zu@@jpuzamKvZduY#C=$+sCaTjEuGxXN6(E`~ztF7I=gZr9k^pRd= zqF1N1ig|EADm{gh!#o_mJI|6*UZ^Z@K3*c0M6ErueM%E}1{+voI#?4-col;a+ZkF7 zUGXJ8l+&CiIyf)R_=dVyHWg)G7d`HnVrS?e zgH~gzLW4+pEqOZj*3+a&W#9Jq$*9>G54Ao*Qg82%g1`XGkR)D^WW{tPegMtux3CuBv(|v-hcmKd#Zwh{BUpY*)uB%xoPv? z4lZKeU6#5R1h_l_@qlc&|?^cmAh;hh=$nW}v+a z9oDcGbn6QaL>ZDLA(MGrK+I>M!&dmWjtwkV284v(I)+PVyTB`4{v$o{S1tgzY}9ai zP7>l9w6F+~&^aB~Zg;8^Un#X>p{%t18Zl|uS8nd(>N@;t1GhTTu(I;b!7TPIWaRmd4eU1X4vxKYu>Lb?w@h1aU7L6|8td z!W%@2+re+Ha(-$@pxd$+AcNI`=AYM4`_tMW^&yVa$hfch+{$_&^bFQE?~gSAhn~O< z3}BTzQ8Z_WtnxmFp>4?A&$p;ujtExBod(W8!@$`mOKXXxucu|RtCybidGUE{9GAlE zE~vJr=$*+3ovf_9PU@U~Sr-aovK$Mf=YKRihuGkD9ZVDb7I$x)II*mLazyDD38dY$*u8Y^NDD;nGq*gYp*kBi~E22a+E24x`@37KSg6gdlD4z{#_vT`GggS(P;Sd~3@rXs_U2tkDQ@P&9 z^zua0(=#^-@QhtJunHuy3v^ke+_5aq1d^{DvhzYW^MJTkQ;QrI1n9O-dGeo_7T?b* zq36udZs7oH|L~C&??|9#y_{*w+{J59t(>0G9lF%2IRI@gSY2XY>>VcTQVw)fw>8G@ z>t*h)RkmvCV2hEMyxn70(P9^3g7?fx6rQmU1Ek5DyL6j88 zLr})xTh^+>&8i+WSRii6u+dYM89%a~(Q2WJp@%)qLfR2gqC@Nd`DhHbN(}5Ei8Czxc5DT@Ol13 z!Ji3z@Omrc!mjC}5^@1Rr(2@~i)12Zk@6mh^9p;yqY1y&_RjX_$s?8an12bDik;sD7Tw8_JESW+hX zCXhP2NP85~**{bjq-p_z)s-hXejIuO70T2#{61ZlRzkZw&4&8owg^&F2#c{NfvxVE z**OEz>3y$pqaUQyhq0F9NtBff?k@`5Ih|#UH2L_u zK`w`4lJ!ou(XLxq{~L{nF@0N~WMW>203A=;P5nWb$)vQqaf z(So8&X0MWRkVB#6z$rwoU7R)Go+Vn>XaO8VLA1NQOffMb6j0MGHcdblCZ{8aX4O(& zXn<(Kh4&a!vHY2rD5&U)MeS366Cvx8HjvfFIMd$I+7$+R?7`|&N(htcJ?YkUymQG4 za^+Sa6UgUd4Sx_F4L8@d82~Ja-l&j2CC%45bChNa3#o}bJc5%S?k-pP_nG#u${VEsI*bIh$7i9{}8QPf=T?vBx z?}`ZSU&{o1DRr_Qxi?|r_3}uJ*1-ePrN9^lX>_{5!RYbv@%T3x*Wlg(=pT~ek|03H zBgd~CVe`4dH4uAE!r| zSGLS0q{c~%$^t79KcQ`C-N8N6Knz_3Q-pj0|1F0%XW67IrB88Ik2;LS`y-NQC6k>s9OE*nz(J+4@}(e-(4jqAJ|6CT(9+Ck2b2q7Cx>^vnjE27*E$`oSJT~ zh;~c?NK?rz@<+pW(#FIdGXS(}74f0yBMip+_a1|UhNE?RxBI>LAliO(L3ohg=QXj- za6A%``nm!0n^FB?7F10DCz-K~=^MUhS90athDO7af1kJyg+G0@OvXT}0M-eqX#4%> z0qvll?ltYxsgA8+k#8oz{*=1^`x$G|)Ej&_q5mqgcsq16x|{mmv;Q{k6W$fS6{Y=k z;PlUH{(BPmCUW%mFwI|wn*R~&`1#uhrr%>Rf1Snzw!iybicx>PfBN^Z#Lx5Y(o%h> z|7=lUYo6bzMLqcN`m^7C*FVqyzk~b#3+1}H9yj!h82y?vrt0jdc2UHyY2_Zd++uf( zaZQ5u{*oFs%0+Fohxw(AdzF$61M%yFbAApL<;5|2j*vv)xu#+oK(=PYQ`?IX^O6P#PB`c6U0Y~1&tE4U z_|R2ZQR7=(qz4lh`pS!LzlIgzq-l0SAAP#r{NEu-H(p1u+>4$3Fc!n`QF)8;_DS^F z@!pZK*SKliUZbx%b5d5k=dyZ~{};EHG8)uZH&YwDQX8p5VoP^&nbp1TjpqDnC-y`A zSzO_b%wqR`8}x9= zhx;Qtp>HCtw29c34?Hjp&8r^oTbMOOpijR8%xK&r`d zjP!u3_k563*ln|+m!c6UqZzOtnmJen$Lu(HL4=54HK z6R9g306~<99YubTO=p^;;fEVr5@~tmZ+}asZY%`aL#(z(NUz8tVLE2fbF4!WkFk=< zlBv9@HecMz+i2;}ve*TX4k`@_h6wyk!@C};HelsG=#nygZ*zp+nK{DcBM08aZ{WdK z@trak<9GG%exPvH5m-wiCw8fgeST$>eC%lKVav-$#Ww$D zEItj+m^nY}GovTVf<4pNum7djK0_&>ju=SA^L%N*p56h!yg|%Rd|B_Ny zySIAb9SsysoSQnW&PlHN^+1D{=E!dCiC}y{`&HNqbn!*Wb=_(LQg_OvF%0a<_>cDC%W7m#ePXXULh9Z3i&b5V?~XtP`Ct7B=$FX& zjC^tK;y46C0En`B<~*&ja5z7j2!hnVr%K4b~`^oE;Up1~0z zT!r}!rgU1QaG~G*|J3nIo91zG^NF={@%DE6JJ=9_V~FePNz_F}j|wZdSQA)$N?O(f zle)7LY-RXwHyQtZd6cbHrnM{Sl0=nH!F!o50o-gwF^`m%C@sx+eZ*0GufHyMiZ4=| z!LG{1b1e7=s5ciglk#(qw2T)0;-_C!)c#Y@)s3yl(LbBOr1LWa{`bq_@Z4LGJ+MDGA<^xnV|A{Vf3O5=5R$_i#;QIh za$!1QXe>8G-Lt7B1iUHdA8phSHh=O6bU0mc3z~Rt{)hADjMZqsE>6rYG_iI}iSi$_ zgoi`^^{^hb8XnCMn7macZ6l19<5j(p$$9^*dkZtprirw`4IzvH5A2W<{*3wGYzaS& zRyf_czWvzL9HaEAKKl9({wCHnx+j5x{K-NaEulC5F*u+_eC}?Azrlk!sA{gg?!QLI z{<-Wy_ve3e;7kIe!({QD!wpxi(?IDs0t8G~wz;;B`D*^VyWVM&%ijDN##uG)n)eoG zoPBoPzRvmoEbsd5)KMSXuP?rgH1lm_xucZhR)2w!U#C#+KHV4N0k;z5_qnVb@pIG5 zU&nrat~J3JU4F1^x&yl01$2>nhWPl869D5ox{5GcY~Q6ncl!^9upi_xwM*DGVT|nP zy8HILpjm~(*gM>#IBZzRq;pYGQA~<^O1`M5nBl8T_&~Y6<5rp2xeFJhPBQ)yjeqt2 z5F1P77N+<1?f~(T{Dy2Qy{Coh*N{oa>h>ZPD^jwAKUsxMXt7CqEL9V2A3T_8^B+MF z6+PSEvEf0+M7FiUTTnT=Oqz&7Vo60${vC8^+em0e)9p* z%CdSg_|x&NHQ#Ze{+Q5dy>mCuJs8>E``GrnvHo&WU=w%;@WN`^w9K>&ysfcjdM|_r zG)2{NyV{+VHYb<;e-dQ$h+%t)>-yt{4<~pO6f6z$N8lEUVM{c``j*zl$KG3fT%Y-z{x@}yhr%a^5%-J`d}9J&r{ZEo_&$*HkOx)=rp z)jDo7h}rW>N*bedYV$HwkN>k5T}2c9Z#LBy4_f#sM z8xk6zy}6LA?rR)k1~1PG8IM=FzKDs@$Am)r#Cg6{5UfMr|$Cr;WW;u2IVSpxD%bG`Ow~8Q{>-VQ6Y< z<`WV!E;Wx#9o*f*5!AJYor^TUrZY+%DS{C7nLYzSGjU{3!#~B$hp%m=;SGq^R@o93 z?vauj?`fIg(0!=CV+X(5AQeq;y8@`6iM_1`U9>ohxOK*n@DUdcQ2hul3hzxAO@@4 zx-~PmAJq*gol@1(;@>0ZUcYeqqJj^P#sv3JN#N>~Tv|?MW~NoZo@090NKHPaXX5$u z7-Mbim}Wvi`TKf}Bm;@yeljdKI#tqfs5-R*+CmTC4qF_S>O;D-N4l~|y7jEzZ{g?V z9k4Oi^r;vLTNH%fv@of3Wyuj%+`co-z=8nG#ImmRZATAqX&=ubJ}JMDJc0y#GU20S zVs+gNyO?irAcIMX`S`_Tmm>5U>?IcjR5AD3<{a8>KjN-VX* z71FcUNsjm`(qv2<zYSJ&z2nhhoG7K5_b(b2nkaCmB! z!d7qjq+44@M?ZVmo}+BiS*|f0tj|)zxIf`VV;xs%gk2mmoHs;Nme$pC~%YYnQpDNB&2vB z!HdXtQPQX2qQr_2itzLTZQoGMYE+j8n0wWzI?Yp4`&?mRVUgFXi_~Hl@>e$4=DX<=1M7#1sWGAAKzT0g6EO^Dur3tU_hUMk-wU5E>{Nm!b-0QZg zE+1Xbpp8YNcUDb`e@R?#^B|U7umJ!%xi=|noH%$h^f=?1KeS7dQ z#d!~NN^4iu+OIGpWLz&WD2Q4p{hT|q8;GD+hO8UAz8&tsMnSBsuO|Q@!CRdcIP)sy zC=IWYlC|>D%_mBV*&mw^cih^RxIi!k?$0_Dgu&6|WT z&yFjs|G1w&VQfqICs&XDnC!nvXf-RhD=iFZ{7#Gl$uyS1?M6UpJYPAr!Ua)_osuO< zJy>E^1zA85);`(1GiYDuw`FDY{30SBY-p(>M9{nnFDUt96dVo zqD@$g2Fk$J%10h@s}79{2?^nZm{@w&@Xn;Z>e8qWT94;cQK{@!xj>Hvnv@OiZoC|d zE3vd6oUWP9D27c>byYF>ntQE&Cw&t zj~i&VXkafoktKjk@$vDwnPFRfhM8$;^F7y{z5hk2tT9hwmb-_?yL)eQ(%hWQ`Cg&l zYTm7|?_9_)i;az?irz?QJP8Nybj_QdKC&KW5j`(qty%H=2n{OCs2+9veG|6JD};Rngq%e z_>OJLA*#*aguZ@V$~O4<^R3j!4ZOU;e3kD0`Wy269NgS$2M@;Jx^XyMw$OFY)I!$N zql;b5Z_0LKxPf%lAhjthNUnN@hlfwjn(pK*;jFzSLO-=vp8ZhT4*e&fe;CmML_$Je zp@G`2hJnf_^U|*@5gZIE^xDOS~xK^<;cP?km1c0~gI^Jvq@o z^)EqoqY(?7=)<+X5(!~x>v2LXzR&eWYP^#ubkdDH49p=BiaVohk)e4e3kkVVQM6R; zP$V~bgqGq*8f-Fj8<96`jI?$r!k5_=yGW)UN}Wtt?)sGraD-3f@(n91tAvrT&PxiK zkA^eDGIBuBn|X2(Y&wG)3X0Tg*l#GjsN`0njM>yq??qUq=~dxLX7xeQJG;A#r%z{H z(>lbjaLpbp3yFz!DG4HcAfIw(A9J3Umv^w*F;0&FKui117>lXEc}Ne?oztJ*uV_xD z{9F4;%T)Vz`S;C9tgP{cJtK{e1HqUL?x?vQwku(RY}lwpVBDhg$@z2Hk?dlw?DCsF z5dG-@Z%kh?Ze~J95zClloxigaq7^oJ2D|a(i4}mMhz{PqmjGkuuP8Gp&6d z{8U|CU9yr{axDZ%OBiQf?)-JvQzz)IKdz2sVDFD&c25WvaCi3>3EGZf118k-s~qP1 z0srOs8kY55%AqGu1y-t%5h5F+8*+BC$h zf+0}K8seQL7?$GJCNyWL+LNPxdxJRFR~}giRu~b$Nd`ra%<;C84;E|}XyvRid-57u z;g6$g0lbNBnAbNzKRtDU<>ru()J#d!rX-PZ&4E$Yfb|NmZACG?`>^u zh8ePxZVHesgH*&VyG z4l>3x(cSt{7142Ka6wJ>2Rjq9&-lV=6Th*)fR;^*T^u^=X)Ok-suRS z0&%rdvFAIn#W27P_QUk!*0E#9ii1&z6lt5Z&{Q#VWM_cNqelnnNtXgQ4-Shjs~V&O zz#zor*Ps}(PdXVJ1{Aya?w%w4^lMldeDHtxmt7hXwt@bzGSK;sNJMdd8$4b z#|wE8>ue;)QF17?ood&~`pmon(zOH-0*H$w%D}v2rPF}=&6`?tcR%|U|Bz>}d+_C+ zUUa5CFcmjQ8rawK94F~c=-s~kOk)?Ai<3lR@w<1%E6dA;?>%d-3JY7K{TGeFeq;CU z<69dWCpOd7WdfG6s4Em0hio0$wf`RKg6nXVdomX}8@&J)Os620P${*(_*nK(t zw>q7l80QAGurLc*X{`EtDkJqsmf8PCGu{3-Bsm)Ke^2`dSp5HhAYaNG{ykf|CZI~% zWn+AQkhDR$q@DimjzHP%GBd%lI|6-!NfYbEBYQ(h^{Pm7qyGtSbJL`@Bd(^FHbm-8 zgHGmQE-HSerRM|hlo}0oz9*WT4RS32yNHy1al`E+Q%lWorLzB?@`p#;-B88vW`3O7 zl)Ya*V2c{~F{Za=

YE^zx!#HA?>cfQ#2wZQqmH*z^BHGY5LFqz+pVls)+U1}tl@ zHM#0EKSaK<^xe1mpCI`~0kmb=`()(d)Y5>wk%=+N8>5ZdzMlm(zfVBcM*xKQtX?wO z`3<s`?^SU>e|yOCKaX|b|KzlllEr^Ia1K1A zpyarWh>|XSRcz?^bf}?L%8>$lRKWU7e@#PVe^#kgz43E=Rk0e`4IqG$#j)Pvv^3WC zbUB?%85tMF-(fCFI2jU@i~RrnsB}Fr+u}->Ni#@K)?R&Ip|VBkrB0C9-ZZyv_RgV3 zU!OetHY#p*-OQuO2!Dm6nK7Gx``u{~h{|dzaH9H?vQ@YHp>xv%12Fw z-SJf5EYo*mDefyW=e8=YuF?})BrwuERjI7qFXCfc5wxkiBkpl`I09NPufR8CrRz|< zem$OUE74)Fq!3U2wUp7#8YN)_JI8#UQAh4!;g=?O7y8r2Q?aC^#LhCJt zY#ODrE#CHv$$-wfk~HKzhN=iVOE2kj*?S9KM%JF&DAocS(_XidTG{BIJ*;C8(&9H5 zcG+^74PR4-vHZ##w2|izwzPIALYbA84a7WEb(Kub2%EG7IdXY(1NBbDM>7l3o`!IJ zwL=jz!=~B@1RY?ouZxt`+N1Ci_8si>Kp?bACwulF=QaN2820#tPe^+kom%BMF?Gvz zxT;(`c6TAtI_1xX6AI`VP-S3Pp07pqb&Bz-0E!v}>ysg{sSfM6OYair2ypxK7%VeT zq^@$XsFkJ*={X0X!4TM>s#GL9ND6X8;6EI>Mz0P>R?g| zhlarZV`z40p5*JXlXQ;8hwXptwVv8ad^bRn_2S&lJwZ9o$OtO!&_g8d;P0q$-|&B~ z9qEH18c9Q-{f^Tlf@p#A&n{Rsla>vx_k zqm-sih}GOLCIE>Gp=fDf-WTSa=~Dt8f%H(y0aFF}R#$_w8|`gv#f`6Pj{QrDJUq(X za9^&;&_>0~ByWDena^5$UI0!iF)miM7X8L!|KO4+jf?Z+b~^(bJ-y0}GfXqqrF)RC z!BIH9*QI^g&=Ra)dx~WD=uK$UN(Xq=9~=3W?!YVeOvQTJ_r2X&L$?9~sv~GG-TIC@ z(Mh@VyJ!X9`+WPszClXKg|A-Oy>Mp9I}oN+zqi3%89Kxbh{(d8egW>6DP}?rso}mX4u^?yiBM z-pzeK?|Yu#{d~?}=bZlzfAP^_zB7C8wbr$+b?voAA0)lkxj>=TL27Gf%Ih0ST2HQ5 z7^ga@@W_0u)j1J*RwCKSHS`3up^YfnqwwsHDopt0Dn5anvF}$%7Y*KY_CEQ~yP2S< z@2xd*=ID;+D_kNd2y7`91JgP)8x`Nt!4&U=gA-*6OXq$I{FpC z=<7kHm@0m49Nz0R(@bsgfMC<~6zZ?oJCd8<;_l^%96gEY9B0o8K5#u6-LzF6L>izq1`YfGPDr_w_-@OGBC3bh6N3->97Cl`mJUOSAmQqfb1 zC%bbgMvP`VIi*YM=rlE*FAx?YYQ}Qv_b*>6^R31p`q&E_ron$}ySGesJZf=qIgdN( zO-3#40bWQI^hjJPK0%Nazehx zS}kBeqVeb(M6PRIOi_vUN)ewcHQ1JqJ;u0;cqo@Op#|G+nEwvdd3vK=sZ&u6V!&B+ z8ZH8Sv-|L+OSOSIPT1qtFp)UnegX$TDLn{sAd`fm-tD8tw!6TqKF(aGnys; z$~w4VUCWS+FD5M+>m$XvU|NK_y4dlbK9T)2pDiBzf#qxKk5T0E|#85^w!E;u(=TT zz1P4vW^#JFcr(a&en`JWbOe)ZgkS8*g<2(Ueb$2dgjx5|KD^NQ4=*uBrt&XIM1lj~ zjcarWd0(O3jYsy0Tz!p+I4CTH%$@H`f=;GaHCH+=ORo~0PG4X_)`IBBoZ9mY?hLn} z%d%j&^qMX26dnzbXD~GW$^GdApncq^G~YCUGs|U@0Z=csztr?TworNs4seiW1i}0 zI|Ld?y6)`ARu~wUl@_{~l-wQ~DJ5?^`=bizG-IJgxuDDWIe>MjjhN=;k($!`IGam{ zwm3$l%sOHfR?7aiRjfK|tE=5s)x8RV4@X{!m7TQG@6j^xBXR3!O+|X1nNgPIG_re3S~{J6Z+T3wi&Kb;g+J8;)_kAQ zR-?G6&SLpp_RiInJ9J=&!)!`uV6!XSLVS49FkcHB6+K>aa3E9~OdLCn|BN7dqznZL z#Zsxp#xD`LmXxhf#Bw~_)evF8#VV=tBIp4-`m$)eLzQrGajM6t+_a^&eWgl#@`uC( z93#HkVyqP-kj?^+oII<=OE#umzc5{X3=9_g&&B=GPrEav;zj`+PY-XTVWjNVSYhj_ zj!x3%B!iCU06q3sEAg3);R9X>#IRB$_?PwO94iLf!-A55xeD|wyH5f;g{$=ja4W@H z^R*CyDjY1+tku*OiRolU@u|3)C2t&{NxV31UlW+9Mrl1fcXej{vo*1w_AlYg=vPSY zh1AN=pIu9*ri3KgRyRHSNFJ|a-oJiNy*5&Hjz+BtVUJ^2;Se|-&FI;B-_REcmW z=CC{exwE7n1P8b-eAcSCq%8edHM_TOYS^t?R4^9v@s+ejn-d_g5QDbMceEwmqeosxXWf zst1k+b=(^(Itj2Rq`tl0omcgDM}_=I3bp8YptaEk9I*zx_26hfNI^CZ*<2UKkU`u4 zgnPhT$2ZS5AL}7{UM+9^&rJE3zu6gvv3Y0F?B7PIQRf~U&8VARqQU?IukN!zk&9t$ znyXJ)xrmhOhv4Y;uPgyX9^AZZ2RZ)TD>^I5!Y3E+XCoq389mE*8+oRy_Lxsd_>C&S z*7GxS?$!;tE<_x1?$;cs#R>$m+ z8M`ALebW_sifKY!$N+i5&9d;eJoi7*3?HBup2Zv(PEJ(W>w7MNY);que?w=p%M;Zc zOR0D|iU9&(tKeb|1Axj#qXb}URqX=CK|4yzX{Xo^O@D{73|o*5*e3=R^VOD>Sp)bO zBDz9e_2iI&@Lv&Hz-w)1N7?-1^mu=8!d!F%ggWUv@Up3niXpPzuHMg3M zt_+$OQp~5!zFlw7+0RWZe??D2Gnm#cNpE3a2Bd1;5xR1pi!BW58*6g=jACZ3R0ZWz zBTn&eB)!gRR4Q3M{D(I|lX;=;8@m2UGz$brW%+PvLFv2r#JB~b!42js&cMZhmZe{? zNjYf%EfN-%Wj4uMF%xE~J?%N4f^A5q0ss;yFX4~A7U&c5GOQf$)5rwb9@LIh)nX3p z^D{=rIsn`iZ+TacdXIOjHSp474?M#kzus(ZzC^{JX6-`j`m}|bbdm^~J>izpQLjb5 zV|4enDT2eNk}neRxm1k~M*1%oh?de~*O^kh%)7m{vXWcgPn`CwPiV`6boa?I16T{| z=BrddJ!ZK&VVz4r36BfoIsf}L$J_6Z2_!7J*2#0CwR|6%c3T0JY@Em@+$Wh>&*SU9 z6=4j+`Oj5CoBur81WRaWXs7_C>f7RT90yMB-pjFg0J;~cBv&>za&;hX3CAyW|GwJs z-~U>m(cj-+K}t#qhSSCXmK2C~nob~?)%u11rYk@%vHy9I!ba%d9uW9^AMYmI`7v6*Q9_B2w{ogWNf=4A9 zpY@b=z1sC{X&W@%ujD9FjsNGTK02-_V=jD+ldqgaUeqZTSe*QN(%fBYcYqNmKT`r; zSjW3{>Gz*s7476#n_1MDehe@p?TA?qJ8u<+XOahWP0@>R<&{em+vt8p<0!OTX{%28 z!M}U}n$0j^9S`?Sau!CXI#2R7q0Qg_OJn_i9`a@B|6Ts;|9`jtv$VIr{6C@>ZjVn#@`OazCuD9{p7@AdueqCj78q($H6nvbGTMCADLGd;{}~(CKk8B& z+|uctx|^?^Q9o<6BPwi{j9?chVr3fiNUyP{sZxVUU=yrIZDFiE(atDtK5wDHX*S7`p%`r@7rU2I_2jtl zr7yPO1_C26e-s%JPADGXxI1H*hlq-l0)SmcKtx0Ybs1=_EGPFu+-!>VBcZml2P72e z$>)Ewu2u6_8V~5C^Pe(Y#Va{7kTM@jG4d8DLqf9jbKQ`!J(^XoRqFQq9g=Kx-;7+)&~KGkB|3!K*@bXh zYz@~cLV|KU7}RPeHY#(($6}Yh)D4HNwg{>FO0Ny)DfgP~u~>qZ07;Ne8mH|+ore!0 zd5yX$sWzQl-p15piphwz+NFz!zx-(#ESpXFHfHOMAtCn#EGgHwM2i|O6~G${N8E0_ z>&dptz^l7xN+L4-@{Rk$nCYY>B!A~EDFJ+!XOAuC8pdcspYsJV6>81z>|{RVc=g=z z_y5)c=oAwbH@_0UJ)ZPrhZu6@i#*Ul(?&P5p+&=p08jEeqai>S!F^9t_TnZck&Guv zfkMb^|L4*dJVZ2uziZ{FE>q*;q2xolt~5)fXKWr#y#{hF z=BUI1LX^H1to?v~W+ z3ksuH6>OXFtlz7Bno$irA`u`cV^bY(rvCbcmbt^9!j^e0WdvtTB*4WjSYF0wP_NSh ziipj`K_MXX#kWaM;~1HoA4W~pGf4v>ugcn4NI+n4c(!qSa~4oN z4G$aAM@B^C)l58xZs0NjFHS_TJaP-$TtkPaJ0{EU_N0`hO6+iz`3^%wwuVA)W z%KvH%2oe|dr&XMj&}5{F{#0k~c~KD|Td084(sc4LN|ftuK@_*63Bc}dyY2uKOGLQC z+()aet#23k{D^Qqt?tEmEzVT|P(JgBrHQ`uz$SIB{wtkH3MCKD_b*bCJQM_aR5ZY^?h zm2_>hO+L`LYKW%VWJoJy)uXG%0p>*Gpe{-Yi+Onc}V=^R-5~k#_U?-n)N~ z=4GlcpdKsi#x#IUDIX+qua7G7bb~_wdifh@aWsQ&E)aZ;vU5uSTc&HUp00vrgTY#9 zFw={%GLamh_n}LJI!Eo*(#47OD57`^RY2L`{a`Af5R-s{F#CjrgEkFX!|k-20kEnz z-!mDj$^)+SW4F0Ux<8~cYiR_=ub~~@pfeLB=?V&dK6by*-?_x4PtF< zTuU8qpaT>YD{M!e6>3$AUVC_$5yDjxxuH2x2X}3XsMmJNn)#_ryXFO_%BV`G22giK z8Td?V!;$=#e`;(aGk`o$8z?m5_&rm}Jr7;duWvo(5839N=Cyu~lV<1N7$8PRtoG^V zOz$PEmfTER#iq~~+i1z3!MQxwK~FUMGex6_(PC?B$Z6LVP=x08=id3E`SWNx+4cCq zII-WUwDi5}b*vbWl5o|y%?s3xa8>{ITWE8bX21(_Ih!F?OZl-h9_`4FWmFmx-v$x+;e>+-O+Vjsbj}VY2{~~Z zP#KmD!(TF|RVKNh^hSCP>lII*FU4fY$AkwNxVM|7@A`LU znS)iyy5hfHKFZ>Mb+SDY3VOW~zffJ9KHT+^w3v)AN%CbRvf`Ecc|E_>VN3Z+W6Q*< zXg3y>GE`;Ydy1NGB#N?nL*PjZgU=%A4Q2D%&R&7n)EbksL2{UQWOY1e$EGSw^T}P8 zX??Hp-e?sAh0}&yGC1!)vU%tCd4z$ZgB^qC<`{=sMP!VQHfAk}h*peq=)z1k%Pr37 z6yql*p2yt9;&d5Z8OVPPJ6Nf9-8peeAP3Pxj6?c)KKOc|h5S*U)X0^n|C=ON!3c-h zpZQYAr$uv1A6L0vHz__~Gn@Hn&^f#Kt_Wu?F%^hh>Y&4rEZ_Ku+e|abWAUZ0Cz|8g z{?l2O9YF^5vYCxqndUumEIxxT@~V?=Me%Ru=1ZEFXkkea6%IqmSvwRSm$l%kfwZqj zD8FlSZ)aGE-1!8b%<@J8u%2T9u_1E&2OIWmS80(=Us@+|rC+X-Hu$z}Pn@Mk8DDT0Rdsv>t_gT5}OAc>SG_%4MoN4GKf9(D= zGhv)1M!1C@uy!%a=p{?b6A)gBl&NDf=(GiV7QpjYJyl8k7&S$G4xX_Jl6dW_ng zG-yKZf|uwx@7ktc_PbHU?*@x%Giy1`x@_w#c4zCdLLQv&ZiNQJi~6Ohv>H1(linn| z3bGhqSwzOOV-3Hd;GQES9XMF!Okv$6p)-P%eHNpwJTw`E1@(@u1S=fH`}q<}{ApVZ^%>`$RcW zsHYzTT$ku(Rb5_NGe3-c5M=jR*xc8pB?@>DUKaJT&$UVJD3R;|vdqPxmYwR^3_!8; zLYm98T%u`f*;Q4bA-0BdKQ?zS8tN{CRDtt|V}Cq6VO!0)4f^5un)EDBlRi7UBX?wG zHzy-CQcr`3 zzyu<$&yBzCHr~i*bGStu?|o~(J#H&j55C~F^B+AknSzBz@+5;RM{v&$sdo^xE^zDR z0FOHA0wd-%40-id8`kGcKtNE-o29A)%b)SR3kL2zNZxFZ(FGI}#~A;~A4yOL&pp!> zMnGy8-*xccD7lkGL^zpWdW*|Ye2!78Fv)F0&#><&FF5Ll^eR<r!o1bD**_6{WSy8O@}- z!U|eN7WX-ed0s&VlwuMR()@24%V&JqxwypG7P5F)FV+yR#kK1kR7SD{v)=E}R%+C} zW_Zi;00*+SZPyw2Lsk2xp&tYr&{#>LwzIdJ>$X{^x-RU>tM{VF-z@<|&)Jn_o!he4 zZsK)LlKUpc-`7njTMcA+&GUNu`o=)cWKaByc5-c*cI0GD_b97oZR^pU%R7 z&4f2{X?c6ERFl7+fzmIy)5U73TleSE%}zbmuDPjE8d(}8FW;p~=ivcc(?$|`PUd7m zw@t2b?N{>H=;-Kl{BOl5ptz8=li4Ob$;Fj*k+YimvcoK0IWgXBkvzQuhaWYA4-SW_ zu18%D{l%TA7MRe=@-pdI22VDZw|nN|ey8F@M8~v|tWIap`{r&SNj4zkOw$p3uP1PjfQD^gA~CFV@}e(mmYbcBA25I&lhugT~g0 z=S!u&j^=R7K{6+V`4l+`NqRV;uE}P-*@?!i+s&&nat^f77~m?_L+VM_>YHG=Qcw`? zvL5gt+&M-Z@W{x=CE%B9cG~YzxFfu=kqw&Qy~18&kvN8YPqM~V1folm-}`#R@7;fX zxVb6z2|NUJ z8;ug%8W4a82(EMRZf( z1+{Awi(@WtJApKNNv+bg@L*~ZavlT^O>}eVd>adwj0gMBGr$z)>#Gb>HF$;P#xOya z-Q<^!SRvA4bQvq?)lpnb%-VkK;pI{PaHHbhD8LF*C&dk?SpeqXQy}DDeaEpsiMP2=4`K_`>|F{+oqQrjS4N$spL-_u^A9x0wK*XM6s)X@fI@`z zaPcuz!}=%3an8$#6>x2Na-}Tdt{)|qE2_i&a7d#_JSRRKnXptDJx3Y1-6zb4VBlPtFA$Et(pe%^O1_ud?b?7o&pg^Yg5UvgJ9d@$0?4Z zqYa5MG1)wOb?~#;=nV4N`rFWSp8xpQ!vdq^kLmsHmn|e_2tJv7mEtihkZ4(wFgu6s z)*~6&tVTZ$G;<2+y1Q%-q=Ia0#Q6$bIF3hwKm}%p&;{gUp`W4q{rYy7E(f1J;Kic= z{XGJ=P^x5Nw>`EFHG@#LQysi|d4oM|e0-5o>e8Yq>5Ry0YUOog*oATO8 z2r1;{=CR2z4L*Me`CSqcl8o$ZgQ18hwQ@&1G<7nk!)5i%e*Ib*vgrk1nH?YOO_4x; zC-$48J#_c8uz&(}OWO@Q?{yZK`y;*X)=3-3e(YSOfT!u53!}OAt%v!l#V=pKeqL#& zj0b&}%;k1RI-d2(X|ipy;8!Yd(<{H_rsH#BLZrf|AZ>2|lCNlW=&tQjzD52ELh6G37ns-tO{IA`On%vS8b- zak9)q)S*W2BxQnT%I@HLA!IuL#;}mp^S^GWs-|$ zu0ecILq+IJ+5JkJo1Q{r_=X{lh~>LMlvQF4DkjjMFU+mg>{zyKG;rQYiNZcmN)ke$T)5Jl_4&J)gssp1*D&{^8P|bLnoze-a@C=Bi8`r-fT#Jk>mNO)y{0 z>fQOXhqi-aQbEo=4$|P;J%JRGsxhNEIy!zJONfY|?0I%{DMG5xFWv326UX^HU3zP^ zq%w-FtK4`X>pe^GA|lmvNp8U(A|@u58Dc6OtNR^??8{>N)hA0!hPu>ZUD?ZfNA2&_ zJ4=-4+BaB|d7QMgwdLq?GN!KZhTz?UsPRZwhdu8+W%|~R4$&ot^1N}y0;Jh!&bRD= zq$ThT_4Sj}-2FJqrJc`|D=+qDN+G0VWO~NNzK)1WC5>xJnemq%5Q)p!M%T+14jt1I z6DeYFnY3p0nO;>iv}Sz~k;&(`$9Pmp-M40uwdwnP*1_r>$>ic%`}#m;Y%q1qV4|y( z)AkTE3E~!#1mQN=*=$#PXMNuzmh~Bz{p!23`sX7Zridzn?VTMxYwP0CqDPP3egz~i z+LxFZ-(ew1YeXYDnlPg7m20!>NssdtwV=t?%D^52N|Od#z$l}r&yWsSH(sOFL`ss} zo2d!4$6krTaX&BkmO6qp)1XroR*aYup9hk#`r_G@>iHG5r)OvF^aPrdy5c!Fwzs## z7~+3S4X{SONBsEM|8uD;j4up0I{D_gwYQDp;@z##{oUD%w6}&Qo8#Zoh0~6lEE^o~CWD`1cv$A~k;`_LCmW2VP+|Q;;*tCkt zSXu7WiNBQ3&iz>sYE*iTf0kP6{LU_!LSt}qbCV*ydG)M6*&o4C@avlk3)tP@nBqm- zjYERW(kA19q%AE*0~D~tTor8JeB;tQ$OU1Xrr0iG9*U%0+GL?7YkE z9Y1$RUuZXoGq;%AEPm)|VtD(u!1WxR7xct4ck_}Y1 zqNZA9lQ*xCuPCo#)8^)CY#(EjbJI0Me8P2izlD;0)ptl4T}UQnY(@{7;{Qw_1Fz0WCD{555@1YYX=BwxYmtBS$b9?3B1hk zy|tfpB;kdd(vCZwH#CNAjX3bwVUdg~$0dpF_Ql`3EOmKMq!lcDT*yNmTc>9GiTY3j zKdy2;#Wubsrg(mHGmo`Pxy<`44j6`a&yMog#i6h0@;Ce{Wzw*S$8U+yn3%?h=IE8_ zm|S6}+ZdO{ZBBl5PZ?0tY=0HLa!`6YRNXRx8dn0&*KFT40R6 zLx7VD*6(g+Z5_(ol4-+r8L+Pt$BOmkZN7+T`&FPn5cWQ60b82V1tL5a$#`4Yin%wk zNNiSkL*Xl@{pmLoZK#*$F(Qg+%^WlgkZaU11fxvVocBOX{SZy)|NBm*xw6=j=*d(3 zoH|H)0PQpNe~MUT7gA7mzPdIzyq z)=I5(NFSv9&|fPFmDQ8a5~UPbZ5sF}F8;I(yF2QyCpgacOr5_BD#1^Uq)C92aEGaM zc*s)zV(kon33~xGhd(i#Yji$fz8i4i&-~#oYG5;c!bzd@!(U~epW+zbi^0Z)EITf( zGL(PL=u1YB>{``&Z$l3U{+vxJ=d0jPvFXLU0%6rZ3loQC*B6BMJMS8-m@9%)^R9cI z3($mfrdU&q#R~dM`2)k4RX*dv0MR*4FB6O=m0$_`>~OQ^S!#KaTtg03jNBP{{{7V4 zJf6Wpby+dtO7kXn-m9T3T}WMahdx3?5tH)I&hCBL&<1B*Jo*MC5C^8Im8MBdj~DA| zZa~`6I_BqJ3~d49jzVpuSxahut~ngPLpCl3!By^4WrCHbLv{#$z&CX zR@KvRYERMUGA2Bcz2K5~ougVEy&w6>S@<Zk{?qUkmaHZ=ss|6; zyx$RM@9zCx}6#zldjfh^Xcmx#(7OBjeFQba(Vszhuq>L z@mEf>ve;vQV}vVQYEDk5y{fLSAD+h#PpI8v(P_ec;QsM7wgg%>U*fUdL#$%3HVnG^vWpGFBT@VpG`=FrXivV z3e49NWn^T{*7?Y5|Kk=%uieGP-~LWY7)CYbKif_Erli$soPCB?7{7pbG*dw2qw#9UCrqF+4Lt!X)LN^^nJ9- z9<1AqR}mRZOTD2tOrFNnJ9@&7R-k>uL(G=f8Pp_1BC!1f<=6LSQIPBNFl(=tX6A5(O zT$cg3Ef&0>rtCG8g5`g-E!o~UVqzgv>&9&t5iG;&y!p!<%S&Xkj0ka1bQWuC%OryC zY-(!Sdi?dvTY<@O74~+`mb>Q*ONt-6CTup3x$e<@c2!M?4*sjF;RuY_B>KN%Yv zk2B{kZD|VQXE*@=B|pvl{(ZP$Q$~30KnrheyH_}f{o?{CsZdnHPr5< zp>S*<-100zoCD-ZK930m_^g>;n&|J;Aw;HQ7!)!_R#$PXr(vJPgZY- z9*@WmxJCk+7v!OjahmfgLiD4>YvIKR8jSk$i*rsj4X6LD1xPar&ZE()c>$c;QwVDT z4#4h}>Sx+$8VopMW^udaJ{p>L9yimsyg*nBfLNI}X_%pqn?rUdCs|&M0Ffpl4DSV< z=~Ioc4*uu_5H)}_FSbGYdR6+{`pJ*yV|UWCw$tUam3y;tluCK~lj^_Zhs*l~)a4#? zb%rF1)`l^g3^kN?z=%d-a)VQ$K~&>zTy`{}Yq4A81GpC*eqEed1=V*ZgBV$i8GbGM z8?Y9|s2kV|XYkyf=*g)mN}3XHoAhH;AIWHr4uN{Phn2}2YU;&>^fxwk4&Fb0q|3-Y zLDh)c=*wX!CA;aYeL@rwG?X^L#MKUT68!!Mlr{y1dIoRFbI4Qv(p58_3aXuGG;ZE^ z?aLFn&3;+Oqy=pG3p5T$3iy;&h_VyMSKBUd(%?;x&}GNRRc;;VdZY1x?mPe#oLpRw zPD&~(D~BT$Vi?8zzP<0)t;s0E1Ps3*2>9M&!jJYuL}u}&OwQI5|w5YLcIS;xN*4t^Lv!Nq;sFjuR{b&<^#`IhL#X3pu! ziD2rtWFGsGkr7)K6gw#uE_ga+{KK+i8jsb3AK4fFX(2#q4W|IN>@&L!(osvvwfbnEnA^goMN++_@$p1%2G%;gO*VTbeqD-7lcU zmR7w7I^LVUCx&o$pGm}2+XDl$3;)Ej_$p}b?Rj2{xN2}GlyS9m zcgxd`^u#Qx7UY=F)$H%*r#-kwS)A+P7xb}zW-TQ+nC-6QeZRYxl&^{d?~Ap)ibU64 zW?q`I`pcmC&C^daw#UaCEa@nL&Cxu@d#Jm=E`221d(BnhSAp&d6@Hxa$EQ2>&KIYN z>%3U?Z<8P&Z8uF6AN4=^a!;UZ?lBrcPZS24QjrpQ{Po0rw6r?0Qj32u_1gq~yk3<8 z0x~B4(By#1{AYn3fBF3lAPDGw>K>!c137tJa9>Hu;-C?Z9;54G;=%b7c`C&abF<#? zPT7R^B{V#}ge2US}m+JhYCJp`3_= zhA4?lKX4>7mOsCKLzQk3I}DNlTD19trRRTQn?H_bad|F8(0qFPp7!CX<7r9hIjNF` zg>Dx0_wo1O3K(IbfmEY$&p`tdG}PE1W+43exxtoYZCKc+3d@nZLf>K7+Ysk`UbQpDh0P(g~cYbPiRmW}1s{AnajC*2mHyfsuSNl{@nO_Um}VbD=<-r+M#A0+|@d>8a9z1gBV}I;sIynde-%j)nev;;k2V@HifG} zSIK+ucO_+IA3k-XEqBxRC;Z^4uHUzI^O14@)7Dy!2yLBjt|4ET;2lHC?-6Nf@Y`)D z#GI^R)M^OYn}P~XV`~rPbUUr@!<@>a#ePse5>%>3?shg^`GzMXd;`BO!6%yy6}s2W z^>^*%4m7x&u5q--}l@e{bA*yiI_3eA?(ARzt2KOJ*2XW`sKy9C+Bw`a^%;@baE z06GZtFvB!u%+Xkg)62Q$8?;U0 z(FNYM!YYiHn(Vk`ifT$S9Mlx0F7Qny4IjtOv zNR1I}LL`;1G3xhLX@8WGX!Uv!`VNXB9XgyJ{_1L2e8Qk2e2fAN;Pyl%ApiuoYicy0 zO`}1MulAvf(_D&dai=gL*6H}C|1G}&Zqx>inRDdLjt}w?3)m-%OZ`#wW;Y9tF63Ff zkbw*x`06;HUSgpA>g^TEEnErb2;JY~vL{S+?GrT_E?@u$(FYm4(>wZmkh|lj>p;Si zi|!%$z%U8~u6G@y(?rU^5h>HD%00T9blfYIYK8XJ*doNw0f4d_Js`U2*o9m?1r~=^ zVmQsXJ?r#jZcZodPvDpBtW=f0ygbMB2*y|#(Xynlt^{DiY|i#=^&|p)L&?*nrzw<* zG@ErS0bxkPW+9u%?W+U3FGLycSC*8kZ*7g^RIQa}8s>INj)^wW>_l(3(&L{r%VRJf zHq?3uqJsWH+KP>XgOY1pgV|U>>lgL-@jlymMX}(SKe~h_7kFrB8kHvBz}i0Y^mRjC zi+Xifg6EZs5_sKTT;3clN*%RD>&p72u$@7jX6^g(gaK{n*xhdG+rvLEIcxAimhaQQ z)nzW9gGixrhXu|LrFTk93Qtv-866vck7Ni2T(n;i!)-=vrwvjs3B`@ozIaVq9&fG2 zI<{a&3Rpd`AdN~1k)f^lp=$YZ89czH-=dFJSguxwK&3&W#$!!;J7JtfZB$s^0=NILlY)YR!4g63x0KF_aG0f1f}occV_f_-cB>c5*GGcfb_6{!1dZ$! zR?JY6w&`iSSKqOI2dN)gx#!YcbG zmh)+XPmKfZU28-W9`pCSAF?7T`n}_1;RDl;r>lE5$pK`8rZSW>dAT=hvl#bvO0l&Z z6`t_I0W3J)8X;?D&|qxffKFLR_1W+ljusEBJunE$6?#NSM-#X41P$=}UtfvIn*3t} zZpr?|)=%|j_`&K0$GQ6gvvU5iud-025#$0gL*^zXQ1Z7u7yX$if5yywqi-2WJ=1#&2A*;pSice1sor$@hI)$gOz zpY;oh)o>1+Xr|Z)AbDG81Svx%AfJA67!z;fC;c@ls%WGO5|W{q<<;oN&3(zVd3#E^ zN~NTLNW~C{w#^bxmm50V_xqT7^g;U>As1Bf=`2dAQ>8!+n?(^7)Ryy+~2cWH^_R!0k+gdTEZm?H+qgs9+7+{k7p??|9l*qeG5XIUg zYLKNYbH5E777~r3SYvP;ux+gBL~Nzyy#eYYZ)ma1Ko3<_QvvI)`KJ970^`5l3j;Rh zo#CNcX6_dP7f@2TbQw`*G=HKYwgCa8%*uzJ=h}QIN7%;E7~rk5t`E!CZ@+Q^4@DOK zGLPPjiF}I8kB&w5*aY6e)!P(gtX#~v!upLB&NX1%GC|XKsQJT@V#E8ORT^N9l`W@- z$Hqj=>tnhAumbxgmCP-;a|p~UM?0Db?kGfb1o2T0#072P#mGh+LeBVvWkQ9%Qdiq`X9h4G7RLC!`fYM^s1ES_JS^uU;-N z++rqZCgVTnGXS0%1jywA*7zt!Zm5NCf8vz6wslJbQ5um=aIO%@*fB|lb$1S}w7K&N zFEDq~?^GaTrIOx>ZY1&ZQYz4@ZP&9iJb5yYBft)I7p0i z?KT;f+$MQN+4fw)I)8~K{L`ZILEH1SeqTL!vge(Wgi&n*rUX+FXz<&L0SB4$2mViFtpTFb}EH{>-ned^HSQ z)9)@DlQ>BXm3^sHsPGh02gRM8!KN6eDB{v8ah%<2bpsfPPKCyILFgh~2mOSs5V)Va zXm7QfL`R=qvbHH1vgN6^fNl7+l6NAZs0-MQv!*sDlaV^2gmPm-26|8qsj^o0Es=cs z7fy4)&xvdrJW_7}!knxDS8VLlpFD1K(Qh?_A#O-|tW_WI(vh2~m%{BYniKL|6%^NU z8yg{DnrP4p{kT4Sw^=xOV>kM-VQ;kPjRz#0rLDrANV!-=-BhCubz=6)TxI8k?W!6W zK&4~hrj32C50vEkiS!0mSAXyPu;BB-;x~`*yWVI#lbgXgGLmhdIhPdnqIpl0WyD$$ zoNhjw0y5LSH8wO%;=#wYv-WyRS%nfU9Dv^)%vI!J#VpKsoTAY@wH-(N5wFwa*3 zq-RYHr}<^l+*}eU(-u!O7(S3m;-)Vk)Z%_(;7RJbSVUQY*h8r6epNGAAbvJ-Xe+YY&ND0*a!1wN%p9SCstLd(o1Hh`RUCA1^I2 zp_X^d&CP?ZOgZD&Z%8puUQ<7_Ut<_I|NcaKlarFGilpK(CZ@oxKe7>Es;Q})pEywb z5J3*y5X{ZVD>=D%y{YGPXyA-2fx>n9W z?#+(jJ1MfoMK--rc<~+x>d#zJk3pSgca}SsHwG9xF-IQGts_H0zuE+!o-lkP9-~XQ z&&Hl;vPZ6!(N`z~^B)>FR!9-xyKJ(h0{ZX(22CeA7y{(Z>od6!I#oKRhBeg!n$597 zA25!(XET9sR(SgPbj(AO5U0WFkoQ@0=zn;UjJpm#n;=4KQ62afZGK%1n7P#ih6M(o zkK|yJCH>IPt4Pyw`Aj>E<({aK`6ds_9#Rzwh0GrNtdnj05KYU)g)xxaEMRBHoRFBfuo^w`nc$?6P~4=N`>yh%wO_>ym$%3*Rze2> zira zu?W|;ZJ^Mhvl3A|yGM(QI*+`h?VhSq`k4BlsXqvFm!MLJRMp@1Y;z8`+<1*w#bObe)FF08DiB0Z#C zER)}va-Uv9<b1p1Wz{>|qD)|mHjbtwOjf+;cRL5Pv7^oXNc%Zwsr zuv%A>!mWtEtxLQ5U0o8+HQ{0|3>`%mM9w0Q?_J~3hl@|If)8>LKYy11i^+ufZHqed zfJ@id{Zq2xk>TSy9b!e_*RLCV05Jl}s3(l&sW8?llvIWStxjV=XJAcC*Xr^;oX`g1 zX;(mWE-WwSl{k_KTFxt;e6Sq!H5d*=+{Ax6Pd0<*p zaB%RjLyRzr8OgOi|EW0gTvIjH){^6&qHNgGM+9Hk1@fjP{|sJZa}aU+kv8FlnQ&wC zbaO;EykoF#!`#f^Np2fJGpvRkN}WK~0~lD6V;6Szaqcmu)q;4En6BUsD!X_?#Ag>E z%2`;+)TQ`ZbisD)YAQvh|EG=P`*<+eDGOl8D9!alxhg(b?DzljJ5oGJ+3S*XOX?bk z=TC`55w6o}(ah{(!kh00WBmNq>2cL4(YD5KUN-0e*7+He`a^(!qhf6}s?AQR0(}Ae z(Cc`+QqV|1@15cS8NuFv`t&MBJW~Oa?E1$rYZ}@+y-SnISVvGXS_NnXXbMbp5AYO? z1Su&?zhNA0LHUdpDr1}EdsT}R<8+A8K-1utaXvXfP{b{(xwoL#G>N{mUA76`T|K(C zmcbj~4(Y0JmU;R#yl4U`BrGhvsRsKPm9d$X3(w0?u{-UstEzd;o*`fVE>uorD5~)^0(15_w6)$vEg?jN=m$dx~IVub*IX% z&Gy-+>(lj`)RBI-KiB4b?jJ=m^G+h?aNZJq$qZcEUtpo6q*P#b{Uc1u<@&+7@gMtP z#ghaN6c+xhBkyEz2ko3!>y!Bp3>6iXk}80y)YR2C8Yqm8sVFH?Jq~+QPhT2JE`|2- zJR!GL?pme~=X~+v7e#x(Gr{^Q256j0_h?eHAKoFy8(R8naKkuK@(QjqR$knV0c*Zl8&-=A~# z{Q}N|b9k`U5?qrx$8U@)zHyC4D8XGUO{}9or%}Rt{||Z1f`iki#{A^T4KuUVFey^@ zYC41uIL=ZtG~``BeX3J|AoA_oH(hIM3=NHmPUd?!@O3F!>v?|fO|h|Gg4S>+GbZwT z$gi*BdJ;PDx~PcJi3t-Y95GT-#vB1Lu^D<25_7|jrHHXVkKo72*Suvf;XVD=S7!%* z@tx=Y`2hd(AMJ!I|FxL^;|GTC|NkHSzp^AnG4CW{Tg#O)Ah*x|{7SwS_|MM%pWmmV zDtb=Su|lHwI6un?u7~(PzYd1JRFRl}yJSs)?f8FweZ8Uo^Z)gw}+ zp$~c&QqvEApvYMWhlpv6A!e9Cb-SYZ=wznS8& z`g|~7;|_#Y;__N@M_kE}_~)aGwD>{`rye$U#^TK{DuibBM&GsFt8~gLp^R{ z_G@mYW)W?VknqE#q|?a@YO$mc4rv5D{J!mz2YuyR4f*Oy5zG%i0k(&%C2c1_HW?$} zh@VQ4M#!aqfA62tWdc&Z0cbMS#w%WEu#kuvNDEKuUXbAJKDF36R$Xomc&+{hrL3%s zX3E;ljsJ*(*HWCk%5f z#R%9Ppm!(Mf4oD$G6x*f$@yurUE1DCZygq39SI!_CY^;DrrkAvTy|zD5xP4KLVpuy zG?pz7Pc8A_W)6epyxIz4SFMwKMjvF7B!cPb9=?9HuuNQRY5Yw(jgbF>7U2Wpt)Oey zh?aUK2~b-6X;U^qK?qhk`vZeM)}GZBQy7jEh9rGBZ=9GIut?m$y2RKJwjqR4ZNY6& z?l-80Av<1q)nzKyF-k{cz8+u7_YAN(`D=>=U6cK*j!%;BMx%5L5B3Z zU1c2wQTk5x1!#=AR3$8j^UleDM1N77j->=*q+;)BP>~iIENf5JxZb%Ia=E2OK!AQD z(x={=4e&b=qi6HOxzE&#EV!VoVsjs6F=nCGJt-9On&$)^6X6eX*Fw*AegL;)3L|1^ z4Loz?Y_IiKrgOu0-g-^1*lo;I-~=x+j5H1pq5QDkohxFxbu^brE z=qD*IyZUsm3mSONN$$sr0(h)mWx)kRQV#(vj%xK*blou}RmWpc@1FcEl#-DdsL(FY zBg0XgR9IwxaUOAy6%axu91N0`)q{li_;^;=dBWiJzZ3q5-c(z9B_Sc zY5km?akYrTLWMqPTt9w9&(S)T844(}d-*jk4iglC;adcVJk47Fg;s@yS0@jV&lVKM zzNj)k0mzUx=zAe~fxar4C4X)?kWECd%9t@wRrbg9{C{Zyj<>Hr7|_a7Q&ByD-O&i= z2OT3?v};WTsT~WRh&yv;T^dzR?GY@eKfB;2BI3Ab-C1_V3ydP1i{yj4++3!~si`p9 z&}Z4Id6{Y#@1KlTZ7ReII-?kML`Vc2JsD<+4O1 z$vrV2*b>c6b^gM{NSos=&*1YsrCQ85ZnK{Uby+>`p7WoAvX<{r@PzC z)A6J+ZX{bJ5Ci^{W><}D5@36CM$OO!V$oa(5W}5G{2m%c3O|19F6G~G(EiW&6;5v7 zyEkv{@%Ak-l93a1$DX~q^xoMxwXdkEXaGnbc^WR=N;~_RS$T4>v-%yh)Z`VSbK|0- zLV!k3l@^}Y>oi9^fBvP|2v99`?x$n1*1c8b254|8l*qr?q3KUcy{x$W{ zFHi+T@*gOYlV^;xYO@5KE;uDZ$TOT~icK!{zsdiD=4)lj`4&iyvo)vdb+8>S>T=tS z%B^R_L#IE4MMV56k)^V2DEebR2V#}QGN2Bc!}JVnxc2xFy8GKXikZ47X@}hj)t}zK zkjP%yk`vJ9S;b~xgAuHQpa(>n}bAwn1Kc<#BnH}>=p)YS>y0`TSm%GFJ8f6xsB zdjaR0JhDTB(>e&J`DRm#L=@o#FmDcLN#)(=I@NB4@+jf{f6Y|9SuBGn zuU>0MDIn;OUme7EghvKeL~037A)P3egaFW3^IPU@TZi|3=ebSDYWmnpVn(%c^CVF+ z%inqK&KX<&vV`pFSTaNs+CHdXjk>{xFeM$tHM;;Bn(k#_tN+_-i z|EqHtWK7)M7_$!|mi4?mQOa9!~yXb2(aW z5;#thnxCNWne!5e;a}?9IxbAY)((6}J@K_ZjW4{>5v0#*NXClzP!Lc6_7(T&<|dLo zco3vxB3m@d&8LJ+11ELL3dnSc_$h1ilu`R6r`@sscP%!KCmHlPFPd8{OY)98QWF)+ z<>k_ju{M?a%gM(N&Q&{O%hk>K7CB4V3=9&JUhemtZ~aG@xAoI*%6_?-)vXgf@=^)W zo1#J6ho&gjGS4O{rb8W)VoNF)vS7+y6_Vm<>98pr0l0Iyf^&)4(8isJcHSz|^Ok9j z)rHIR;}hGB$3Q*HFYW;QT zg^kvKCU~?p9W=RR^>##gv3u%#Wv712&C*_X#_3<@9DPklp!?@JYHtZJe3VW=gBl}j z!VkWdyYv}#$y@Cq`TsZEN29~H;qdm&^1nfKh*^z63>ktRk)G)f^;w;DQ5O4AWTMMr zwN<6PB`?u<`K9kWQWM`HU}|la4DCzP5Z;)qQ_3n5_FSszy%ix$HoNuXPKH7v%m(zP z1d{NDe{f?+?s{;$=;@Xg6~E(ZFqByUT#A5j2Kk$A-?lDvJWoWj?cf5rJ63FjEE2>g zgj^qd*nW11{>c2d^ZK6f2|knWg!7jEpX@`V`~`mUJ8zRj?BQ^(hBNa0Af-E2sDseo z;_=f0*f|F@kYe&j;j7bSl&i^FY-BZ4F5WQ*qN5gC!l6p2SP20_hx(4eZDxR)<=eOL z-JL!IB-Dt3O?Kl^b>{KL2b9cZz5QMcK-oMh=gB2bxITta#a6Mi;=Q@;;(rkvKgqjsDL_Qm5lT|7l zc=Rz8@QiHNkF+*MD=`4cCFC{ayot4vyLVe#nI9ylSL4pNK&&u)YUZjHM8-i1+g${N zdovbc`7mFPB&EWet+b=msDf>{;i@)F(48AmWUzU<&#M_+69NweYUL1sX$`hEvhbhT zNJYH48m)O@x^Jex1)=HJ|yD zJw&qem_~J-@j3YPhAK3-plH2IDj-b<7f>e5DOWst5dN(Y2H?i?y559cBHkU(*PHBW zkZ|-e^>!#971jQKYB2VqkG3WGTKmSqA2&*~va(!GcG$KiYeV4;LbeQwEncGLKjQ|2 z(LHnX1+)cOxkQ7R7^qq`*=eYv>p(JX-_C7kj6p7#K>dk=k*Za)i0q%kX-10yTV z(Nikwlmf_xl%sEO?S}(kJ=s8%l2(Whpq>;dDZGFDjGlOc?qc9kS+ADA-Zbg~F>lFz z-No(Y!0qvp=T^=jmBvI?1L>@`q$sI^_G!uGHH zD~AK=^r$7)6Y$Zk%=VnSpRPUJnz<%WQsUW#_ZQuq|I;#nS-nIT|I7DB8WmYj9@qRC z`n%5Sy2t3WJ(cfxIXaqw@Bv{%R@aWj-(THPsg51#Z_zf&Ehe6nIMPS4FuW~$cX*Rg zyGq(+DqV#G9sQ&ka9rd8<+h&s3{he9d_+XR^NbXD{G33UPVKr57##m+pT(eKtAlO;m=b2^Gzz-$OnT4-ZTf1cY|Qs@IRIj#ffJGXRHG4XquGCr!8;b zoZu2x0@wliV|!dkhO|2oySXH5;UI2pWhlqRV!8;;$AUNrIAagj?;IvkUL+eko%Msr#2GMy)3fMXMxY@BUg-J6|TPn4@c;b9=2CG&IADvUFr$jod)>R=IB!%lza4M)0x7Qq3`Ca(<{s?^`O{=Q&Yw zhvT3?d-7r}iAunIetvtQPCqCfi1u9g7eoLgk`<7*us0u0~0-*tm*m ziFAC0TI<-3WzVFfTo};b%7ckabbSOr>PFPv=kG60Ss_t_&J$1glJ_;*>7n% z1=kHY2_2?+XFDLiC1kez6oGK2gP;tv#q(-=yZv?@Am7g2-anC~X<$W`c=_1}f!D|953qQ4uYAiL{;e%``z5eR59lqP4sBJ{$xk z9;;-Br@Mk(#Ti9Mvd?`I$GSyKmN(uW3+|8HXsT}wCVN_C62tEq(u=>c*L=J(RUBwK zK@%)0KDGlQWdGdnBMp4jc1H#>hOVJ?Ps1?I(=$5K_iO(H*tMl1g$b}-9?cINOn*Uo zN#PH4f{rvZ$fT)P3%8N#55)zKmS3}y3%I1J@c}DLEwI~{m%Dc`iL@4^DG+=r01>kh ztbm_oYY=fZ-p>U{QL0Sen}&vNfV|c%Ql>8rY@B~z9hz*!hlS4&`bmmWu|0k1A`FE1 zgww@s1W@y}y?m6*V7|C@bE<4X;W2H-tq#n8JpqvYdI8G=xs*cm=?_atk`(%$w_R%U=ED#Lc1wEM(rZv!!O7xkJVYu8U za6S5f_6E5nKHLnIke2>ZHN`MieC)Hc4T_sUA*4CJIp9dGGLME<{>MY+c0q?2;@%j8 zSLBS*yUtyiDuL->qK+gBA8~j_gC%%`C$1gX6lGbBK!7NLwiaQiaEGCK`{X&(+%+dR@ficje9-;y#OO4DM)&oU^+Bc9s}()NuJj6Go(Ty zJfnN`3+|*_`Jq({T}F7cBY(}#6H}$3npp5>DEk5 zb+}ed`6{556oe4GA?Xw$DVNSIeRW1iJy4~`dsdZ0Xg9;cc2pOu{DZLRtja+`p;_f2 zzG;$~vR;Ty=+%>&pQC2993wXW2(u)jgSW+ba~!LW{Y5M4)YQ~{uw^r8a5jz)1*!}S z+AU>c>(qOFxcVS54_Gg9ra(GY2b=MMV#KW-f*aSs-!;QquoVkhI|695zB}lG}b3)_##vMT&xD; z=+NQIZdM^h)u7!+JPJj5Q&A86rdiBIAS3HI?9UGvM>tH^jz`u_^~*i6H23x{e*-|P z>`fHldt(nRtSjOYv@U)8=|Nb1j-8F8JzVK5|Hk$Sn(AR8IiuL9|98nZRpE-{19qV2 z_QzU#x;X)hHYfB*^UvkT0&S7)L5=IaDPszsUx3aZP->$fKHNNzc#nGe(MV5kPIUMR z+02<7cheu^K>jZjZbS9tp!s$|tnMJ8Q)$gtysdMNtp}RBOm#}J)m3f8r;xhfJ_8z5 zpOvTVr%uQT5;NWu`t$#Yq$je!$f_X$p5_3!o5RID3+A;61%K2}qs0ppW+k&9 zSLjP>KPThq!9PW);KT+*Kf>z$;;T;rSoOrLlXdPXyFp0X=7bT7Bj`I6E47Ayl_k$` zrGV;7Zy-GvSx^eHzdrLPcPC0qPoIx|T8|p$ShTu#&cJ?9{t`+F!!C==Ub=4#N=-Vv zLJB_w7|=zCigTY}0WGSbLGTSqm&56Y5S`j_B@CLvnYh$Z4jP8wK(^5B1k}R zPk-=lBa+EkxvbpBr(TobYzZQ#N5?RJ3@yv#s1m=4q>#f2Z%a@@>OmbS4q^vrDN`-X z5{{6R2BIOHw(#8u(w+F?oXc67RM6=G*jIiYc!f(O5%TGWy)r@jd1VdeVWh%u=m#*L zUkSO4ecNY{(4Og7O<}*a$MTkE5aDSt>kUbX%k!h>t=FY0=Tiqygr`C2zYC$h^bH}f zSC2g~PPw6zPmr53W*wT@22V&+y>|lNn?<>3%@EQ&Aa}Tsp}0%KIoUk=di8+lj8tvH zX#@WTjt*2t9dkwRzd|jYZugGfGsIEFvJTK~gV9fg2p<&&uVxUVMW*LHRevOm)CZ57 z>HlQ~a^_PF{^5{7yy(FbQb5p`yE|@Tc##UCBa5Nxyvi+45P}?XstTFr>d@vVc}g#3 z2EgnDW(O~G;@4UgE;r^EbegA_2#|SGBr*Mms>z?CQ{rfEsmQ5-%Bre{Vb#NfTCp=^ z2{}U?lCm1GV0xWkTVkz+ln?&&R&ZFQ`M!46IkpemK&>Q%ash3;Ou5r4<8xlCknV|K zc%5D4A`HAj3u_({U$1&f^lgZc1AjDM!8xJBB=5|oKO$BX|95E)LG##~_(%o%NKk-d z4i6`;--OZ!sozhRPy9gk>{$0K$W^_}Fwd0CQT|87;rGhwMbXa)@5psfc77-*utCBW zkTSVK-Xj{S9P81-f^`f9Zh}=L1T5H;P=BOI+S}jFMf-5yW(ieRPEHX#E2$7Z+J{K)fBsegu+3{aoqKT8+ADW*dwY(^X|~Uwbz-9} zTj)abwQErtz_tA1|z=^EFJK362N9y7{&3%zB> zCb5&7w(jv`-PUeTUVDEA9xkr;%1n|G%$6U*!j@P1E79U%_yP=tVY4e?D6^XIE6dd| zjaZ|l?{dkpntCf8nx#>WFCUMo+nPPU7isQtxx|Ffb-Br6I1{XaLw4I8;X?iFh@hyBHh2UUg?8f;q1CNEE^Hq^7eS(`~WhPd+ z)r`2|YfeoX**|4W>x$y<3_?t*ugS$E#G8l97&mfML@YE(^R%jOe5JcRFu6SYyRVl0 zhf|8gJ&~qpvDlZ9C13NivThR(=Lc>Jd(DCt6P_!p{gEi?Xf+lMjo*;a_aYJYzl+d|E)6k|g@|0urrb7aZiqNwPX$TPc6!gVEx*Xff zYB9qqJINwNx9xbo*UER!9&AKaz;f^kJ zx21Hw$iHrUD^g|z_g2u{>%c%4XFwGZnpMjRi9#K<7+QT!T@i2S)r!K$26{e~Y$bs` zbz@s6?M^4AD%k~2xa`X@Ja83A*q5w z{9WA^YxiR^W1L%9aJPBwgfRVtD+kl8w0QL%d;R(zc|_Y|%kv+cXX^IrdsYr#H_ylk z4%z^c254LG_wSau#f}knrSn>~Uq%vj_)Er_%GLNno>xKN%eUsIYoFhx;6e$&-Uut~ zf~(x4*!FT))zR?rjV-(!4@RHXcwORqk*KbU=j}?77!VT@>-W^Xa5>%Mg0437Z7Hd) zPHsDe<%^>$PrRsf@z%}JB&@YGqi?g7)RDIv`;w~0_g_9!)2ej}Cpud*7Xa{-lA)E- z(Veo-tee+JI$G4!l+bFj=7TfNww{4O@Y|4knVMtwD(yQk*at?O6W=_e@(dN}pR8~V z=z6nevSQG$RC?zj{YPl^9v#%%z`P{*9sHzZIVP1jS7(Rcal(hyj9n|*R=ZCbSxVpW znf|kwecb_7eWITtVQ4`?bU_EJ_L7(v$qOCCO7D+5X@YRkoMxrlhqG2E#{Z=SxV*Ne zq2ay<6LbFfo|1QJ(8C`-1O$o5T9Cp(_Kd!pe*DAMqfPh%M8Wee?-}mjVjZ)jv6`;x zXqUfszlWejL@~wYvwlgb`xF$^bhF+P;j=}=t)aglgo5}&phnhI?_zrgPDk+q#|MY; zPd|UQnvNxBO|s3g=&)_~{ub-%uaB47&m`&1C*atES+6Z8w+D7MTDI$V^{Qy2>7L#;(3&(%mf!0mmJB8SLiypWJziPYBIq0UlO5)HL3C6D zzm|qCibKaP)8aL)ZZk{>pO?6;$)$FkoxXA$che-MDP(}3wKw11AsRl_5u~aG#32z!C{{jJ8F+UF% zCP%g5D?_?vv#KFMrr0RUXMOcL3S|ZE5B7pwwMxM;J}^mBgca12=x384fCleeKd1wb zbbK2dQngd}=kQ6&2Tzjho;>??xT`;MzDs?BK{dB|j+(Z>t?MSIU0zRep>}0loe!_0 z2gR4PG^f}lZWQ|^CW(gFJ3HEi_|+FY?;Psa{u&v6)UK^+GU<|l_e=_{R#7tRA0H_6X=%8sQ--~Y8EIyb}!GJYdlHbZ$3L>|D)a#@ew@<8yS8@ z!k{thPr1}`D-ph-F=2PhgRt|JINJDjB<od@&$?opeR9K zM6xrn5h~MRAx@&xwpTp!1$&L6EVA@i*0T$qk5F%@cs=Yc8^xYU7u>&)yqS; zD4=+7TA)An!X-g#uE~$ps`D1(zIL#TTArEVO2OJ@zJRa-w)#; zI;}E`GiRM{)%{Ly0%mQ!KBWm0sh+$J_g)E_tTlH52(M`4^(0z`)pe~mJe8%}O`p-w zL=l~l^Ew3Gpo-&Z)iMq~frBa$nt-0fN^U-4?RyT>d%4}Ws6P7pi#%d&S&NiW-=Tm6 zG3Ab}-}P1)iUASD9b6dTA!mKOtJK~m#ZQNW*cfxZg($G8!+2Y2kzQ`Tga@9LLK~c8 z&zQJ4y1PM-El;vnNR-83aHP%L{6jHuPu=>}|AbbN#05p;W6=|n4@P|gS%$@wbWQ+tj*c9pySn+-;xftse!`PEBtF>^Ee2nFZf3qss;4Z^c;9aj`S zt#`*bnIOFoayuXpR){G1<`k^uZXJEJixXRFqgPr|j~^I|t#Vt!t$|f{-Zu~edL**_ zLrbYY9UU>dlv}+MQ~GGYKRAx+!4ti=Z`UmD*mE58%qFzCAJbtnF=Od4Z(^lBb=_YQ zhop+&?V%MiKNUC5}=b#i-9fNfyVs=d`bp%aH&c)E^DbQ+Aql zHV+u0S-!nAe-y0D)ct9(z99NtJ`q8*kWcm(1icoG7A-Xai~UWMr5?+wkjE8bucBcj&v38yU<;LRT&v7Vmy^BsKRQt83T>#&oFV7qbf)efBJ+@05BtTjyQg zwovGrf?Z~*opVIa@uHg3+87GyXl9*g24OGX?f1%-OEQ= z@pxfX z9X5p!o@ZDA)vX?IqLXA-UyUx-E1AW;@a?^^W{)m%pEOmHT5xqUJpqus0wR|HGZCBQZ(eIxC9~K5mhP+2}>sT2! z?mjZask?rBkBqPJ?(uR@LK3STn>C%rK%sv>T|UuV{T!X(guiKueeW`F#8_?E%8J7a z6Nmv0TZ81D=ME+kiBw7tBtpM;#ycS{J&wo6aaQf`j?b23O}X9s{g*AT^RM&4UrGQ` zeoPipa2OtB>g02S2j346i(+%6t_UWT_pb=CH-l7=)%xlIB0fR1XKQa^ZntT!&{ck^{L6~_-XKw@PQ_iAjjLRB|9k=-S70)xkoKz0`R&i2*;k#}UqI+~ z>3n<3N2X_LHPMNE@itM7+2%%jv-74McY&-OSs*lCpp6iM0u$}}2Vak9-TEB}{;|ab zMK?y0{fZZFeu==dLd|~nJdAlcw1=@d;9kRr2Fd%F3v7lbu-PVYBI#A1o2v85Ckioe zjAl+SqV&@;q^Hx+DOcekx+fyAdA2r7eJ-bedXd4XOWY~9yAdRV?GbY!w=Y>VH@TF( z(hKTU1X)(ujqWhPFAnyaK(To`@Gx!tZzMx>)2HlqKwE@m3$-H= zGj2L1-N|i`up>;C-7FeWZ6w}yedij^WQscw^x1D&tbHLkNoy`p*#3!m8@z=Sh@ZnQ zd}_?yiU;S%+Z#MuYfG=!h8%sNJ^t9_LMn{o!awUxtWKTbGJh{}qb zR=UGezrKRB+TZ#H`eUPqyj|gp-)HMw8ZFB>t;f}k z7vgCZeoUH<|0a6oyxls%v)a;T)K6pH82X~XXkFf6ZSY5Fnr`bBkxJPV++Q*1{@JtK+VRB$GdXSbOW7qohhbTM zPIFRKO=H&AuQ>E7zkD>xx6KkTnP^jT9>|ex^8bA{BgNsdf+(9)xbMv{Q}1oES`6gI zAH45zKetPge=2D6%Kbjx1v-!(O<|3fh?TmG zR2DuwqK93tK7^36sq1k9|2AEC8T>R{^ELlR<0xc+i0rx9`GZeoL6#mp>CWKtE#H%g zM}owweOKIqkBAF#ap{pe;n} z9Axyj5e?|kN_5s5^63|9E2zby zw(taE_eUdU56svKZKY%{vU@+t6JLRlCMgJ*57EccqCj@`8(cVV+-M*wcT`P|?#$GA z{U@VGG|1legH!}M#ES|!r>{>(4h0QWX|mSceY{2{$Lo+qn^3FYuLhWu3qeUN`LWX! zC`n+;p(0AG(s)s=nr}Le%}@w=z_h=I-({fE`e_tMW9JwYbQkIC@SH(K{M4FIJ<(Z| zzTeWCl5T*7M;DfN?S3tU`NBW+12mUlKA1m?^!9%9``<4bkdbRo3n6@9#sfpJQ&&$H z-lq9e>T*=A`n-krW&8oZ$OB$)`pL#_z#OdV`Q@I(%*}svDf#ub`}Z_ydwk&K#AQ?) zoXMQ6&rY^VOR4*p2~$_%uAUuJd3&L_8QU;FRV(9!1*f8+!GB0U+SFde%K)vS|GFWz zz%7rDWYtGWA|LqOf>$<+heLypi%sNIOuz3d$6tAHU0$Va3!9e?pDmQL9bjFuknR&O zzkug5S8MTpylrR(b$c-y#~@3d;pI@?vpSDcVqDD(v{@RLJ4zq_gI|`+teM`lY;l}@^kOWou!sw z{Dc>PJR5P!q*LbsY$p!fV1okXhlq%R;ayKI@qxPI)8hLbHEL+H0)=UUqU?dp+x|Qf zxR?vzC&+gAcAw<}6;bew-J?IvO8(E^zqe}L9sfWFJnFr3%O8uZAxJfpTo}uTV_w;) ziKb@E)d3k;X%>UuYFX7sPigR858<;fF2@lQ-SRJ96~Me%cnJK-4{<+PMN2n4PCjYm6rVNGrq z#n|4bUoMABWh6JI-S0yR*J zPn>Exu}>R4UK_G~^)}CJ?UAPe0G-gzag_2&-}k0}=Coz-m7S&{sQtB;XTB%I7Ed;~ zLI_|#%t%KBtJ4819P@i>dD9J-7@;x!Z$|{5c(zfRrM-)m-&|~0R#uMnZR%?z-<&A@ z_Dn*VktuNQDnSN@^NPsIGUiQH1Y?nu&x_1b!|ZxuN$l-@b2nYzpF)!N(M8-i|GVwP z5qk8cWb5TbtzF%Z+;0a%Z~TxQB@STp!@myE5Du%8D3^GKw3iR78h(WZ^uIZDSw?)N z`%FYlkGb_40BgP%GXk!5%}tYcAwqo$4pcS=3qH@ua?&TTtwb$p#x95&8b-Wr9q8QI zoZykQNeBVJeTyi6_glDdy`5%%>h`LA7nUg`CV=Tk35t9_eiTa&{5Nr?qh4iY^(*lE zxP6W1F*%G_WK>r@-CKNplcgOK!g}g!XPxAa4~Kuf{o;itiHgwv=-(zra;1e6sLTc! z7GiSJ{G#Hkbm-zadp`9L`t<0;FH<*NYOPi@OUHX>qyg;J1o}pAG+Rtn;%L*$9nshwwfM=(BXv-=?9#1#p1$k3J$1*>AZ@~sAniy?Ty`MQ z+U0~HIJsK}W1LK*~^nGUZ+u&p=*pTa)pCmWo13uSFgahaIt&(I`7 z7y606$HnQUm1oF~o0Gqf*vZjoeW@p9hlYm6o8fvsS!b`4-!}ndW4F*sA9Vn0XiZQ| zto;Yk_&CK04?gc2Ze&G-ab(%-68#l9=o|29$eDg%cra*7=IfN{))c{O2m%Mio#`F5 zd=!LH1R+aoOnW`rG)JnBZ>B%d)5lM0J|;$HkVZ2zq&}bh{73)9Y82CFUw?!vAuQeV z)wq4mn}HTgK|UDU5*o+FmoINbf>`S<+0NB2MuBrCJszPLcTYmu!Ih_9i53^Po<6rD zV?AsdZvaAyKTkH^=Wps?zCs_)mfx=}sFG3tIb7PdL9#~WAe5GpQfZ6y%c}uHd}skJ zj`sDY-Qg9HTtxn&d2f=kwZ&A~9nkW=O`L()bTpK$Thk$hv`dgZvk5%4UuIdi`1!Qf z>{sUs5rUDiLe5}SZdfgUx}bhY(0%o`LtnDEjcI*-rvwsxII$cL0qdZ_!D!njx&501 zv`0rOqv`C{viA_67e{Nb_os63*)HQ$r|(tw#`1i2e`KLk=Gg$h2=TI@YPR$9%Xm%OLME6nG3#^~#th(Jtc z$n|&BFu@3Wu)m7}dQdnVAd}H<6o0C=Y>)d9m^eV0GW`!sQzg%F4@|x3t*7loUVnKL zQ#?~L#SrR20mJ)JA7R=!rI>c5Vp~mB1&-Mhpv)F&$tSRD&)L?C62v^*Q>077o;BK; zaMr|wiH$PQ&`aipywv;SuKU!??ztA{%SV@2!dW&UVO}Ba2f|RS-TXPZ%gNyZIwR%u zZexjVI1%l9&um7{xE8*pdn(MBTUq|6wbEG-Riz|hN*ws^8OCmWTS7!0*36ap4HD*b zxcm$RJiUd|bJK6`61b4xCL3W|x? zBUXv#v&qrj6{Uif!`HiTeF)4=!9yrc)zMcuol342_RBNWEF|(bHTRP>c|~_d@ChZe zSi>xV*>dhZxuJd%UW2udI`0(;v7>k6X>*_J2Fa1AHfw%1$@}`1a^Ffh@@$l|%T61> z>QIWOn6yK&iw%t_$l;ZUpC+Nq^tB|e2FW`+YEn{CuX$~yrKAkW8OGhH_9LEZVIm2E z>pDRruV|^qE*CL@q?s=xft(O`KuXD8POt{thh5 zelq#Dx=*m7E)MO&XSpkXY@(lij*(wug`QqkXCHi6GM==h5NQW@+Qv*h~7IB-`mK}k(f5D6X&~em* zlZVG3OFubTi0;sMnVMM2+Ceo>6NgRB8YZU8ugv6UG`R^7MIJ6K8OLy#6GN@jP;8QP z%jIgy}V_qSzAicoiEv-leX;+6z z6VK%QWwo4iG^?q)0AOOcr2QPXE}mSF*pT1A#A|3eC8wXru&k#lBJldK>pI@zOW)L_ zQ&b-*&Igx)M8y(R1d+XmdJc6qLet(@ZXm4^eRrbRRmN>F6(Z3b469(lMv-eRO5Pn3k;Xak_T{K8f3ea=-XJ%l(-ICoEit?l9x;Ca3MC z8{3gNBOQ?#LjSn)U?_MDI{a1t_R915nCdzu7#!gDMfpfwd^VIM*6+;r_dog)G zWCTEy3YGZ#fQaZ%veHOYznodMns%KBA5bsU!0(t7|3dpREL*kr_#Y8X>gMX}Q=KP_ zNAW3~sLT1iH;nxRBDkq=KYx34pRm}yjj-}Nt@g{Gc-kR^=0A1jwuR|d3i}Oy$iUTT zPg%*oeEMW~#%&am5l4j|$YwIFABE}#IVN*e{l#2iy}o9BN}$C^Yekp} zsmz_{kM9$vh{n~btiD?9dl5=H`FXNZ<$K7kd(&dOojj*U$zi-iWs%ViteKFh9@@77 z7lK`K?T!(|ES3HEp?#X8NOVf?{0h86azWskM z6VVrC_HPA-T+yjv^m<1;bM(Od%xe4X*`2hl-;7{$n95C2^CG@V5}XgiwpeqAj~vuk#fX2^Jtr|6OKk9GkWK8#%VCGR&G)*=1Jn za{i(5K0qeTe*N-N4~gulIlOvRB)`c853n@*8VwPNyJphEn^F%`tcz!^)GDbE-O6%P z#cE4TF)TVlyu70ZI}LTb1=i0dUf=T~^~I(*s7F`~CEq?j2bBUu`&7BxgPBP}j($R0 zZxUC|F5)=N{$3qv)@U02Tcr?wHCwCC1Q>k|w__yp<(I$O7X3?tK!MT6E6CXI)0h;P z>sk40R&wrZF{@mD0iN~2GlexS(6;(FqE4LXTY z>!c*Tjj>GW4_!JMZ{CXf_TnLd)_;a@w2?J^T8aXo5}hq2Cg=z`VlG{8^J=y35%-Fgna;b$zy~s0lQh+pbo0zL;KS0vu_v>lkaI9o&>>FV@p;#(EEgvAc;{{1 zO@aZ3_r(H}y@0qzIu_Y!wp+{$7H{|xB;o|?1z}iTuTq`SxMfSl+kPrh zJ^st-ohX#q7QfvEiOgK(N;~nTjgrm@Nu#3?=s_6Y7WrP*n;DoKl`}8AXXeMy%FF4{ z{-n;>lKh0BpkW{|;Tg5w+^UiegG!NsxB2p^ZSy{_I8)ud0~s` zcA|`O%K<7Gw5-)|((3TzXGEu{lj!e2+h%hdlW&9Ku}j5MSX9iwvQMd=b~_u;CU)!F zKSoD+(dlq>-!wwK0Q&!XcY5mF79Vgc<|HeR|K|9&YOh&mr0f24JT z&72bP(>CR1%;H?SlX4ZzJ1~tiRxFwF4xLP;X4_>zQd$U3%YMb2Ps%WGpt1J+JulF3 zQLedBGI}sHI_R)Y1A%}c=Oc7vFK(MNASThHDZ-?q{&5q1Y|@*N*Zp5w0GEw%`{zq1 zkjEAdzn8-$ODsCYGp;GBal5U-uFDSAs5QH7Nj+qjEIYCzsUwTOfU)8ATsQL z4MP#hqv>w>rv1`!SW6xAt$O>gJH}=J-`gWRu3}G2+`FLwXQ9wIH*vZqD%JIz8#OTM z*YjO2cEnADt_OaguPOA_XcCtXIK3I34#N*7w70j$m>!vDd7WUAza77 z0`iv-XBq|Q_WHnAjcE8$8&KeUt%rEt^FxdC3;C}u!F60uVPPn^ORPsQ5zY$j_&1O* zdl-i$TXwiI{c^LibW;s6THQ-C|16258*89e3(7VXULFMR_Wmqq=+tm-oXHw7wSQWV z3=9&;6lb_S-;;!_IhV691e(U%AHW%9bzgcN)%S?uzld%;2ICN1S~Qz^LqxZf(aX8h zy(b`rfj(m}OIapeb^_pszW_h136o9G*Vez`i0o*GXC-@E3B-Jzdo~{e&J9(|D~#BV zEKa1zh`^$2*eIVdJj}2 z-6XFugzq)hy1%zO{P9uX#eP&mZ;>2v*OHNZ*Ol{+uZSX%IG#%Kb1zFda1m`a7~~~j{}F^tK+{WI=@s8z3EeK>~UHR zh7sjMOn)Jtf1xuf18z=yL~n+IGau0fC_Na|7G2uIV@_0P>?%3GbDuBl;N)G)+7SKm z)yfndIsPe2V>WQ?@Wvi(&&~6H$210)6IMdzg^Z$WY~rvVmt4@3G3pKivV^&=Q*TSs zEGggMbS-#t6wEOm*_~YJJfm01fBW|5mB~_yw`HrS*9q>2b`%1z$A5zoO}*TU!#tF; zM&!}Y(VPFA^{*SLWwE)PL#ic+Fz(*H%lhvBV(%@(s$93f(TR#!$Wo+53_@Ba4FW1k zNJ)2>w9*Y0sB}w9cXx|)cc;?bU1vONuf6_zz3;xxIbY6ooe%H4_%KD7lleUNJ?=4n zF~;;CD3#}1)YAIDj%?}tI02aziP=eI77*zZ0LT$mswwN&mQr*y7^!?U|x*T+qL2;(>g3yU3NSU#(<!gUb+Vu?)5vo?f6FR z2Jbxt562TlBR{1`*T-3gO4)AQzt$q3F3F|Y!>;v~X0}zi6`wUgrQs)_iJ_O7eBQ;p z^ISJi*6dhyg4r(6Ug$nCOY+qz$Ak5C$w&C~iq)P!mDnVF^d90TX}z0610D;TiMYU! zMx5-P7*tAcLVt(}05b6-`NoGJ`?uhr5TeAk^)Zcv*=bg=a(slPA3w6|<`@j7{jeUA zm7_JorT52hoU(qw%BzpCk-2OPeKJO@??F_i+ujyvxNh<)#h(<)0j;)SuLbJivJ{D~ z>!?px@N^a$)IYk#sHsvRO<#b%{Hfjl3;>k(0BU|Olomr)>Ej*LWMfyrL)qL58X7+y z;}NrT()r5)7>Hn#Ppc)eUpHL=$t=2~3S>l@8{I)D*Tr4g8L8ML(Dp$&iz>z@w+dHr z*dwd|8ngtNy7t;CefCQcu{e?F<(@L`U9!gr)C?|@pE5<4-&iJl1KRR?ct^R_qXM{F z<8v*{c8j7aW!6`LQqR#2XC&FqUvPNg@hw$F^yK&e*Q4ig0;EQt7k3xb1fkzG|D5Rw zfU$8d6H$a~=$o#lYl&iMv+J9?7^rJxoOe8U=6=Kou-4W){{%c`C_YJjBC0Wfs%U(1 zRtMH_XPUk|;J$5?4*;)euDFl~sfoUuUY7 zeS!N~Jvd0%lO*1|;LL4h=ziYayNTmozUh!?TWM{4f-o+M=W5;8zNMk#A~7RHDpHfZK+7P0 z5MpFwuW9lhrpcsQ8)wB}=uWnm@n+rSW z$K8Qgym^&8_UryWBjM8TdYviHg#h1(W7U{+G+R3r?#vo+d<8-7sSj0C$)EApAezN6 zmf34nlqKG}4#%Jcd%iU*1}z6_uZ^JE|1hmc;Czu zvYGt4HUX{KJz+sS91AGQex$!97V_uOHG&*nwB1Yp(#DqdI&IC879Ol!L_tf3h!?tj zA8WJJhnRzf$UlGiQWsvdhG>;X_E4w}OlD03>ZN#Qoi}_4kZ&|#syY5X;SCY@IgrHs z2BsT?Hx~jDZBeM$*w`-iHk34Iyc%zO$nG-Z2IK#`(GrUoi8a&45JocO+C$E%Kn4z( zg8IFf%VH$l+7)Z~pw887Ev5!Pk zmDK1*t}RngDcizY3P_NOZ5L>e#SV&kLe_d1P_g?IWF-)BaK_7>kUpxvEW_?40SBKb zN=#)VZqjgG)$)3&iu^!@Z*W`qBq)Eu?MDhV>~r^BlUH%}vIzGA!BkIMFr=MSXVCy^ z11-S|^K2IjUiTB8a_>Ha(gcJS^FtNPhJEI)x*J-caIMee!BV)j?y0Q>vy(Lq4bMS1 zW57+)T>oDAx;q)e6SE%ryWN;&oSu~g009!sE~7UVh*OykS#>aIUp|=)MYj)6l74G z@HQN+W?F3l&0+PXQ?lE22)5@l9X|kUa!;vf<;tI9N?@!Ey>t{bp6=47VqPPDk*-qt zP&&nEjAwQV`g@vtADr4T}ZC4+3I=kqlCmKyi*LFnnNftd7LH$VdO4GeK51_Z^ zvoNeLP$Q>>i07eACa_TeTWgdru_TzMLS6=-B#p>OOjhZT*LL3S#B57>1x9;bwqnb+ z7(Z+*MIo0cYf}5WAg%V`(T}sst4Hf<{$hlgdbYbNwrkW2b1XmxUL*dtO2KJ6uYjH#KU(t=i92^@ir$$&YbOFsXO%5r1w;ZN={k}>l&;cs)I5l_|5hnrubSD=lNRh5HC8`gZ!e6gCK?ZZ z-Y||pj5DK2CCz~j3~Jum4H9tx*1mz;Kj+Xt7x6TFF3Ed--Um)m)fCaGg^406XuDFs zdKI-gcC~ge|JEy_1`JTY0RmKNxyHCPQqI}aRftW+pTDy7b&-OKDo#_|babRpH}Yqo zdyjr=O`V8*SCTw?ajJ06H(cM~qQypzN(_~+5s+(60q9P%B$uh^X1c=B9~U-` zZW8QW4j9wR-Kn@A%n;>~C>Al}JfJ6Wxl`$X(na$cWz_i<35Fb6(}M?|lWM z)a5gery2-D8(qFWVr8vaYT5 zbMs_KQqz@k6ymOVqNqA%=@lroAJcg~(YO{JBrkWq{?1L-VV`S-FIPf!#4w>B6sq3UC8wZH?7SvN3SyM<;8uC!_37yp=2i|I-;g*|w)2WPk^X}(&)=79 zg)}}FZ+j@{j!oq1_uyiRiMjyruyv>B1v_(J;Mzi033=z~L25lz$|ZnPv+etCP7_=j zG#j3`%L{;xI*71>m@In3;U(Az$}w9Iy>QSDr2noRsTA4bE#AI<>DkzlNfwvQ$tNHt5m$~*w1~flW>hkCKk@SoRZrgc|V7n~2AvcCdZiGcPpYiu1 zI|2;7-pfY%&>4(wlXGQP5=26Ds&wV*FMry2Jw$2oE(-1ac8~1w&%hMspuzxsP?{2Q zd@riku44H3@vXQqMTV&F$U_21k~Lm8sMW7(Ws(zg$gYuL&MNms;P!V?`W-@`i7T90S&{$SFrYu z;sp2F(KB$RK~L=_Mk3!Lb}o)D-r*1Vhgm~qY*GPALSZUW9&Az2NMAc=&Y0*tv#Wy* zM5VORh(=rS7abf>*&@j-q)b7y7CTt%dFhB^dI(Pkj^|HY4` zF@D=7A%IDBQI9?KVm%C%La)&xXi@}8BWc`XCDb7`N@R>|pse*D{D|mW6_z=b>l@{9 z(GO~l3TA+S6&Y zpxx8Vi}q3ZXo7kJ{<8vJwJYqyS8p}qzy{NKJbF-<1jh&{1b;dVoeLE!hYU_*=WCrP zuW(fss0^~5TDUkL^zHdYgy`sXmlF~`3?bqvO)?v{6c_O!_ey24hk}6%-7}GI=e(Gm zPv^FxJfPhi|JMADBi!?d$R*7oe>Te9kYf%#eV2W;G-kXw!%gfE$PpZ@g=gXwp8|9^8y2(dPek_ox%YW_ubn}9r zcg#)x{l8+QmY&=#5-0gsK%3B#(%_r{@bM2wBqU!?UwvJabm29ldu%M74acr9O?p#9LQ+gzIE)RpWYEk*zs)#g!SyMfV;zDPZ$S&*@II+8$+S{5eZQf|5 zZ*5~iZ_0jxH33E>Wb_#F2Fyt~X|0BXFukHRoH>#w$+P_?cafQI%R>zf4OgNbs+J3R zzh_Q4&BaZsg}hCWujYHuvFLk`Bk(+P553VpaCNpo%DwJ9l~T)b0z zfxwtRApHUz_-T6ml)i;mTm2?n9$Zc9Z6s(^8u>%_F9cm^b+m-3r3TwHKy`Xn4>=8-E32=5UC zyJIk4v%u4j(btYBsaftB5s|K7Mi}cGjWxDw^8+HkhSL>$1pbtJV=r%scslL~dwb3w zQQgH)`h9XF6dWap`+)>b2&ly#v9%|$Q}A0OB_UWlg@g~jfRi-P`Idf%YHjOK6mtBQ zxIU;V4tfHE$Y2%zXwEI}ei6$6;1HA__wL=p0N%a3>6JdnWz+Y@&Oso!I@i%__%7w@ z%`YEK9_qe$`5o+KKwMC@#4aSn$4{z0Cr3mtTKKbuK4-ftB%7dMq%di^210!3qIU)B z&Vn{@WS|mXn-GivdF(@}+U=0OlYko_5rR=;U=pIEYt__~+YS*!{=r*cd!Omvjf1T@ z_aND~8I(^S!wW_8I@P=9AA!*E8obxx+I@yqTrjR&L%|mJhKOY-vlcG&5r<66HzML1 zZotonYOT*!23yo=LGYKIOOt8I^i$BX-Jt7cKEiJ=Y_-q<__$Aq`{CTd)y9My-S{R) zeIbmO5&M&=+O`i{aa+^pIxWQRIPv_x%tNzq3JbRPcP#~@|75AJ@w(vO2V&u6V0L@2 zl6ntMg6FZg`9sdo5g##x>d`(>rQV^Q%7_s^ zkrFhXbuuM*MM}C(k!@FZmuH$hH2#a4`Ut`%cZiOGP;_!WM;eA_an5$gM&)qO3X6%o zFgCu;dvyv5hL6AN=vcZF5Wtg+w{|jI=tB6-{)YtI-fwYhk7wX4sAl#LvHitsz4@#WcIns{w1Td-=Y3xiaca8pBS_|8+@3A z#7{GWJUzdjq8{+`-(t*ENs1mrGXT(uC>|hj#Jr04oayS8@ep^v{Bw2mHbpKrZ`*Ug z4Ij1C(3gb=#2tWn4*Ioe{2C8uHTl?-sV!^o?087`QTW%hD#siAkbqKch><^=N>njS z(H69Bv8x4z4=DQn{?fsW7woy+9e2a!J~+B-E(|PWKVq+02*AoM`tJd8}^+MI6kA{}vpzKf>DTN7R$A(;pho}DF!iA?@V@n?I)MC}Qa zN1vDb)PBJ7K~NCK0ebmwyJ2@Pz3=oK$SU#r1##{51|m!RpRZcR53p$X?OA?HOwXhZ zpj;`%BJxTos;~ef`{-0~rU~*=kSqU$v|dwR{tk4NeulhP(Ib9_2M?YLx;zKYX0+r8 z1sT!L^_cUyWec_HoZ^eRE2?_H2;eV7n68!NSAEBXkZ=YPIF zS7CO?>E1zZ193;xTQ??PV;g6KkM9r?5`H%c4~Bu!Z2ge012TUJ8=L?2>u=p$8$b8e z2cNz7oogGpgnD9il=@I9Ux=+}w&TNg`31iUU(X)Ci+obGH^p#*g^Ky5r73`J6}oX& zTlUa&Q##?X9p4{e0TA>+p?^=kvK)+q(PM1~^amhljE#*$x=Y!tjXz*pg=P$`I2O#z z5b3WM&NSZ#LI2R0=zGBF!k`!f(C5VhnnJSpRm`&K_5ZjdaCclVU}=%UXR6|c;`H8O z@JC?WtD*8Q3*Q>K2ccM7^xC-Kb3|?fHoPYQl4&Z{UYKb{8uJ&zCVOJd9x1pvc#_cbt4!eeY0Pqo(R+8PO~**g0c~;*5xBvd;=i8Tv4sZU~-~RiX&#!;{fBgLSv7WhA{{0*O{fXcCd;IGE_m}Z~ z1_xD?z59UfwHS3h~kzd71< z8ZB`k10hQ?Sg5cU2cAyw@<2|cUrG-_^6l<1#bZZ8Plvtpn!37|lfteiD-T?TMu4ro zC32a&bt6SAkKZ1Ye2vQ!#>L=FvM0P0L$ zwEwvR_LTLP26_`uj5+9;(aC~!xCZ0 z8C&Wk3-%#3aXr)FWuK%Dwbzzv?!>!xIDleQt0u(WxwBZ%8mDN<@DCU5DpmSDMcVXKJQ; zl@|~x0QNL3vYBV%fXbXMX}N|Q}Txk);}W-lg5GBzqJ7W zjy}n@s3$?2!HPZ4{@dC*y#(TeYOaa4D=i4mc33d}P_Fe^rs#b?4RHJ}k5;H_szPpT zJd%68UoLEkE-sEwYkN=_SW7vDRkZ1ai`zY|zAFG;B2tK>Gl1J9$0}0=tm?Fwg6)nF zzU)d%84RdTk*567D8#Fn#$Z+DDEwpp3(_PY`DZD};sjyX6Kg5f`^Ia-%^0dj%diM1 zSDDCAe_;j*>&3voXonr${-le_{yBmRoepG`G7)m@7rZZsx)97+11$tOd%{<|S2J1(- zPePs>_a*&RLIHx|n~;6!Rf;}ROBhLCv3>eSZPp6{q8N{51bP9g5-~TSvR&5X0_mld z%vJ(Gjx&)XpK|-6YacCsoLa^3m6qJ45~P952RF}m;17b_R-Q4k-{{EFiQ#!W6}e|P zR!~0rscD=FuwZdlb9hGUPIO3Gf$8RKDTRwKGd&7>|m1$?ov>Qoq^z zf0>VN^OTbSj}e?wrWZ*DtQ8h&9smoFKi~+tS`aWG6Z=po$VJvC7HQ?>Z$QgD{*YCK zRIGvGPFoP?gDR#nIXU_7$zM~&<~tWrKWd!NTqix^GbJ~1t746OFwk!2Lz%XBposv? zPS@;6uu9WIxdMit>##HwcNLKSq@q$HuU@z73qDHTtm{mafBu|XAhbQ_hw6j16z6^C z1(O-qLMOI+_ijL(c(b!87Qun{!&zQ$-T{a#APzB5bk9;heIi2k4GhI#o{D^cW%IMX zo=bX<0pBAB=peR3laK?|yN}!yyJA6@s5WZ@#w%Nfh=d$EKY?L|66lPuz1)RaN7wq6 zZ~aE0@z`b8fY7qzlW&@Hk!3i4;Nqs`o`C!Wg~~S=yA6WbS3?(7r;Wk83O$?ycii8d zKl)y7q6mQUB*0?JiuAh?USQ)i+7`7W`hd=L=y;mGxuJX3;TdD5qjQVPY6Z*HLW+nj zo^P2ZP;lNwbFkcsibTYlbR5&jXlUMNxLp2@YCSP%&`3)gFPZ4hc@Uf-4EDasZb)bc z4SKsT!3mt)KNeX@P$=)~yYu}!WP#a*&t$d*jfa1C)bAshO}R;lu@eI|HT5M>)CoS7 zm@J}p8kN(V4_EE@w9f;>6wNZ}3`qamLHiNth-gfd z;7qu5+3q41mV+F_t$OAM6F}K&cK+Z^Zw1LVjeKDZ5I;yz-dn|r1q{e=yy%PTf7+}!+Y`T&^12+!xe2LVomOC#p>x*hOk0Uc^ z&Bh-i8e>>F)xJ-iB;!A)s4b3HT0|3JBPDjBiBdLt&TZ$BWA6nd)$Cs>gS4QN7J`V$ z(J~C3$$8^fRKGIvO|NxoSp~-fzf}M-9@HDRhzupx8c0krPz~Y{ZY_g1h@;tgPp^&w zc>!h|)F}Hf*kciradV~x%au9a>+|PYu#4vy?O`CmJ}4bw`cEZvs(X`oKLgR$q4c*) zOug8z+?u?9o|{WfP?*FBMmAgk=h2&^b{~epy8a9l(5lG5(g6*Y!*4zs^CC0M6_8EgVCU)l1&3pL=7le zyAwoW5%gnu?gN0{7^uR7v*?N=@2rK>DUMTbh08Dgz;kFwA1+9VeJU$!b^01FBXu}U z4lg5Eu1m^6#yzZHZ=C$*`$VW$XvoR$`5&JaulmvMQL>lZpw60``t@rzVvTdoq5fo? znRlY&K(^&fNq2Aa*n6L3iRtwd#s`GG>7V48`_dJ~x<9Oh1%CUcAa-I`NG`4My6(!1 ze*|U1im{ALAU@-Ph<|UAjm?9*Ev+yIv4VGr62_vI+Os}CQ^OIUt7y>DF7!#}ez-RQ2m1?Z2bg-#XMrUS;^6^?EJj&5sw zTBYZGX|j@Y;-oA#yMcmIRldGPSE{T;U=HYZe|Q#2b-LbAo_>!ABWtiu^P{ukA`g!= zkFU2F;-RmY!IP?}L&%~mi&WRQ@5M2qCR1|sRxWxGavh{y@~j~h<(FIt8&>vxxPN@sWNh>R6e6fvBZre!Zivy{toCqSs0@`Ej<@ zo_ff5X;8?EAJK~a>56^uR4!d9&5DFAP20VQG>VOmZuHWv*9WhD#49GeoC)gS$;xz7 z>4DDMvIiw!o7C7RHK|RoZgc99u%;&oU@sBPlsg?8_jlZ$oZs0LVPg)vzC0m){%9|s z6UPXjK`9YN6$znr3!V0lZjq3r!8B}-$vgV``c|vGPod{?FElM?S!ggY?9GmXsy=dh zv(Sv4qM&ImN#tq)bi-t@xNa~c8fP_N`NA{zavTyx=5RIx;{wqhN-tL3MLKw;Mc+Nm zzASlVf9<0_zX@WLL4zOLPrpLuQ#(toNUGZ@(Pa*5CJN!UbN*#EYcKsF&W0Pdh%Hzn zpG5?}js0{y*J`dNAmQc7?I8x+!$0P)qHJkyZ}J-7m{!iyW1VSQp)@m7HyJJ$qY}UH zxPJJrMe!q`ZH&h(Hk75N#;j>zEty=g+<$j$g#B5x`yC66yF>w`_9bUEe#PE(xLQRfGd~+F!f7#` zt)y3N=CZh4vSn^%B^j+Yh8r18|8#F4!+M37t)(|pl^;4Qu{LvYnFuwqPFZ*@%4Ud% z+~dE<`udf;N62x)WQ)AN+KnIAVO?}De&ey2jUZq6q|}FpiyJpZbg%R%X2>4J(v& zH|>UD|Mm;|Gb69-c4YlN(t59Jv)>6b^pu}MwPVVX2eSf|=#zbXZ19*=v%dJocin z8fCnQWo0WP^xvnu`?FXL8%J_k2|zbu$rF3VWC%yX)O@?Y%ZTt3nbgC%Y#ci`RD&2~ z(L?Vl<+I#`{IB4zL$d_T^k8b4WLNk{XTo=lxbo>iXRGO=i%*8%#(TYqUlH{410UEKW{fxJoBzSlUjFra%;YG$S z5waKl6(n4fh6AI;h%%wsG#z@%&5gH_2LA?8$|}zx$-63lPgI^MnM<wg-5ou15K6Ld5L(|`j|J5uh45leS{dv;6XvZfdPzx1fn7%B zA^s^JkI$cFAjanEwSl4X?9^e5aBViYWj5b#P5*j@=y%5M&l%QtGrScop5&yZr5)~) zrNXp2k}0_?Cd?riVI(r)eIf*!4 zeho~w>rL9DvY)G9P%5ymaKm0OV{YteEkCuxZ8{}!;XXZDvkIb99Mu~F(c|OB*^!dC zy5iUuS4pC2>#w53Uuvx^7Z{zr^dH@t>4ULgtWNbR9vjk0ZF0POR086!?sZd4#D^=vgu8K}IQ^dWpMys*32nnkE5 zvb>MgP(sSy`8T}tBMl_0+{Y@Nl;LcVwN)tgj@}n!)@x%%uT{Qk$(24gQg>)w-Q)g5 z9rXiuZC#UZ>YVj<2tU0&g??L@Y>nIQz_=5ZC%DW0e7NT4L91_iwapOng**v9srCpQ zG`E@u!Q?=Npvxz>@mKKI8+Lxr1XWYMLx(ebr?WR&pV}f()P8MjSHO;nimEM==LMvZ zQlR+>q7VrtU%GkYM#{Ur4{MtxbA4yO+dAkN7{t|mBJT>@SDI5)bT7`_%GfI~!s(}n zX%%cOb!5;=+zO9I=0}V{TQw$hyl(#1wL7I%bo5j`q;d5#i?0H=FMfluib@2N>e;&* zubIBIqxYNB?HO>Nm!3_&SQ*b#hxtq01KMs>N(6ZsBcfS{rsL^fR8&OY1;Fj~x;w!@ zX5E>Vp*#=q%47sA7W!=x>*cAIDgH>HdHy{9J)^p0^|?D=U@zY>{c^!duk~BkH+?M( zK_(`qu){p+2X8_DAsgeU=&^Ayx@CCKt-jO2mn4&9-S&J*H&}+-VWwGDxI2BQim=A8 zKRq!wDq&`Bj&X(_R}7@5^l22l@X^VmssTC2m};qwBcfk1ab=O8*w_3vg{4N;+R zWXPqf&<-gtf6_|NaQ?=i$r4T?slBympfvXd$U#2ke z?_mC$lyAd_yyx<(Uq3N%Jv(L>Q`s_<7mN7tldSswy6clEvk*kXltAgV zoGKzJ>gjf!EW_0`z&}1q0H=t!wLou0fOM0WPM8>7Z00}2YVxI$z{F9UPUF!jhef}J zU}A;CUM4vO(S8I|+yY)bFzUkjwfjb z^yW~77S4UkstV8<)@L=6DR4N&@$jzH?`3A1-I(2+wf|O6VfL@A&V=*NtS<4z$(`VP zAEe)FLR^*izTJ^5ktIRrOftyOUvxE!m%3~bdZF=659Z+d#{-L3W&Q9p?bBa35alxt z{TBQ3_U;NNelL|&zvh>hr;7^U{4VbgeUj7Poj537YYAgbqjcO0f&fh}Tv;h7EfWH1 zj}y1EzxC=ctuQgOVKR+;=C|*oJ4-Q#*2j>X!qrPt$hl9g6h%JMbaHoTpe3?OA=m%E(N1l}@O1JZfBJO+?FD@;eZ}>7n{IpUp z+PV7$>l)Uwy~EKk>qJY4nBviI{Y%^2zZr$)^4=jyV&B2HyfiiJlHh4{+mhM%o&MVT zdK#8(H}VmpOWImmERgRACmL7IwAfLWEY}W>wAW9ZO;r-<-teUm2Iy3>$cIZ9auDw1 z;^N|4eGO6C68^Jio9+z%I%w>7_c>m)pj&LtI6hB&sUzOnciiv}4_uWObY?`w(+duN z&VS8Knle!XO3~O4M}@B&`dJUB1{Ce{oRo#Tb7#_6boS?Elve}Fk-WK+0JUCQW_{Mj zVp?K8M91Gj_1B#c;(l5k(znu63C_>JaAgKDLcaP-{a%a?yT`hL!x6k9DN%lyH{C*Xyw~4 z=ptv?cQq5?U99te=4Uglp*4hh*SG0a9{y5(XfZ2VtRgI6-JdS3!y0@i{jBQCh1<}d zWTVK;af#iSX>p>!qJcal{FcMWkbZ9XxpdeBG8v0oaxKVt>QB9Y^z)NPQ>I5n!}tR8 z9E;QJW8rS-Fq?jdpviAwEI%Xb#DS;F99i{J&3kDNst8cs!4FKHE9FOe_jceDgrw6b z<`y6B9LQ8SSO<`=4CV+@ot{$31|N}|5j=Lfw2g^+ya7XL7=^D?I@alh(#mHg%EHjE zKOd7R_{8@7JiH{|J3C1rdUtt7Qz_|`c`}~9!ND1+c38C&o5@rWKCKw%BcShrhzv=F z@q}C?uWg563Csd90B?eSd~)(b?Awo@RUBSpJKb45Dv`84-s4M^kFGvk*?aMYVdS{f z;q1sPF>iM8OBFqmaE{v!apPXa=P>6Z+!)f|8lpQNFJt~^z>17yCM4RubDCK<2d?Gb zv(>SA@;Rd@`D5dhS7$ z1*~S`Udf?cU4Io*tz{E^iWC?@@9uQR>FQbW=}C?kJUA+2jKMcPI?M$j3ZW6z)zG8@Yvx8=&C`M{c3X zNKk*@xqn@J*Q9pH`+W@36IdW>Cz?W0G{xC07EEq zy70V#RjXW@Ui0>x#bAdX(b>_;tC=|(8j;{u;r6`eU$g{HT3esyHF%#zes_HGLpW`V z)1tmN_||%3G!lATj-R{MnNKNKY37kjlY}?C{JvJY6HcbHb<&w*T-juxPq9$)5|2Ez zux@3fC?l8?pHZVAJ?Z3WV-wFVY+26^oT3951UAs;YjnAOqQs(M_LxTQp}ymIrFKyt zdc(beajo%xvTxf!6Me&8Gw`esv+6}a{-=_vt9|Q>Z0GTDEmFVae7T=pC$rAQIRVaQ=a1OUp z+y)j3m&0l~d5ZbW*UR`X?zhFipFZFFac&2e_9GSDoFDn-=J;^+_79LjJ#YQ z4K(gpsYPIxaa_UEFBf8huLpcug$F4c}F6`~DjD&Hou}`hh%JY+la^Zg) zse}WZs-zX_{uaPn{8=n^k1woD@KH$^^)2rB$J>nCJ$MS`?>JA}H%ToluqXwlB zz2H%6Ie%hy`&VZR%(E1PF5LHj4vOQ^1~NB?sbZJtu@16PG>nI@j8G1*4j?5qb++}O z?7+MjOKH5pFsDo)Yb0<@tu7T-Su9Ev&9G%PbxTk zNpPfHP_=4#NTon)M(Jd8>6yom;r-udyOn=r^ zcbr8=3Rh&HSPW#BxT9KiCzaKR-LUuDhQBC=6`4z~a41@rC2@sYBe{~4T@qeUHe6nr zSTXz9C$dv;%wEJFL71w~JJ6!h&4x~J<^)oR=#`WfH}>R#Pb5Jk=#iS(nWB$RFX*;r zTJ*2%!@Q(IrK(-;+13+TNk2(}`r5}O7E6;)$y6)NWs%p98a1Vv^i!9Vw8@7g(usA~ zLAZM>h<4$`driSuS}>7bs@Qk-WV4K1+D)bdoiMW+C0Jc8&!Rp1n7)ea(r)$9T8f@m z>h%?eAFY1YcMH6S0QH%N1PVED!pa9bwIU$zj(lvV1iffG>%~R_sfxm(2nVsp?RNX^7>@nX~5 z`VA+(UsREtM|ZF8msk)?LpcxLL>i9$uS&M8Vz2a#A|fNL*3>-9ogA$IPaP|Mi};Y` zg6Tr78b{<$u&&F?1X8zaL&M6;XxuEdyy{DYq+2tuX4=9VW^;`TOr)BJ6@{B&!RP9> z0F1S}lzjGf>`E1d&0cwPFnzf9?VW*nrYWy$Yh!#1>429Kw;VhDy1BD&?0ULyk%DA5 zNFGf+)1ZbF1SWgu8PyQ@>2XV-9JGL#QA`YkKM*%V#FU*qLn%*4Yfnc9IMVB&5VsBe*gY`i_}7b z;Js*tJx%a#wnGdG6<+`ltry`z!A5h~J_3FinJ6tZP%}?2F2=4X%kjAp|GiO+I-*V% zhxD_@W^h(Vv^MrK$Buf-*5>{^&thPxj^c%Qq{#LPE7v-%u>JLT3U6i2>R1R0%9T`+ zGv{cq-LMGVExlNg@J>D1IT6D_4*_ zVX=!C9owQLoNLT?c0N5!-+Kapo>F9?T^=Pdld&sWw^>Kq>)rI*d{QAVZ6qf#{1q+I zmu{f#MZ`*1y)P2-zISIz4T{RP*~f`z#~)H3pGBxHy;87w#U+5+Hn6s^1Yg zki>IHr669#8%?uaFBaG18Vac?y%L8!0<#&F0K7}gxu~4hQAaM#&0_GA{c`SiK|#SZ zu@M_9*6A=}fK=a3IEK!f-!vMzZJ-|)7uT1zHplhm$H*)TkAq|S-nfYwQ~DIvn5Sn2 zKi^uCymHZ_zMg9Bj^NO|Iiun25|{_`HSu&iQq{^Y9!bQC*C2wT zT-=eVayG$ZPMb|^G^v$o>bBte9?=2 zPEX$ve6U=Q%4RCpz`&{KtIRmuK9wP2*30Lj_r2*|cs}KA>nh)5M%-ybhTe8i{B6#t zF4z;)_wP%=GAY^@uNW+jfjP&zHojTpGwmyhO9T8?zn{ATn7(a4(%&3N9WZJ>)6H#G zBzq! zJOCodXR5HGZ-_{>h4pRs&1=%AR~o;E-rwViL9@n{aqbjEuL2cDW`($ymY3UbOw`GoP9D!z`11PF}D$(FC)l}UgnFxS7Z)4<2maygZB4_K~QM{=eZPKtUGB)*q_=89-zO#buPXx6_twrvyn%x|YCv*s_NQ2Rb28Bf&53(lcze`8*VkcoEYCx<2VF&U6A z*;JX!V`VlHyu8jzd8PsICc)%=sj??;=&KorP$@wS zs#0}d@gz_6w~#vm8?6*cY@#ZTWT887+c&n2xALU$DhntiI7obg+~{>}W6qag16T*h zWNeM@aPo8K8L8PA z1X2(V#7618&=SP<3KOYN!ysP}@cTi8boCR}eC1rc&{L+gcXij*Bf$ltlsk*GwPrH<2g=%qY8HI;N8t3vj>tGl6GR_ZWh z1VHNIM(+NuyPKg{_LSHC#Pau=i%h05k!*&PB7J#S%Bz@jU&KiOCycAQll9GkiJ0Yk z$mU#8r8p$-1;ApFa?I14k?{eQA%sU8+~crTC=X*xrNQ|NhzdOw6}5DtXbRT^pye5= zMZ#D(2lEIYjN~seV2!t{IQEBP*E4sn1IzGdEwy!r!}^bL``sZ&>macOCL&x zJcq*!(RRqD$@E(UHK)n8gakckU~Wovf6$Qopy$pmPi%&=&EoexO-xM8G(9iFKUuZ@ zL;bbp_aIGQ%Iz9S!bs7B z-lDxE8kOS72g>b{+%^T)V*-$TeTRGz@7AsKuXrtKfI{^-$G8ETAE6Nj=+5h@#Ed`R zb7CV>P_Afu73$HpuoDk*gTYRW=75nl!xG_uq=nWY3;*~Wb+1>zoo57-Z0*=wfocd4 z@m|^tHD{I}@i_+d%GjKV)9-*{7>u&3CpMwi0B5S^uap6`2#w6cB%tkt0%mwG|1K&L zPI*FkQ9bC`X$LQ55Jl2MTKoU`x-oCR%(CND^O4qGrwz2cX1M zHdR3lk0wy|%kMfU%Z=xhFeEAiqs)?atZ-bnX#pvL>RZ~_*f@5E%VqE>06}?N3<-OI z{yq36L#5IHZ{-+8=IVE3cBx+%e)KqD?*e&G$x3tI(#(pJ!Z@#UGe|0QTY@CrZ6>5< zn(?$n%kQ16rjg3navieaBJdz3G#qs!L2-hxG>$%3qipVNBpVJ(~sE^2uEwRZjg0i zcV#$PJW|OzhzG79Oz5U2BjW?Qu&6nRKF+W&b-qquM>bdIZFmnw61K>7!OUVbF`dtOQG;d$B zn(SKTmK)RY+ljgS2AFJO4j)#uqKstF}>Zz_x51M^YZeN1{ge6dv)PiCpPG}y6>bY z<+!?tFT|Nv%uL5q-5<0W*;QTSds9qqFjvUxGfj?WZH?RucMdb;;fNLb^(<_2$~K%J zNV#ye_eb>uLeb1uy6E)QizIbEb8G~HdGQti#D8DVP}nW~*Q zdp%Yvw#mDk^y7y|{oyT$ax=|#%{_U6$gKl8lf(vEOG|5eWnY+$WUMf&A{OJszIkY< zSK$t9d~Y&x<2NRu?E0yy7y;BglxE}Cdh{zUF7AIprS&*7Ir{eDM%C8V)ftQ*Pnh%z z`cpce74&&zmf6Iy9;UrjDl-k}Tlh*qn<~ubSzy<*r1|FpDT9tR2#S<81@%~OJXxhA z+~H*<_k2r$X!|nvG+ZQ37Pw`z^`6A3 zdSdFLNRSEiAHhG_J-RRUjf1txKCF)K%yK%)l^lZeQ`NE^bS5KN|H6m8-jz6U>j7+` z)~E_B7TZRlv^{5t?sMMwk*lb?Jd>Qn9bK)q-g;VV7Wrqy4r^qkrKQP7uu3Xb!&#Dp zw3j(|Nh|bTdUM;X&TnbPzzQxB37{6AL@eLn<0_gZ1ycFkvpJ zFW0A(=i2qkSP&P#p3AH#{lm7a__~Ef3z!3%Q&fh~n?T){TB&8*_6MmnIhiU=!K_u2 zwWzV}b`U)(uEIHLb(UV$wow@Mg|Y}c&pmFS%>~qXZzseGxsdff;YDIHu%+6Rqdnwj zKzcwbc73?JHbFr7uy~t{Lk0N%+_GZ;=n>fiy&Ju1Rv7ub zm!}#U$9S^(Hhk_o)0G@cgk`pUz15f?+Dt&nOVWSAo zaED}QvM&$!tPjEOVM9Prc)bv-e!KaZ-BQ1a)pD;`Obq)p$mzz)tb##+dFATWfmjL` z0|-%J$5WOwwzEV9b_EG_`5_FL3l-jE!sy6ao7HVTyI|@J2x^A2%j&lvZ$g01mJqsE z)$eiam5)#M_%`{hp8>y)9p3jrdB}fRqmUotEi}KYfT+mn+2%5DC_hlDfKlQ?j5Gl$Yi^| zf1mZbKHZMXYSGhvmneM#zg4Jn>bUGO9|#y$)LdlS!q@<(SDXg142b! zeW-yJ`+=Nm2=@EHY+rU@LHTkJNILPD739$D1*N%W#usE$z`5ymNl9SNz)Q_t&rGxc z(|JV^pEFCNqIPD}bnG*K5m5+P&q0x*9H^EeXMaJM1vvBPoBsV>HE?ta(;??CB8|Q zl*pJalVB8d$b>%YC4_2ku`<7~diRL-D4)k}1+8YAx9-XaAVbLjs799(VEV{1=(IXw z3SL4{$UZY#Vq1rM#Z3*0GeJ5hV9T_F6c1s@9=rcbrO>{t*c6onvH~=Ff#yR3%Zd?O zs5)!*n1qHf@|cA4p(?<-zdD%FWEzuNKh*qIK@khgm(lo<7?0)Smr%8Q$0{*4`!h-# z^$T#655?SAk+o>m)~h>cl-<}nxV0=)uBwPhTCfO zp`s(?-=TcIYEEs?w_u82KQV6AGSDClXLS)QzgZ`RDiu5z7Uz#X`T8kyWy{cH>o?~( zsD^YFX44D58kMhG5HrFeaH&n>_ec}UvMV4iopmh(#qpR#TnEP`Hxtuz$N=0*y9aTVu0*%=6by_kD^t+6w|LWep zQxz|tF|@ifpK)T@TXHMEl6QyyZHs_UKtL$!z8m1Lbf}Dus+o&+CXtpY&NP2M-3g&@ zWEEUF`O@LIXunW9R$X6LhZg!mGvc6+ys@eDZs~?KwP?|^kl@VOyjeGrYEhU#TR`}E zDlV}6a7q7cBJ~qLTCn`WdZ9ZcgHol+u__?;=6k5aSB=GIEOdn%J;gmr@TPE5>otwb zd6R3dqFUxy^(3t$gOLLmL2dhEtC)0!eTS-jX&R`~QoCKwrmGC>6s`Ada211cqDL{| zI|)A`LowqoNR$Yxo}uLfvA%JI40X3`X(k@^l`FKr;62ay zOM?uY#dn{5D2)^GBh7$_Y_N&Emace+;l#D7ooBeqxxYT44xXK2h2t|x^u4Jf%k>x6 zy!;L}rh|(?s5h46`Gt*k5ta8 z%uzxa;T3lsB3mIW_Umo3B_e^41~OhgC@stH$B%xW5aU~WQeTJ%GWZ5xhAebw6rM~d z!+V4sPXn3%`k32Wf8xOcR*o&3x68)|36&dHwop1q?@g!^+T~P7WE#pkzN33;iVk78 zRf1Mf6hr@O%iitUqYsYnUIv9SsK@`WZr4zjh7jjh29)APtG6RYD=)GERT^xZp>FMY z)(@IL*EOI+m#y1RT9(eJ#efFk$iD`+>IppQTk4pEZPE^gDn8NEoDAiJ^nqPeO^pOG zk8>exk?!61ww1vu^PqXs7hzU&8s1c>b^0)=u>`FKEAK&mB84mx8P%S|X|K+x`P|oysQ9ujr{KI5k@STN%fYtQOl(F6dDiml!K`NF-5pWdy z!s;gbvX?mn>zqLPQC`#2bK4>NA1{Wvm^$}(Pym!}l5m?C9)#mKlHpd74yY z$)%Q{l-Ic=8C z%i&wvqhP#EZQmgZArFmFfGB$^D0rzeu=)x7cS3c<#mFxgzJ(uq)r~d1E1`PqHw_li zDwTW8V!fwiC>COkf)7dJOQ4o`8-&k%E&;!6EY%YBO@)JHWjyWcLT8Ltff-s`&)neZ zBEVrL{YMux;hNZ7`}bI)`&Dre1&v)@sL~hPud-HD3N5nB?Hn|rm#feq&T64K{uyYV z(Ye+pmR>qUOThjzRgO3cAkNPkp~2S9RM?-X>3`FU-zQ3B_KYowc4*veQukops{{A#i+_c}9bE8R3?_ zhLab|6RiW@6cxbHp_@4>7C+B6O2MuZwq86>79?OE`tntv+gost= zJq*d52hEnJu{-oU`nl(tenNR_YOQ!fQFt}QI*38A^!WygqQ zARM4dO7BF(<^476^{nMiOj99XP^i3?>ihtQ9hZA0F(MmK);FF zO_vIw*p@liP?rsC!Kl7SOKMY~Zg&18byl9KRHOjRNv;YL==H}wuMH-5jMh$M_nb z03AQd_4g1z;-bQ1GxiYQK2_?iI6zPS^kRbxX1BMj6QyqFMT3nNq8qo~2n!o-Kj+#2#k4CNPTuuoq8JAd&S&byMSAwk=%?oW|z zxeb%rn&QVCvR20@5nmMN;{Q(zfYgTm1$*FQAu;18LDT1Fl$U-}mYLRI#f)HodS z;z4Q1Vc#6aGQAsawrfeC<`{DoYK_INP~_T7tAMOo5(Q%A!-Mx+KS|kB3(j< z(gOe9v7Re`!O5urD)X=>(0#>M8>wwQ-f@%6%>LJz^uaObU(e=2!)aF-Ki|$+6*=I+pTK={ z7>_EU0?5*UnjGdgbq<^n&^L-aY}>@~u&5@?WKhm0oOL~S`PFmx4tYO~(9ay@Md?e~ zjL;7MlZ^@EW8Q7rnI`fSo9LdQHL=dM3di*u|I7b`$9>Lu63u--4hZGnPkc4F7nUnE zT*VeU)w|)ylzMKOf-_kVLD>z1UkvtP3hI+I3(D1;n&;IbGt*e=yDiZ}ZOkKU9UQrC z@9wOj`m)QPBpZb+%H_s+b(~XN$`c%JOt1+=YDzp3lZsT@JRd9+)0PV7k$}Q49H+x? zy#&oW<~vSQn=v z2BEw%kD}NdWqSSeZSoN5+5hx%8vSw@0#buBQ|j#18t6ZR5}l733NRZlHHL5h^9=|n z=2@>NeGy6)Zg+Yxk$h6ND4*mrpCvukn~?@(_(7O@4&p_#{p)o6sb^}!Xnefs#vtQ$ zIGG=Q|6_xApYc6t50c-ja`M(_KSNr0_q1^$Juvv#4L+Jzz0W9b*rK48Msp$1M3Qs= zCP^%iI3T{z`5YJz)RR$juFS3P73Jjy<6H@H1tRhl3lPhf36VB*!+PP)cFqKx<|Elc zv4N7$D{bkS?~r!W*LK`!IpDMb#rPkYdXwTXsIm~V>m&}G_kkqA@w`a!!P=~wbj+ap zmwH<|+G)pwrAc|Ri^I?k+kz(RE_wU+)%Btb(uC;l$4l2oCZMb`YJM)u%ns~4^hX8A zFhP_>cOL9LvQT2JQqh`AHP1W!q0kHy$aQM#-)H$H24EXfua}@OPD%F-5JXM!wfA{l>_(77KV%``a zCqTcSXS-HWHs4!njx0R#f3-rV*(nRB;3Y1BNlijf@9w&&?ZmaI>UFE!V`}6%S60$* zl&s@J(;nz8@F%Ip5tOr?i>U#M{o(!lbP!WTwz}%kN=J(XqPJ-voO{Z1VOF@TWDEBo z8J=1F3K!9f8*R`;h06u?A0AWVSuFNga?UKz6TX!)wP8b>WZ(oF+-cuqY`H zj50$b30a z6g(Gj*V{gRe!X#5s{9@mK;f^*bk}F*Vc67*L}inxpbcL|sKGl0-*BlLvRR_J%`~6(z#5`YFw2Q?i-A-zhXu zgwg{^SDY92Mg}n1!%^>m#os$WVsV6awxC4NmZsX$%N8q(&YFJ64@7s+1qtu^S9cI0 zgQ@bY>FDMU#YxZ2G%M`|ySd!z;*3>6tEa!s`N5ooj2w42b;CM28CtO-I46G3S3@7Q zJjuJ}21RKnC7>NoD4i1JFolx%;xb)$D?x6X&)^!YCN4^x%Wr2j8aG(uW z#wsen5HSn#GdjMr!P)E&zxm_^;_;e(@vQ1HPykZ}cz49^_}o;E8TuzJHK>ppP_qL2Mn?Bo_*XS=L~xn;N?`Vj0;jJ7=IXlU>0V( z%C!u!6jW0NAi-fS+k#m@rFH zlTP#bP~O`Q{wsrDN!WCn<8Itp5qIoPc+09j=Lap$KoN0322oMKCEh#VrU)|T8)C_` z>;fRxeFobsi0cr<4Fc%aRPa??uIx|zrD4?j7SKjHAVYF~OhTFg95&43&}Z_m za!O21uRDqWe*qH7+jooGZ=7yJn^Bo8=6p-=nAY*aBTe*Igp&h|+*uabY>t+$S8bWl z$&B|~cR^`7lu1+9vTsNO=_<;xwEGJkOrUKY-J$=h%&sB5=w#N_eC`MUosK1?61d;U zSGe^FfS|DI)YXhbVhuiQe+6o>(Q^^2C_Mwh?<^rXmurygWxbUHns%PJv}N&dCSgxa z7#b_)T;Ya#uE2Y@^rX6g2j-~0Je$SHxX1k{6sgZzA13+j=geqGzwysC+~dTu_k z1%$V&C*?P}4Pv^L0*$XWyLx{H937laSG>ez(Srg&^Q@J*3*W8Zt=j^4HNfeLI)(L$q^x%DB&%VyE)u;s8!d8*b&cSWr4n(?LZ>p&31}K4nzR?w zn_%F}kgrx~8vVvl!g~Uj+pV_$OOETrDBR8^v$Itvp_x;hlEfo049H}sVl7bfa zL_2=@lk}{}KJIm)D>cDC77aq}0}kc@5fjU$D^1!f>S=VTioY z^U!OL3R_tX>IIG!y|%%LIdAFcp5~eU!>2w3Yy!MH&Kxhug`EiRS$yEN`!lKZ!g1~% zRWo$Pi}>PSCY7L8GYM8W<+FI0(^L}-1hkpBggWQI3irr7#o zGPrHA#87@-KSK(?90Yo&$o!I$%KKM1#4@z(936hHa( z0hrTrCC(mCl2SceSN)(PU@^5g|1U#F+IH63GYK~ln11@vvyBHa-Wozw5IKqWkAHZy z|HJ9&QHwlc%IO^6NquNhNZLg-edWVS>I!|&{G_y$l&*KxZMSzcZTD|*Gh5b% z7Z7Z-V6}b8Tv_Y~Z^DNR78+OFNfs#tw}EwO`FjW(N#z+F-RRX&dzwhW+OqO26r}-V>+XdV!6884jIh{-} z5oghqwhlJ!G>DhmGwJ&Fc+6%2TR+|wyXeW`wg1>Ybh~=W$v9tp%Vj@8J_zaDV{#mZ zYsf|dC5C#B)1aWB=bvVH#V9S$Gz3TmhJm1euy4gE6~t5Em22s9i!TPk<&ahJ_YIVaYE?Y zWi56J2DkkZt(Nv|cYGB;I0;}}x~B{;6k#E{({XtJ)5jNk zbP5T6Q7__6MtTi~Ywnh8jyHjMFP`3Y^boHK9G+rx-)oo;y9{pMzWYh27{(HPpY6Yu zIdixy%b>^2__8MWC4-fQH-81+9FKcF)ngW;e;=_gN+?!uZtdZ5HO7BXZWr2 zcjm`Wr;o%#lXNlG4kqjLmeBoNz2>lTE&cYx3j-n1aV|qrq_ZU7U0B*}-+EKdcT6V*#<@iq#rq3doI# z&o@N_qpv;^{Cd#PrbsAYb#>CSs!6Wt#nyPfbanwBENZDp&VQ}CSZKox7?KR5t7e9` z`%2wVIEX200|H*f?d{m@&7Ukc1AqL30Zh6pxR^K;+HE+@QJYVKT^MM&uY-GvkeV7F zr^(K@KED>LMH;@x4@f4|ls+=m*e33hy#YHNovysA7&~nk$J8__Q|P&FrKhj#H#EK@ zU!gAQEe|JOkC(eJ%d-7F4tV^lnb3CCLTK1jg`=rc{d7c9Nw{Dahg{%0l>oF9_oYbv zL-AMS9+LCl{wUNB-X--vYsc4y^@X~WMHU0dMzt39T1>+817&&$S#22p{?(qUvX1Q? zIeNnzE6^~bqJo*2FG5E7#=(U*W0e2fPfb-NC2oWn9s6{CqJF29ZLyJjR<7Y!`klov z^-j4lfu}BE!oPmye@$;}^f~3W4`0UpA!e)^86H_@Jtl2$zwy%n<>E`w-XS?%WP8mx z_TFD+7{@$){}(vL^G+h~pe+}MAJqRAj<~mz5@%Ux!ya&;@1Jna#K1^jw<&{AJt6LP zb$&!SjnxkZY9M;2{pfziHpi7&5D?eJu*}e3lOXJk^+PS_9hV zo29nM$D~yrwK6+0ve7m@Uimku+2lzN_e?*cBzn2G)tmGxMgj+p%R3yLgZ+6fst4uS zx_^>&Kj<~}^1`;nrRjS7WbWyAYzi-E0IUD^@A~GX=O^FAyRfvMbFq1!m`dP z45k?rzHh-4W-UR*>?ge5ABd(CL%%U=zJ~#|CK)Ilnuz>Ml0WZAUlxyC1^>S~cmUU#J+y$p#k*5us zncrzyKGsWQ#5Fh5^8qzbOJx_qRbhF#V$V%1tUFTBiWa7;XQN*ACF$cL(1D+lWlugF zczfqdaM3-ufBc32y-Kl3tA^%M!0WZ4RYTiXn)22{CUmY94Vz@9dhTpo9K~qAscSzjbwXAPLD3gc<|}fhbWnt$YByh z{iJ%#?Jy0)k-u~YYdhC#I5Mfo9OiPotMm77Z5X{G z6MkIygnw}R%E(u&x(eIVn7Z~3=cIzF*CZkSY67&~ot;3H5=?c@j*kQ&N*R*6`Zjba z=`+Mxg#c&uPraGff5jCu+(IgBaB$g91 zTf&;2io3-sRFO`xj0 z;1C2jjl|0c#m>*0owl^PXOqY7vocgS+Bodf<%{a}49D|T1VrCGYnL9(*+j9DnIX6+ zJ#s#JRpEqW+IU3cUax_buZ3RLLX}`QENN!>O2tnr4#W+!J zVWvAXc>Rr)m=n7N#CrFw38$)7C-u5@dBo^1qryC3py&rW@QwPLplva`K;}oz8=@}g z6MFXKTWYqszHo)ty&dCV@ubWN9E<&0H^;-5hi1`AdOzc)?ny?lO6U<8tDpSdQ^$v~ zEClW|Lh{0_eKa*CStSnZT0%%WyJB!R!D+L@1+4Wef#$M5WA>+}tehOS;~D=wkm-8C z?ZDVa@16Npt&+pgSXa7NuWt6x5Q`>Q77Ch@u7Cc(!{`+A{B=z6?6r%Fcgl99^AZaM zk2KwlvDz)7en2>f$N!?PcoJtCDTacR^y93wY>Hp-t!KTu&hoO#^5i?`2WP{?HU3gt zLP&|I#iO=7{&mb!M@anf)a4gp|ww$5~AbC6!kjrcM#eG}Tb$`q=kf zo>iMCz4CaIF)GYL=u4I=hgX)Vquo38w&zl9iR}SNux)O5;n*iQm*t}$0}8_0?WJi- zNGnFb9AJ$~wzfC4Rw;m5=RuoQW3ub&;x?U7w) z(HBuTuwJR(U1Xm6RqR;zv-TYChMt>`zqX(;PfwPWuEc@0$>_z1Om&M{wVVhF@XIH_ zz_c2be|ogag@)n{cR44PbDmv`$sgec(C}u6iA-nmUGwwE!PfK#<6N0q zIH8~u&^i~vSp(nFA!qZM_A=k4@gAWJZ5a_5=?fzaGi!@%w)x7G^XTZ*UcVghr+1D; z2^4(CA^YLw8hD?8Ads@YDPFXsGZl>LUuk@w*<0Ra_4Fvmyz)~(wdP;q&DJn_EcZxL z^a+J<&+uh)sv%x?MDgf1bC)UZ&SSZCl;rU*! zpK~AoK!XW4HA{-o6D$@(=x5G6+gJ-0f2Zjv-@o$iYMwrd@;8Iw7l8ZutM3R4)6#;T zGUhh8+&Mdsoq_3*0HApQ@P8A1qg8Q8ZgM#J6>ZbgnwWQ6Up5S;{CwgxnU=-MwU*pVCUm7i<;thpJTr;X7cr6;#;rc_vv+gvs>g7+gv;^{`*#(-5 zJ|y|v^Y){}r%DKN*!cxAep6_Ymg}0M75>| zsnx$bswy;K(kyuvgO5#idCca-$im`HCQ(tGHFt335$?y+>3Y%M40IL0y`>nBr^KnK zsN}#m1d<8G3I-AHnPsBn2~LyRZ+TSjQ=}d1_uVct(yiQtWB6PeV`AZo&6PuW+Nvg2 zsPD4+osbL2utww8Z6xMA)$RDV5by{IZQcI&Qj)A1;FfIu}|;$)mG*p%}m zBkcW3cUoBMp%)HWGf&!0%H{rnk}KyWPB$s5kyRD^_sQ_S!f=w7!3I6aMv=p;;pr-Z zi!1N)z}C08?n}0d_{lThI;zLh)_YG7ALoA58WpG^!dG$c*{%4#X&hderY?v&+$Skv z8L+$yf0p+tI7KAb{Z>yy~EQKkT*G&@4dPTQlSpioy? zUTpC});I)tggKjn>Z(-f3gZ+~6-w)etprOKKD zkzF+`)l!=HH{?dh@k0_X%ULqz8){8yv$~T*Mc93XlC5h>Crzma;O6zt@IfLh$~x0? zz4mYpDKiZD|0M#lfe6@B4qcc#QjiWydO^v+K+2SDhHy7i=Y7@@)UGKTv1hz(MNhao zwD0h90`-g9mQIRx6-@wSE5(ymmQ+wZdqx~WuUhx_jpc#HhYt?`$M{1u$%BVwH&df1 zG9Kt(8TQOCkCjzyX`%a5@{tI^l&#ZT?UQq5WHDexpOHCmYNRGmNMH1vy5gMm3zCxg zRi44N_*_>kMK*o(fI{}g!?R2;KR*nv2zL33M_@TS`Eh1098v01yz4Pyg=6&k>mGsw z@)nZ8tly_*js8RdiXn00dyq`6E+6DvrA5Lci*IeYQtJd>7RBL%!TQWrYI13)kI*nG0met+c-q~c<1ySsTzh{FP0QVZDr-;|E@EM!Lhip@2Q#e-! ziiBZUw@jt|0_HmQojaejweOIiXCQOj`O@Vvz3POO(itTR`DwsWR1J`1Q%6-}m+d8@1}K zt?@5Ee})nA*50S47VZX7;V`_K;Kn;JgLom-`9&n>s^$|`k?jW!x}mapX&o5U5QSmD zM2zGM#xt`cziTVaYNvRvsQCkGKML>f`|H1vIm^95Cwf{Ru4ky>>!(}){we55y>I&R za-IBDb52K14I+erzV*(-U9?vlOrG>IMsjUWO=}N&=NQKZAzL3$#~B@FlX0B1L*9HZ zG=Ygeib1`-=l`?-^PRHr;aGt5EH&S*gIVW~Ld5sW)hLb<F{MaW*uB#KmvJTt&r%z)U`oG=tv+%Zg&`C46oAsXBf_6BBCLZtT*04 zvMYAn%UySPyk3OHx1{6MWVnri-=d?ztW2^e@3ksJlpt=U>L*05F2&et5d* z*8b{%5DXCg1qrQ^vV0w+)IGUZ2yP}ZF;@Qv!gm&zgMDuMZ8_7oE}axC_kU@_rU(22 zL=2*4CrJHFZ7G?fJpS?pMvH{t|z0XPEO36o## zNm~`%0$V{~KvXVWAr2}HWd_`u6`dLW#lJM}y((8`vHeWL;OE3kyicA=%H3>;KatjW zTAyfEjfI4zCdvrxL>@Ap5ZtBMLOaNh7z2=)o-Vs~egnG+tgQBn)tD}$k2I<=(&T)A zn7f8hDK>Z}>uvJBnhBBHY3Eu2G<4qjk*>g-$J!xn54NLG%4M1VFolZMbr&^`4y#>5 zn0@yx*KsI#?tzh+PV~N|4SAA;>+w!RP}#$45dz~>ZjznpO-o> z?vSv2F?Cw;Gr^48s*rhzo$_OA^fHn4b98{caGKRfL`cp>aBsI4EW$W-h!u{24R>cK&Vc^qBT~5j2ac{e; zu3McH-nw1V7O*{#NsBXk-DTaG=TVY|~A_aoV+?6-D%)+>)` zxxY#6kZ|h6wQjC53$6Wlek=T0UC0Yb$# z&3EBKgo0lp#pr=LvEJqRLl-WiqodQTSCXc3GW_q~xATp;xra$I$KjS+-7+S-qZkO7 zvR~0ULVlL%-Q7L(_U+N%T-J!6Tb>A|sD`qV`OW+ReIo}r8;^2_RGJ45IR zcs^Uztn(gjGp+FpxJkb+<+~9#R+QO>JagDNbo;xvi$$@OEa)Jj>F$&|R$}-CIKmm2 zdXA<87n#-cHcN^W$ERD^*d%hcm{gu)0j_*s<|0H!T)Tqa(fg|kkAeJ0LypbMhfslV zSBkoM$f)t0o&6u=5-Vq)VFOCWa^9zrj=?}&=ezX=kBo<+qg|5n0nuy78sGfGOe#1% zQns&a)hIHOzc=rMTjgli00xqH8%=FW-W+Uf4X_TL*IPdJ@OX7^i~Sz-gf{^ZZohO$ zC|y8MYu&~Z{Z+l3UD1<}f_C)XJme6G2^T<%T!sFTRO=;8f{w>M>2 z={IABGak+>8~FrBj^RZ1Sg1(c3?>eGuW}6HpuFAn{y(@<9?CF`8j=FKYB($vBTr61QA#(ySJXm1@9L!r;3l$6YVn z!?7z66&att{PMnLEw9~7VVz_goUSI+Z}~AWrUNMir{H`Bi(i4BsRyQF-#5laIF8KZaksi?kfwF}-bkmF#J_v2t5 zZhnkz1#)P6`t@(=*gI3i6+qP?5KV!xB62XSc?>(69{mQ2d1tIWY^k@u)FE{A)T`}} zZ~K6Sb?)N3qGvl2?n}NFbTNsWVn$tV*=ovyIhi)gK?a-MH?S6Yr~mc1tnIIInHd)f zR!fG3$Ui;Oc#*Y*+D>p9IY8UW2x4_%R=3NDpsH!8fH5Dq4-YW1-`@4FV^VoIE^UKO9W)1kcy2b{!p(9LPqPWZRV=6wBkHv0U}0IhML$e?8OS z@ZKv|Q*+e!S_f~esIXF6)2^L)aClCW#6%VYe?sf~?Q8mL%tOT&sp%52?ztVi>tkG= zrvkVP8A=U4tY!Dt(OlbMLb~qL<5l&MAkT02g76GT{n7aXW3)h1kE_0FZ|8kPp~2vv z^UU=lL^Z0uP=5d6anw(DVC9u<@Bb9@A`xQ+C|hG|de_n6#NsW^;ZDG)h(3t=))odKoJB%(E?hzch*y zpZjxh!l*kfaKpkjhFor970ln1h1q5b*shMdr2GAU1h6Wa0Jd_br)lktdi*O<>(?%% z2KwR8&AyGgq|0a2c}Oajm$&E?cF}@$C~Q%^OY@ORx>Mz_(?`733GMw!Hp^&w1ZlZ@ z7hc`Rgj0niw_w4*vt1e0k%6u>#vHPW?S<+R1Y*&%;3pJBLdF(5A~Auw#za8EqM5uY zcRyA;<=#*H%rS*r4>7v|^ZdSdW5I{?7{^!DFpL&5JuM=t-cEP89J4Cs<>#kAk)>5i zRDW-N;neo{%%P`;g*#*JRoiVe*&<*qAkl?1>#zc#{h>m0sL)4$s^FtqmEG%&^C9z# z`t4vfBWram8rV&nlzLt2*a(BkOqPXCJGn7B^-6mdv_TFcx85md{53T8<_u4FU~Iw9 z-ehFT3SXXJ9a0=k14XK|oG)!g_bV~+2@rZ<_cK_OAR?jm`K0c6+@>ehta7Z^aNGM~%rJ28dP`bwfvElg*F(nX&ogt%_&*xW>1`l$qL2)(b+62JW%0J@j zu`svg4ujqLi?}_?$CVeJY(m5-j4amMGxAAf*A}n)SHbki{2{g&lK;dorjwbsj31is zkJ5d1g(_gf)p@wWX&4c0x_Sk5>u)9ugwj-{$AqAIh0$PKwsJH{?*90KzqujXh3DhP zf**%}+)}Epea&2u%j$T_i47~FQSjW0l85ofZ<+^031Xu~1o+9W%Zk?4Y)6=Uo^Ca= zW%f zFS`#2j*gG7O|HJ76iI% zqNx{rsV07vOFZEi8&onXuhCz)wZG=50JLi)eHNjdTb9i$*q^)4Gjc`M}4 zpX&sQTv7Z@6DXI{z29XEg+vsH8V~oYG1q4+ zHgyKcRYIfW7p15lLHJKW(vUHFDnh0|SHR)@k4WdN^t*jv`lrq%=Xg>_5Q{BRkB{sB^Z-5Wt?BvfDUBuh6$~9>n0JqJ zEpst;quEs~Yk){f5V?D$MwdO7(l z>4Znkj|D0r?f$ddHKVQBfOq(u@Ue5&$G4$<^KHTbE@E$U$oHI2?~FYu{A6>|>4&c2 zm({0?;&D=|_-j>b=_s9)Sk?!tidZ`srH=v^3=1?BawdL&pk=x*MG1scpN3+tt$7$n z;M+9dx)wvf@eJg{KYpCK(<_=!p(wR~D-7>RJr-*~2cZPL*15drj4BU7%GP||X1_b! zU#u7Fa?*axJ!5^9BH{0^pIaDE70dsA9Wjh$M(h0q4^3mjziz#3XcvpG(XS;GwB$j= zNiKgNI>CUcN)POSvl3?ooh}YBj^>n zx5wr@cYPdbO#$+>n^;&)=>sIg^%ZW_lU8iP$lp6*azDlILahSDd( zeK0FBgCD*8MmNy2(f8i9**Pw(372N71Oh;Yk2}3lfnXpEb_*+CLb@u^8Ca!irXP{LJ;g{8;Xp%?gPxn@C}{SU7`mj{?+4O zQ_9`eXgbtA196*#9SJ_mpfH14v}v+nth)M$uH0|k_|&jZyux3zoZYnymW%-+3%zZY zc$@U$jcC&plm?1PMK?7j@NVF);#Rk#_E$^tx*af9-&}&+X#=(wU7ub(Fy42`1gL|* z2x~rgfSf|>5+PI682g+j0%M{{(KI~7^((N#INt9YBiuWzFiRg{%a8I}9Daang)>kl zh~B}dvAxl0p;FT+D%nnBvOn5D{GIP zLG(je6g#W`@cyyTv~}bqjdSr8wI;^u@j*z)Sd7{q!pp)0baF(EkG{vy9JRI;N}zj} z`YN1~1JaaOtg%VEF%d&svid@dbyqTx&k)M9$sTA!9v(1zWI>|uj)_Azt@>Wu^E+k_J?pmkVrIC}K z@|(_6wB&)ESafy?eJpHkYqM97gXwzRJUw!Fr3m+OkE9ieE75kFkl*M>yX&YQ4&o)* zmN+`uMo zDZT{?L9hk2giV%dV|xw!N)tv<{kG%3aqN4aJfeqPqf)$#4aY8PZ8pLJs_FJ-vsZts zlo$noUn%{1Ab}qDP!hJR0`+pQS#gn+=Cl!iWt?}na@sBDYa3}<3;AWUKw;O0IIQ+PdjS$l=W>k^Q4-p~&Qbv<9P^+h*?ZqPika0+>v;+UcI)5T{u= ze5PzN#O=<|R}3GzOU~083NsD5`nQ+%OLp%1yvwsR7>dEV&6nGS1y*vw4uWttK#0^W zFn*|9U}TsanqwPLbu)}f^XvZzbFWfSF$tfjaD84IaeAva254ofyqD;;s9#vc-KIdY z+N-MU_sPh<=FO6gv@iI90>syURei2^IhNZ2zf(dDfvBh|Np(rROUxI+QMu3_(MZfz zt^vMQU;aFI_}+V(m*qm=9?MHsW}QONk3zb<-c^VmzQm!}3cYpUw03!&Eebz%jXU$A zI^9BjnW5x*8;Ftf>U5)9ySgXi@91?zc~lxo{G#LKayJ{wFFs9%a!>rOIA;Yt6;yo9 zj1_7|%gcLF(Xy^*M_+FEuU|nx!F>c<*d2?|L^pQQu=Jn9-8GEmvnz40Q#7D@RGa^F zclg1T%CPvH=O+KI+huKsJf1G%vfF!p#+%A~dN~!ZegBAo5Gp4B+zSH`loyV4n%N9@ zHx#2-LQ3?ac@H)un6aRcqT8wkr9%r;?rk*Le(Z!`dTBr0>}}LGf_{O;W*BYXu~Xfc zTyTARDxVH{M{e_?PcINuDIOmdn~%{RGMoZa@jWntHn`<0PUQkPP~bq7uONRH>Kxpi zf0`y0_gr){riIaQI#3G)&y$85A(%9K}HnKvEIcd8mCAQP5$fy0-PJZVdeRk`g{~n z{Q1)6Bh0#AL%^&Vk8Lni7-ZU!7C>=_ z{14a#q4 zqo9QOls-!u{$;>VfkD+BD!{E(*;26&;#8H{-KJTiUO1u4wH7l=8bxGN?q)7m!8Z91 zyKQKzmWl}rq%*eEJBbMT8L-{A1#AbdaI%p%SEaW9 zv5?-sEdon_#k}s|-be{SxDcR6C#d5DD@YmTo(*5-(yMyM*s3=z-l|C|02#$~EfPMf zNB+fGk>*uWablXhNCG@{Wv$=+pk#)3rTyeb5tUEj#cQZo7j(M4PW>voI`0 z2z-hjz_FUwFlxr$8j8W>b-6Ke>er;&*K()G*I6&yhbidNT&K6j6YB4ta?{G4_yV=y z>Bb9wZG$PO@jbbs>Qd0|KOQ?SlQP>4$}-Wh!9=}sZaJUQ#f5V)dzuLN`A2Wp^~$#k z3ln$>?JhyKlrLo;-7*wB0$QlCfh@xmr-O=cxkA##B=4lGFOhoZ9Vi2CG+Bq80gmSu z@6-Zy^njRe0&kLSTJZ9-<+Wx*RuIP?BiUM6Q+NI8xH5;rFRz@oO-EmnG5Y@7$0TCL zvM-NzAjjafunuQ;C=8cUus)K!(e0{xU;b1C$i5_rs=62PHr#kn2|cyMosQQXXx3<; zm+&+O^>gyDi*>T8`Ss6w&)=QI4&ui1teQomP&~eSD-j$~X$1~9Ch_Wy!49(>K@dJ4 zno3*;-GZx?LCk#Jik(qea4O^`g7zB>9$q~!yURR(3X*rYe0}rt=t)w{88}`}LS`Z8 zW+g$L_TWy)O5AOTS4-o|ZwU^jUl42D25th@L6OT-`t7(9m!~gsXl+ivF#ALKCb}(_ zz?XKs{N$VRC>ARIJR|I)`vV)R}beTjZ?j z=f^AU2qtcPxE;-B&0ZRmN#xGh`fljQ%vaNzclB?xpDP1>1$2PY%_gl&Q7qq>9$b0V z9NLf<{Pc07EE4ZrBGaTn=Pb}_vl!v@QPe!}SHVQ$ap0VMw@F;!#Maj+$Zpb?;G4!K zq&~R%Z`k9O+M;VNyTY~AX>aHX&KEFBFt z5dErfcI|lymX3w;54zNN?ijD&7LL@aHgw}f%ZC;2q0+S_SDk4_MvW$7=d;gV)Rgwv zULXO4Z-XkY$uOXtOfNJ}xa8Z{9Ug7B_xatmmW`(5Q!&G}X^J2c&+{Iai&}eEyY)cf z-J?6T6TgS5G_Bv;0$P6cPZz^F-_hCQzG`V5%~gXb4jygJ(JeJs4?UqessjbzqvZt? z`^_&c;jCYc)^#*#&oG@W0(Gp1v)iHS-I^#y&zaT0z`!4ZPND$o8S^y1%Fbqe{OCx0 z=vR&O&vng9VCVWZ?=vC6vrV@9t*-YFILLvHiI2-(M%6E~nQRUrwF+JH7730cG3-0U`4U%X)HSF$na0 z`A_TEU-_B;6;qY-9ubt~=yQhly~0OAtw;mehp})Ig|g4GWv?klR#iLV3uv(|9jT*; zFRM7ljs#*&!++y1SP??d3qES6Chpq_?+ie%v@Lv*&G1>cBydzYF1?Sxb(5#@ z^qm!hu9CBA8h<6wCAq-|9#ucOa*Mxu?QP8yb9J6$hqvi%^9Pr@ehyF8RoQ~;|6`>QDucW-#SGitbuSX{m= z^>T3%T-P}AZ=VGhy>UK=4ZtLXpWHdNn}OSB_ihQSsU-wx1dsFo_N5C2SWSA>s;g?o zWoScsY!$0C8G|wQ3PFJ8O|`*&Eug^Ji3WU&ucMxiCZXf;tthwm2B0HW=Wx&QW;`_Td9IZbgQ zN)aZ#p|T9FN8-mo5B$ZDirwr82nJ9D8ZJ8%6C0kVp&>jIa51XpwYcY>H&bDki>F`Q zoR$8I!!t6P{0)uGVXP*fRVcTa-T?007^3oCmf@Cwz>5s?ZUup&V#W`$zi+cr8D6Zp z=5x58m&Z)T8g3aw$xrmaMQCcpHIr!eI(-uWIf&43U z;!@XHScsuZM0)kfj0INy&=$~fQjp<=Yfk(L?2u3^IS!W)AgA*b6r@Izo_WkFqKykA zK$5))4!&!pCki`Kx$0wi11?4!0YWAlpTa+NeMRX5bqTv)aRI>o-{Rp3x1?sFuc8IQ zHlz1oPviq!k@Xo4VEoecnz`i{tX`fUpDRQlQLp4u3VGAa9ISbQsA>Khe_VI@11Jq;K0LdZ^%S5 zI0kyluJLJLOgd}YA|6Lapeu@EB$ybk!4&Id9@$Wbq`&CAXmJ^bU4vP3T|{v@fK`r| z;q|8G6Jn&SZ!5m~t$$j)t0d%B)_jjvqBV^+RA8`_0?#7q!u&Q``-q;Rs*d?GVsC2k zpAN?q9t8Zt)+%u8<-bNMGvN8{ZfJ;9 zh!fTP$u2yRHY5m_;?1#J#Mh;WaNnQs+BS1=IJKFDjAdKhJ9Yi#`M>|ue3~~nRftN4 zz7_%JjX;0~eOC4Jp+pY5&%E7RHM9McbTn<@Z2l-Rs=~RR_#WWizP>&yw7ujTR!6KE zhj8u7IimUpbJB)>HDMP1Qy(d~?g8{d)q}}hm;$+*h)dZw%e}v};vjan+j+;8ZK)~q z>h!d7iGulM7S$_|jh^zL3-%|aqlZ?%m8)7TdRx)w@4YddsQM}Vx;2dRez?Xz-mz@S zXFJ|@pxSq6KyG#t)pf7^;_OQvaEN_4xKF29mMsaW(pf4|Drj_5hRK^@9BNdiGpS7` z#xH?a{!Qxo4n)FFARW5xIrk-2+;Po6$wSPtdxud>a-v1{px3fX6t2>ceU= z`G?F5zK3uXNGW#NdRh0YN%+-$+7k#u2lzPaI1?-D&8s2rflQR}G;^XF^@IHqK-0+V=UY}cd4DAd6s*wW>dEw%k>b&@>-RiLG z%a_d3+wKF2>+)~BmB+q!)?E|2f1}^gC?jl?mrvs~2wW~VlU4=%V3p`+Qz_!_*0Zo+ zjTb+6ug25uv55vt8tH80#(@X-jT`hA$jO7jhmT%(=F(~MHc}onHT6vO3lU^&*I>S< zkk`kT=hx%|0{7pfr#}s2Gdu~WWy}1x|6U+aVGw`>(gk*tw-cA7;oW_X3;kJIuVAv7 zB3%cU3}DlZ>C9E6XAr5#n>T-ap-JKE6!u2?!y0NBL@QPI{Dl4PE#l7}VgY|&wqC31!5M}%IP#~H@SfWE{Qvw( zir%xOk@_M((>AJ0oJKS^aynsOK1hl{cWzj(ztlfJ7DAb>jCrAIWe!iB@gS|ND1m-2 zX^}lmXgf)ClmL-3bpAdEwr|Ym2N9fB>6W@zIdpjMF6;0Wi_<~`Ewh^>L0BY!hmqb1 zDC@hk&FK-Qw!#qBYe!sdVB?|E?>QAzjpxDXn2~{W?IbE;=coQ~5ScCrPSl2cfp+`f zb9Sib3AK+JyC>>sQ{=RbhigI(5`HZ7Uv>SleFdgHevlLxzpIgXWSes{|p=c!gCJYPaB!VIW~MPK^s$C4)#!Jt&f%hV)U zl?8*Tp*O6lx^?ST*CM{7?O?gQ|0=YpS#Ee(Tj(17@D-=B2J3Kw5p}D(u2_3NHF<*Ul@&i%Y^} zG36}H2Z);2X|b=P&kjOPte6WiptD~O_PkLjsGa(9j0pXmb2JRjRE!a6Z?ZGKoQvc% z375j09_(MdK)FKzumy--bG|MkO~@caN66|!LW!yN7_j?Pmn8Bpc{-fy;BANaRfbw->m~J6L7(=7W%UieQFKTjkQ%wM-dw8 zdovGJEb*s1e#f9uy+nHSV&c2I_V1)J=NnX6O3f`YFT=uP!O*!7^FG@sBOilwjk(ZD8ey%lusp2lC_IlUn7Uz-($?h~U!A z_B+bY-hB0DCO?iiX{(V)Y%^v>HYNR&(whu{`6%|J=vtr zJ8x3$GpUg_VTAla4S_U|vBQDP#szqhwrA1UjqPk_{Y3sIxp1su?N8{cN1h73*G5J{ zkRNAiW&}b$o@Af$?&(0$1<*NTH*w8N2Vy28RzL{IB;m%PD-3xB=Snz%u0ZRSS6dgE;!Mq@qmcnErwlA% zbV3LW7=HZgGE<6=(b&hIS9pKZZ5_dQ+sEy~E-9mC8$VXaf=U@{69AYHOAow%VT!-y z1a!Gxp|Zc^&dt*t@K;QGj|)pkknjwSlM<^Go*Qevo<{2bkI=N{F9JwNZk7P*$8(|z zN1KrSo%^Re$peF8M4_YWE0j<&Axn3W0@NGY-Vca^q~LT%ed)SRs61H0FD`u_=_Vo1 zD|#|~uYAcUb7{ii{NjM^Nfb!)lAvg3*62BQ;RD^z^7fd6YN)fO3tTyL^IxBMy1CSS z0`Qk>&}xFD1RS*Bvn^z2Rr~c02l$Vka$N4FLp=gv`nT6-eKn@#PPwgK)U9^TM+F+m zI3sG{>SeaGrr9uTq1wYq=C%Wm=x>ieYlBJ@3Zzkaqob0`X4jpdC z`1)4OYC{7#PvZw(FxUX5FJ_4zrnG7iqNqoT8xl_x zs?&Z06?xYIo&ahCe}MD?X~fQIhI1hFuzxUhBOfjXqT7SDELuFhFi6QCIkluSp00p+G^ofpz9? zf=^%-1G6twO03LL75!SpIasq9PlPY~0PwBDM5UHXU%JXUxV!bMm&_jSly$eiG9mN^ ze7dfVOFfKC<}TjnBt5(g+_?y1YG~N7TM>FCY2ZP5^Wsk}Mms9zKiWKUD&j*qIEzp+qz$>r7kbDqBTDt2H ztFTnI`oU<2N2{t@K_RvQOcXCiK^@KR6z>mt9qKQ}YqTWiA^$fpyf)e&x*+GHBn^f0 zPhO7;w7X&_QM`ci>sLD7IdFG+&qWu>p>pHHHE6hl?(n)5F(QO`_$H(H{m0#dTlU|7 zD4ZCxbnpS6XPIey70iv?D+gGykM;%Z81ky({%_|@28KfxLEB&sJR&udirGOPNn1J{L-FLn*0dh6AQ613^W?nL<>3Z*q*v#uACc>f49 z48p4@B%|RpsL15+65!_#KC$DxGUW@c>iO3apo!tS?Sv>Issb9Y?!C|6PpG_%gC$32 zA8U%q6JOs=vDPkj3yACqzsW7^{OjzQwf2waN}aN1pz8iM;pLCe>=lmAFm|UN0*91| zeLe`cmPDQ%M|A;61o98ZEUbmDVQ1UUGu*EezGv=j4Hb|ua+DdTfzDgX!=L|(z++)Z zmYxK~h&X%L`hECt0TDjLoMOHVyJD7+6Xp9@lE}i5`enML8W&`X`zn}FHKbjBY24?E zhzq_kD8?m>Q>JbY_+OX-A?W?9Dod1 zx7|R{h0uP`ZY${cM-UncK@5@kY!nm>dKI4Mln7rST$T_CD4tw5nD3ZgJv^dBr>Gu3 ze*D*)PGVPUTo7FD8|>_Q)3+`5hX0v9`ji0O3sg2S>Q9;yY56vrCbPe^`Q4M-bmADd z5YjgVg@xh73dei_qBKgKWI&B!zJSVRsNa!Fz1^}}fmK}6{6 zS!kwca<`@mTKu~TWhfA_#vNZ%lXG8ANVFT41)kX9)a53%)Z&r^bXNO47wQTn9o)lOrxZ#ifQxMUfCn~s|DxM)EU(4*RSV# z%EeGWU@niWqN0i$HQY)g2@ypauF&RAP(1~!HL{J7cP+bp{8xTpuB#ap6H^BxDK_RN zD1k^Mi>MT>Et*wldlQxX;FjB`x?vO$J*2*8Y*xB+3Z?hXCz62ICKN}FuyRm5 zW?br5h86)icXwQ5&=T@oT_a2F{OAvgnsP6sTLs1nG*#XFAe#rH{xt0_v6`zK0|KIs zJx7&&%nSm+E1nias#sdwIvtTN=(TkWnCIt`l>@)4z0W{yn7_TWbPRek+e^%cz9^aw zh0!Esyim^!~c&Q^b~wG*?-gn!Y<@ra|i4hjGyP{EsEKFfcdfyX|P8WF9+Oue>}bu|q230cxi$ESlj zGvXA{KLszq94FQTns?N)^3lhhMOnWxx%?%ZUNuAAG_VEE7sz0wV1)i{P`;O04?PDV zMC*wtRt(uT+}x|K>o{GM-c5&iDa<>V%e0?Ry%!vu=zb)4_&M~`y=0g3?{CQBWw~zL zKVFaRxy;g&Li}Mu>cstbJ<0Ew@4J7P$U1)N_`Pd=?_b70e|cvFA7bKf|dRXU+6CkfHAw)>{-f($VeOAdP6P?hnSh#Vg_(9zbStp zCaP$$1_m}@41@F)E9B-j2-mhnk>kxgsUKI&RF<2lR5(W5otW_z@OWzr^O%F|=X>hu zUat=h&|s1y+GBK%yT_QceN^Fy5kLm=Zo>B$`c~=D9dSe*6Y>P266k8p&6VN)&&v|- z8$)Fjnt_)jA4Lc|S!iTwYD4D8e=_4cKsq{wrV=z~*QB%Su5}b?#hGJaHfL35oPYt? zUN^va+nu#5gEF0J2E?YATDSFx+hvK1W^v$f{!3Zk_vL$VA^v^zHJoh_h97E4zqc*U z4DTy&Q!|npNN(=k*rW5&$)3d1eR8I$0F#?y%R%Ls0S=g5ejmeokS5eH$61KRDG3~V zd}gXMt%R=1ERc1J^iM3=DlUv)n{G zh{u%lCTpf@%9E<3ZpPm9@}avm^#K&U9y!rhldzzsPr8tF^I=Y8SSJ|!{`J7j-}M^Z z*3DSn%L(Ju7tWgA#vd7Nls3el+};W`f5n(#pK_YN6y`Eo^yliUVJ^E)rmh~o$h-9* zTJ*sofnT(UZT|iNA$2Yu=1;?Tc1XfR&;~;p&gQ-ZszDe;960|zOEZTW?+qhO zIhw;1t{c{f^0!X4MmEm1@<+Nj>#y5^5;;{ht>mCdaBDUAzy*a_xUWZaak3|c4WrQc z9-4F=M;5cmk9Pf~Lk^_D7qB0$@5So&H*ZeS|H)W1qv3eY1jkgWffrGhMG#me7Je9U zS;!6d$?c~g9OK)_x{XOj8a`mS_vtep>68+kPEQk>y}V`a-?!X~eTB&;EDKKf-4|Va z)u|m{QM0om6R?R`n3dp53$EUBpF;o0h|wiC@tzJh&NyltUY}m{KqC{{!CheTKrbJx zO6EdLQa@$8JKL#%ZnU|ug(sac zA;`aYLCAqt6zg#6OJR6dF>CoYBigLm>mqxl<@Q9{i@Q%u*27~hu{RlNwknc-nQD|G z){+;LP9_WXkmohcj7D44$ciH->-)3gwMQW}SAOK?<@vK}6qK1N#26cAdF>0{li2?g zdZzo04#eTJy_0D@^pS8O^_qNQCj2k)Tt%M?lHjH&a_;xkk!UWZZ3Kq#JWI zaudBf_l=*bt2Q$K@B}Vkx6Dh6M%-S3h=lgG^k|vGI+xBJf7>~ie`$Ks;VulX+%@Uo4d^HciYc+!7_xPQ z5vkVWC2B!e`<2$r{%zGQb0FFpR^Qs+Uw=b>V7ziWaBzmBZ4W*To5QKmmEtoIN4M{J zbTTX%1Wy9qyaB^*B_qZg^z`BUIm_q20gl`rOU4#sn{ko66+&l2_|R4b zyU-4Ice?V07(KDQ7}ceZ8=Q$a{6fr1)?he-a}}=ni!u?2HtfB?ybpKV21`mJco~0eq zvYxQafT1u~@q7B)0^YHM?=CIrWIye3X8-;sEF>wrP5rx(#)!20wYzoTKU*H9fLCa4+5* z#X9uoN@`i-@^vBdlsuf+>D^k`M|)K6@l?Vg#K2-HN?@HI8Ph6KnY$xcUVrIn1i!To zTta5{rN>owDel<2Y7P>})PMheW$_#>ch8VvPIQ0RX1|sb>_BAe5)y?x9eQIIE%?~D z%IWrK@#uy^DthvybY4hE=Ls0%3sH8{rqyNRkKIdW{5aNdhJ!!8@go_V&UZlyLfbLk z0@{(#*jX2FBf0QpQ!{5llR!_Xz^pe~qjrAZ%@7Pi87JJMUcD0Qdk>>TWVWmpx^k@x z`fHCU#5Ahi$)-Ev*^EDX&%$I^kJT~r~8AU z#bDM2$4~ncH^2QIUfUH%lV;5Dia6tZM_d{~>1udT^-@QiM@uAEh}vx3x}ZObq4v8$ z7PUq>hNa7;e_=CI13XY}U}4h)QHyo|GT4|~HL4s8rV(*jjK(>kRZDXd9&)&(R#Ry` z8C?u+dVl@Jg+HP@{*(|{U*4bj>9PHsx9?#7ORPWXx5@E|ul4ebQMsi#ILi;o!US8Q zmDCd`RPy=Rj<`q$zHGz6M588luU*GXLu?7d`~sQ8JP**mU4Q+=zST1SoKyc5nq;rnNb^ zbA&fy>Z`;*svM1}ef0K1(UpWZZxvX!re<}Q(jU@~| z6%_gz3%741&pGO5;MLE-rOtPf1@z~?U{PsX5!)-CZ)Sf(yt+;Lo&l_*yIpM;OY||x zGwspox`Rr{*)-jmphYv{m426ScW6v81Cxpxg*L65Wt~%^wSUFZXHGlWN$uQj>rMsJg1+qNc;5Jq7Kum zl$06yleN9CnTS1qRm`~P9}sz)IE)Y7xWTb#p|oW3K`AxBWk%GM7GmHmeT`*!k`AxW z=oMb>M_qqqKrl%haf0lxmhs6Vu!_>tx3+=&Q4VG(hZ$3yRn0WE%i@L$mzry&bE-F)4$mx9~HPp;mJjXJwx8a<$<^WLKtWo-K(PF zPq)lxSGzeHWZ_X&?ZtpDwZW-m4J=zl5TE9MAaVhQo)bNO+%mNgJ@;R^ByqXxYQgR% z9c%Mtbpe}=TPbKG%As%$T}^cAVGFo?RH_XS5xtVdtTDWw?}>*LHXY)N`=48SAg0x+ zc20`mFiZh|>$#O`kKMz{Rq5d`Ut*{>rk_F3P!C=j=6&)fl2xrDnH#3Q2T*WXHgq~T z{b{;=AZVSsHr1R0xmQ6Yj(WHdHp!WQ5V!L3s=`GWxuRQB6B#&ZDi8k6w;$Nu(;o6o zmSY+8>&u9@>4ofpC)L~Rwq!B`)CC%|o}6=YDx_|%vFfce4=#OG)=$6-0|~ifqnrr@+eHY~8OXZ(SV7ND(b}FrTMm z<1l?5Y}x$_$0*i3Gn(m!SvdCHKd=VndsHPKnR^9$KzPjhkSE~an~>#zRKAMcV6==jL(@XB2o$`Jt~evVAitF_G6{z!RNnwa+MDWm6c-v#jAkZH{Hq zgu1tAKjg&1Xj&y$+@!j$`Z=-U6)^Dp|2&1zOvpU*!$lpULF%O z^Fy!QXl_#^OI^v%ARp#5Y9(h=OWH19&(ti&wA-h}AMdD-G-1mhDe~4*OYI0_&@X$| zed^IIeAeTG3jW17*xz6Wr4G(={d~2Hr-_M+Ppt*C#}>B@Ze#9A;&qSvMS*W$Bo@yY zu-1`lDXz$*6ko8nV?-oxOrOMs(Uz+uNk)h2AXyefqF?O>b2BrheMhU4ry!LSpIDx0 z4@Ht?^0%gK`0+{#a}M?e`6Q3JMchZKy5^6rD?Wo{sykx?zG@;~vKRvPG_*(By#`*ATx^Lm*gxW{WTPDYhOxe9F55X%}TL zXMMPYk3n^B(T9dW`@xF-+N*f{xEWQmWk({(xGYSR87my(gJqywUPl;{0{pfwbY8wrOjY z18MZ+Cb)}RMZ7)mURvwOh7|zt066;EI*fDZy2x^$h&EyDqG)DL(Iff=MzgUD^M8ny zDov`YI^-}dHQK^;*9_6_%f>-83J2iC$HtvsFA5CcN3J9KClW z+U^^(sUc9gIMZT%`tbC*bH%#Sm`riv0{udpq{O78oCp~inXB5@vl>n}IYABubtGz5 z&>=@I@GVZU`}c=Sh^b3VE8WXi<~uEXm}KB!v^hco107v&y@4fQHnJF8;j|YFtkfJJ4uji5c#D)4HfmKJV`7Q;=d06px z&`Jb%ec|%Agtxx-TaX2fq#C_G(MgI4TU{``oTDWTc8}9SUtsZ}5xNKZa(DqK+I`|% znV87#^AR%m-YYa7dmS|B)NB$H9Ir`j9QUS~7$Aq4HV!`8*?@3hl7A@%M?@rp$D=H_ z$pwR*S)CY@nKu1&KSPp1Kp=y*FYXQhorPb^Z49B`nC?;$URT<>OodPV>3gjS64=#42nic=-Sm@30A#2ixTgxk!tP^b zhRN|hMbElb(W(dTw%W!Q98AGcaRLMOUJUb*I{`VtodD+`B^J5|-q-u7I~T9zQaI5( zlgeVE{8QE8svCP`3e8pBBb%w_J?&sVeVfT^)#Ktd2C;KbqJ_O8?map2O5FAL7eO<| z`I($ijKbhK2Va#BH;6kA=azP8AmJ{rWyctw{vkJqzXbp1`{gQsBmyjblMeJz#p=Ke z#%Iq5FPSaUZ40wSJ%2WsgUf~wK6=h-eSIAPSs4DZaGk&^*JQ7{&*oM;4~jvpgi!}e z=t(c##+d_t4#ud0dszL_W(!>abv2ch^X_XmmqShzCy9!kY%6BHeYi7AXFXgY3Ak4g zrLw5c;YD<+vsHKtS$2f&p=IT_7k6XLvBJFuF6skXhW*{OVnrs4BwhmMnNOZPVUO_l z_g|ciS_ikkVhbA{`qlkcsgnqTi!bqH>UKg=*K={BzW5lF+uI^;f|z9Q1AhzLp`>)4 z#hoAL9_()sEsuLBBXF~~m08=zyMQST0u&QOyBEay2WCMy79n`&%#sk;pvqt}>?~uD7T0sp%c1^hJqG+*=_U{&KVlw2K345lvKW^p32n43qpBx?^#+D_dfAwJg+PvUi%c!IpI#t;db z{P_O{h)q>gx~cd~6EB?N`{cuA(i*KXh$VV>z(YjxkKT@S)3($Zwkyd&~W+y|m1r@oQTL)gcZle&8-Th@EXA2fS?CTfo0VI-@u;NaDv4^ zVh)vnwe^KR{aXjyfy?Kv@G4Bqc3ds2hOgRA{pN`b;K*1^RZ37?PH59Bg?RH|*SiA3 zF&QmwE>wvbF1R}W5Q!gw$O2b?wPvCLmWk+|NJ*LbPK`y!^#N-*e+QvZ-E`|DkhYI# z;OC|uc|x+WEjn#dwOzM|&wScFh$M_0x?ah4lT79qRSr&%tzy&=}g#6e11B*kXPxO3>aTQ!SA}Ar`$pX}P+V+x&N|xZDXTn zvhjkj!&WSUSOW&j7`1}4)307IJ1ailQ%*SSxvG%jPJMwa^x5r84t?&9j)Ac4E?*$a zup~(RAe9m@?aj}39CeLyf4!5?37onC7@@=il6hPDyIkr8TbvRVme*XNS7d3T&=4$j zcq3x2ewb0DMn~VWDWej|fyLutAB@nG!ZGSN-e<(N#qe!fB{Dy?(P}jpG5AJmd|HCb|*>N zGsAH{{v;E!E}X6w-8!s=YKh+N1^8#W$w`jM=x$tU)YuKeMDLFaW@Y@;IxN@3DMnM_ z&0N#W>Amp!oBomq5;2}j_j)!E_}W{ zS<@TAH0(c#M1mp~TqfA$IG3JdXb31H`OXI@mrjXiI9#MOFt2#XvAs>IT-sTi=X!Wy zFjiXvN%v@W&q6`Hp|Zz`Nw%$_O#$d!7Q<;+o;l%lQg_*`%Xb2)SF3hvb*k_X6WJm- z)MvB|?4H)5#cJtq+~~`65`oEXGN60xNw#fls7wGkLZ;!-=LY`mrLm{%mbi>ch+cx~ zxVjg+nZQcL=K6RJ4#x<hYTdkb}-oRsCGy?C@LM?r@{I*0NU*2K5<#CRXn1)qj61%JVicK6JTl8g}w|1G<;$2 zDq;>U?R>)dA_8U^!NG4eo4k4*d4&pe(o#>NuBFH(h*vLEX-IBAe;)YAa6QZdO45aq z6vQ^r==Q}5u(M~?&wL4&Jrzz57Vv%pAuJ|Yl`+7wr__ie6^D-D4+01$3ouG2I7!ew zK-r;F8@7n7C;ErFS2Tkv0qj;;(G!|pUQPlar$L-S?I!NC;Z`A)kVo5OvSO@Y%KpxJ z=KN?$A2S1Fo5h2r>S&*MUOa* z4>w)~eHtAyaGN$k0vqrp3$WB0%9nwe-Q8SxIu~guNIk`d#?~yP0$dChu=F95@fN)m zDNwdEm9lGZtjgdQb4o3kwK}LRddg~cw-+<0_%e}nAyfTxY=K#8YT|uEwX|Tm44>L~ z{?@83la(Dc8>%;f@_PFu(dhEUix$Sy;R?;xuo5${jX__ukuf7dMr5YfFe0KY?0luYwf*&By=qdAC87pT4Y9;`$4TGpR+6R+1GUKAe z^yEdg!5DR|=^0NBB$wL6Mdi1hIui|27#-_?SrXfz%%s3L>UXZB~(N!ap5P_@S+{pQ5_C5I@9UE zhK+-NHVlHXOK)FdHyiouq`v?~IvCV3^YW?#d1L&W5Od!iG(cSxe_t2mpC6RN1y24@ z)m>{2D|Y(0cZbhL9cQxxY|IHF|MylW;2DO&cMSjW8@@h%y#{7{Hv0@oEWi2b1FS2Gp)Z?OaNqOPwI zFe62N#sUCLg#CrQG7Na$qDJQ(A6ijmxN|+p=ygxF(@2C9hD__22UVmem|NfEht1^Ca0>b3v><^H*p zkgM~*>Dn<{+gmp+-g{(k4Xf=x9)Em7{&VTUPw$)#v!e8pr)Z7Si}~m3LVoeExQg@m z%~t0o2zUSaNWO!R>i_v*Iq&x$>l%J~=d=_6DF69*f9%5l2Vbs(wqE?-T7ds$A6)s} z*^TjPv)TndtLq8tHCz>}@CG~e05*U^)Tg`upSS1E>CmnFT3;fdC7tD_^lp`zPy4Rh zyLYt)8~3%E&4I8gdi2v4a&)F(mDgwI4W9)qiFi(ZBmw$?wo$326JL?3o|_H=k%i@k zb5k=Bj1x{u9&!C!%au+WLv}m62C4}BnySF!G(VamkeIbNM-!SGXP?82+r%Uvk0t<@PlMHJHV#gl8nfc&TOFep+U z96qi%Mrb>SkZSO>5%%ru;Jvq@X+=+0@h!1CWI>eEHl?vVv%%E|D};kNJCSi#f2H`n=FMcp?Z0(QYHEUa^4ZMGLO zN~?%7z`~^8zQl+guk^}<9LUFXQ?Z$ZRx}Zk<8Zf4L4DU0Pm>a!Z+#R<7P%$TtrYvxrcd zuE7lsyzxoe?&O`_s?Y!IlJb~&-v<=5Z?XPex@P+V%dYTwt$VnGsXy&uS3Z3BFalD& zI8iqp*cYrfZrpo+*MWQx;H4KG@nUIgT38mz*JoKDUaN)u^+^-Yk7P|3HLzi< z{gZFfugIKf{QmJBbOa&zKuBntDT5_| zoUf?73JQmXp+g`3NYLXcm(m&{T8e&dEiH=nsGX#7e{PV%CK0@NJr9I6x~Bj)yIB17 zRdx$7(ozQ}he%H@j~8YMJMA~E*vq&kh+u0EM>s<+#jmYb+IYqv+gZ;rZvMq;PzCXc zBMCYj8Qtg*m4M9}Z;np&#LU_NzPKy$#V*SODzzuS3n#=8@W#Ki_Gz6$IIH%UpSzUh z$cDDgZlfF;v)4snF`ikjQEuim#sx@=lJK@VaG414*x3=p-zwy=GE`vKtBD}U?ItNu z))vv#YRt4@85S$v9>g5!T7hT`fmbp7IfgdtC%qv+!-cfn_d$N$=gso4$DJ27)Ym~} zvb$}JfBL8NVX^6po8Id$ECzEw<7=-T>1~lE#EXfmrIFCFzyvM)Oj^Pw20<;Cd-Xw| zGv}xe9bf4$h(hKNDH8~qb0X-(7CwXGL>_Y}Ue)_^S#jU_o!x}j`X)19x?$sdg*a)f zZXP2byZx5hF3dx!TkSoFFm&=LVS9-SDVBlxJxALoFyXXK2h-CCYcUMVVVaj6_sKu7O>lkyiS zMApl+htlG}mhq>3& z@ERG3PQFoM9b;I7?+$;y+iz&gOo*2AJsEnWk^Qh^-b>sv_`AN>-ful#`}G&*F{+M76_;Z z>NO0j20J!N!ppXB3EkPdFzAy$ez3K;UOrMgr&C#a0{3!bH-M4{M>V zT#3~VYm!4EA~Y(6v5R5N8U|)no4p_%0>)O@Wj?3h=g`zCA6I(xzWa(mh-S+N`k1X{ zkz~F_epUzvFnBUmgUwsxaNjLduhHkw?UQ1h2QyIrHa6OQSuzx4AjAc#-m*Tyve={3 z8)0m)Rr>`x)uU}s^nH#{#rQsbOvVLViUScm^`mEpVHelBj|Nauh(4Xqhf`&uN=e2w zPQ=9k-WT6&HKvUr9#nCc5MJNkS~p7}O0~jsClfj7Ax=cEuIs@vaK}jZ8dN#n z2L>w)^qB$M2=JWePl|jjC{71KJ;D$LCVC#uXjT8AuneA{j<=w=np?hkjsfjsJ^UF6 zwekUk5;pLHJP6A%>I8fFK-3|=BYv}6z%ax;l~ULXWLs%bwam8hWBi0(p_u>! zvOqQ##Z#MDYSAxSvMg>Ht1BzJxUDnPUdF+K9$vYWWSG#o*}}#p&wbET?X(!I=pH|C zJLD3gx->ldY%oMZK_Q=%#BcU`#_|wA6J8URzTI{k+Os5?kn7k?ROFbnYRzYth9K<- zoSdABCWHjP@pgb>PHuw#DI`+MZMux|4~bYAij`Pcyx^?VlFh?EIegBD96eN@wnlr% z8u$vIyee?7ZLe&J6bJ#~lEq5Z{k6^NWN*T;V#j7Z|AHJ<8biSPR`ag)PN6I^<(7Nm)bL(-LAppqqXxwI&zx^Su@gG zBapc0S32v1x}gs~C(;Cg4ozzw9hHHW^Afp@4;L9`D)DW$so&qxOpWHqGa(%@fG&+x z;y)p67tZ)$ET{mq+aF>24&%RjQzT4p-s0V;x#=x(ACV)w;sEs4)7P5<4I>EOC}*`( z-c9qlPra97wB(j=;Tit$t(F(FIBY-J@Bqm;F)(*+e^^dZ62Azi>+-O}okf1D;L@e# zQJ20P4~a>Sk^FB*>c#f=Urp3vL52#JW8))$8?DW@X041bnfV2B+{XD}c_yI226`_0 zHVcDW!g>7nbN4JK;2Oh4q^&+Fyze2LvCTGLFXrzey<|pnBF)EOUCd;Yya9~$=6Fd0Ez)uU<7t<`I5t<9Q^VKXoI@izs#9)n0hS~pF)xP`oR zNzAbG{q<^2!A!Ikm-XXh%WR<{XW1J_S@FnV)KR5-C~@UVepA$6 zEGmzCm5>&~fc?g#d|39x5PYz6p7m2qOyA{-^mdebQ8rOj8e$3SXRB~$h=261KnmFW zep&OW#dz+aOqd}>>znHRzE}dFgdc(E6h)MWtt4&#I?Gdo%+&~`Ln(g0R1rLy zy&lw`7?HPZgI1)Tp*abP2M893(hp@R?mSQ$${ovs@zV5FK@1}Dlz4wY`Bf4#S^Fw7 zfP!aJ(_*+%972iZK!|$T=jyu-x;;jmJhQHA4`<=hn($ zl(ed;fx>V-%{cI98!Q*7MRMWTX74d8^)P zAjMuFs#NQlNdrD!qc}G{0)m|nJS7Q-j*O@%*}Tp9k4`=019{7H;}&7L;hPe|*4ut` z>eP;OVz7}(mkv`;c=FJn2ziXkg?q%LphS>xzm9rL7eY03a{uRAM6Hvprk2np+vAFm z5Xic7K&#DRekDsWR1y0QB$KXz7i4vkA5M z0|WJqiuYM-OBeId#01XF_j<^VJ$|3}jDq51tHO!@&Dz8N#;iX9r2Z8i^Me~g5-m2- z-GUmdJSIM-z!C&fa3Pm98Q;v>D`#sxrFGxWww$O>t8*cEIE-E5)?%54w+_v4)(ynd zer%euv012AHq1SDZkp@T3ZSw0w*CZ&aXJ7niTsyLg(Z2;Dnuluv!NW&E4k|F?$!ln z9wmrCZ7-_`=FsIS^6uyQkUgD4_SDmJCK0kV+^d@nHGiOy(G+XmGfZ65_2Vs+L<8^Y z{de&Y7lktyqBCt*m7(V#F`(cyje+m?;O~b#%aPPoy|g^l&WoWNgQB&zDI|irY<|g16Ltk!UP`;_T7o+F$$ud+<|fw(%Dt zmW8&i$On=RsCFp#*ao$&a`T^BRYY>FVKG}*`Pyf6vF>SL4%~F-ra{-w@p=P(lu%B@ zh2ZfAHo4V{SI%7BGl@o9>Mbbkk?sBv4i3(sxBnDn>`%ooR5+@ATdfksuFXB^vgo1y z3?uOz13j=l2lVl33EekDbqh>z_W7|TX!ahb&^NGE#7X^%y}X)V58no*L~x%Bj~#u# zhXZQutDNjISwMr!b~sjW^%@mJ#>%&fuj|XM+Q%B~E9q})m(zW?ny4}>*g0)~dJ*wp z@L)UGDCgVVDO9^p3++RV4z(VzF##!Nir|OU{O{lOP(fTdM+w!oK&;&zaeo2N?Q0X& zIwi3|T-VT2?bg?Pg<_N*1UM^uVYz0ZlCz_$UicwTA~AMIXv2Px(Q$j4uv7Oqp3h=3 zBS-auNI7_V`j!E*Me@qbpscpl%tvYOFW&5O(Hv3%l`G>k>Pl{}93>07G1XRVUL zYL)vQty)}#6IK_Yv;;|+GD8pT9R4=hd?rTq$JC$-iZG=C35>H&P`1!>fi%#5p^X=s z{-jYt3Y6f#W5mvXvI`|0(vgqf4eW#>f!pX`7UA=6EA8$c+|&_iC@J41hHu$^aHK}z zGCv9g1SZl=5a&&!4>lT}n3c>hNldq?iX(B-l?g%4aAEL z&&OTd*0=l(SFev(TV#^5p2~uLM%LQ9)QJ++RSNwWW%groD6y>Fm{jDyuDr^PG~nw@ z+XtynEmm+61zhByo{>=BJ97JL)n4}gz&VGN)`os@{8`&zvAANSTi-s$=Kj00CC+W# zB^jZ?@u*zr$PmYlqN@WE7LWSehprDJ>PIO9;{5EI=t*K2LzmUAHzbKG>Ic7AFAoT$ zGJ;n4wnP&D%s~}Webp_7x~8t&hMSqE=hLIPvuDDC%rz}0hoR_LtNGhU7fX{L0Y%|+ zdkiZ3&2eaYFzWTCEieD5W;mD{yMh+jV$=QNfDFCy>u&G@)6y6!nU0=Lt5(JX%xg_lDQlPAsb6i2dFaUANh<;h?|ZSJY1w zeka%hdRNxZuATZva|wd>&H4cExe)E4qHYr$0qbY<&eMYx%WHCZYE^@9T`!(_Y;V7jQmApT$m5=@sWg0q zK7vmhbahlZKYp<)F5>H<@>4nQM|wjSZ#_$ReX?bRIq1(|*JcBJ^d7DR!P6rf(0DTb za*Ijs?bI!N0j;q4F!N~Gb?}|M{wzD)O0|b49h2jx7XH@URXFH11C#Y|wjE)aE-#!l zSRLn2oU1>qJhJ)CNW!l4I_%NhQWXw9ei7rG%$0}jp_D7A2F z1wdREN_bDb_xSCPCf!oKj5mv$;Rq(p|2EXS?Kbh`Lqk0yv=^Y%zM#(*cofD0l|?;; z4pVd!$O1`y%JfU2PVq z)wQTb>QbFjypZHRgv#%Y$1C_GS;(NXxzGK)`MpLAZDv;lplnqH)Zb|{yB|rY#>etJ z%T=#=L;TR)s%)Y%?RN)C>U8P#W#p!sIUr_klXWFJ?kCV51`Rl^Zo_JT5iUmy^!2A} z>gK%BL8bUvGtbTWxaUArGXP_3EJTO%p{t`l{&924&706HAn|$wT40$&8@;x=1s!`D ze>E-Gj4Q%zfG@j%f~UXWQyP>s6@WUbpI7COogg?|f}w~mtxuAB;>Shq~l*KabfE>BsV_H>3j0&Zn zUm3HB6EI6c1#ghCCB)%yrYC9^jY+~VQZ9-kWAU%`8BTT?Yookk@oAl7^;2z?87)!6 zcDPKs08~Sp^H;=+^M7C6HUPjy&w^(7g@KZm9MZR0r&z z@a&vV^SkW{?{?TdsNSCDSO3SAqCE2(mS=?blBs_aih8(E{UIB#;&%2yb&0)>Uh0g1 z>YtD-rDlYGL9)m8_xksHI=J!ObhDb>ZZAE2O+>8!7gvqila#%%4+e7N!>o`?SHm@X zg>mKl_|sFbmMgPzvN~R<-hZ)pGD}e~auK`a^eyCDXsY+kP^a3(k-%1A;`{X6d~bS@ zOtz~>EtUmcD>oCf{g3v9lNe04+zv(066y{|&Fa>)v-O|4$CVys?P_-9?OLzcIwD&b ztjSp&Kc;Ktu;+5Iaj#G z@e0>-t%dLk&;9(4mr=V&NLW}vRY_(^;~+FAzU)vTyKC~K14Mcw+?oPB-K$U@N`*^2 zwjU)U;P(3LRDAjmZNcM;oSb}lqC|*0t=KEp_YugR~!~U6&#sBaFsxt4@yJv|H*3IjLh@O)JUQ#$_3gdTBTiAsJbT zi-7LboBPW5bM_0Chj;qcDYR>!6kq8?ULH)jv!KZnknOJu-9cDyG_&n5HygbkEWOax zv>xnES|C-wkVI7nFJ)}nK)Tm7^D3^>m;kEx{P zsS1YugM;)a1_qC}pB|57N`JgKWkXmZ!N=)$-*-JQze9XYoUlG_m8x|+(+Lk|OaXf; z_*a?ZLHh0i)-XLZf<03CQ?S23W}~tSm}W&+S@_^An(uQq)H4?c4@S~Ic!2RP7LTDV zDcWv{*ro=1zZTuJIm z`RHXAF2&lYI)T=?sWHu!wVC3OMr!YN?;Hcs+D_~(bIReuFONJarMkrCuV2Gj?k^I_ zxebfZ*uP>I8WTgeS6OZ`7HBqP`RiXXmb;c&<^Qw*qZMYII$~e}w%DbKPBx^>Xr|wh zK|0H(F&nUK`nRK=i7A`tlV4O6FHEN4S2N+eP9tcGj!RnADvS>s0cN5-VU+omyfOA& zwc9dRxYl8Vl<#akM6Dsej6@=sD&WwfBuGF+g!+M`ym92HGoL-@c5;30ubI&@&Eb-x z?;RH=j*_g3UKU=?0{K(my_?Xf7BJB2Mo@U;7xA(j=(Z|oBdHKpe;gRJML zG7n<>h_A&awBPC}9nsrKR}+8p>WONH&lVW*9b3+%_sc#|ll7ai+@0nc{OFXH>(3=< zZ{E#~+%#O&-cmd;r<_Zs!V!5$?Sh5?BdyO*^gJ6Go^pFp z81?>;SBZj0Dt6B>qd%lvvVgJK5G&Vuo1rO=Q1*lm$Y zSa`@F`>W99UY%#~`+gDkhlGT0)IwwH$|R4v6h^9)H*}Ym2@2ccL`JU*& z>|Bd{PtkLsZ2R9jb;bkgX0blzVL5rXl;zFXLXiGejw=neh z53vp`dg`^!AVvp({a%{wLIBQDbX;7U#IL`UQcU$Sj51H(zyCSj#T3d&JsFRbxTkq> zuV}nD1Jfldm-+BXHmht`O`~T#^Q_y)Yp`&4D5KvvT?xGTu+h4EZ||X10-JLE;|E1= zDw9RsBo0=Uc}G>orktKCm1c=*l$! z=i*my!8Up@@8}nN-1O#*&nps^?{KsW;pQJKGn?6uwY&cDj^FO0F?UIQfV8x9Q*Tqv z$n%1i5%}E$Yc|WRH^#vflA}q7NqGjV6032?KvEC6{WN#yE=0O!`C@DYm5BQ*edKww z?3h|(+1{+vagL(P;TYsO_a4f|ruX+7wK291MSUcF7y9yAMWmTE4D%gtPl%cyo)KZ? z6ux(l5ZoBL^z%|*W_M-S2-E#7w1ivt8)(i}`b-WhLO-u_x+d;p zfT{Sd^mT&ZYmKs+45H!-9`$4h>%>mVA(!tjZv4$=8?aFP=Rhg*q13Rc^wX!=C9qv- znC)BoNXJ0`;PE^rT$ZRD1ZH%a{!?=(Y&qI`r&j$f{$c)}u18y^;R`=L{}=aRo6n6^ zSbaQVrxJ3!YRBSgi(~Qw$9jqW;3%KdUiVJ-(%)UbQw7m!u!>j4(bx;!tLq-XTUQ$> zMmlpi4tnfdxKIcWnK$+tWEMJ1JS?>wNGQW#pr<$Z7omO&M^W#cI!4ZTbc&WbG2APq zrv5B&fYFlkYB;U+#Qc%B;}ni!rQ%_H8CnI28N%A1A9<#``?HRLzwLR$*Jw2B+KIcavnQBF;rly*-1n4yPrr&<=DCTEllfB;)49?wTZY!t|gyfp2{?KOQCcCM6 z(o2v`1{``*;U2_S+4$R{|$w;tiA@FihN%7Q{AUZ{n&?bd|TM7#%{twE_8N+ zG3woPQE4wMzQSy?K)68ea5-~J1XBe3RAzp_#YO0HNb|z_CF3`kiVTH%`lS4uDw!p} zv}LMytFSLv?PuKg@-%qEo!F0meXw6`?J7=6gir^05UdoA{bve_;wxh7IDYBbr>Kiv z!bDDhhKlIt&h;k^xY5@0%TkEO{=ai{8P%<=t$Gh`Q7^J0J2f5e-MaJLz_daKTD78RL=3zpR7(NN!pq;Iz$;e)8k8`C{NEFr5Vue@RJ z^Urt0LWmI4N8mnA^Y(2446xuSAaYE?yc% zX8ljr6st*)X1EAaj+plHzP`RDu?v?HBk0wLYP~c!RimhLu_L%Ut1eV(V{y?&m6*_* zB_&jKm4qqQJ#b;-nUiB|X!wMV=pG**J}T}*UZigFEtg5`#=U^GB3EjKyPP3$he}ks z3SCG3QZvF`AgW{q$@dW(u*>*IB_p1XK` zP-jRayFcf0?WfD#SNnQ=e67@Kh~n(XJXA<_e6#MVxa*BNHMjTtmzbEx`z!pn!O7-R zS~$(g8x5RT$MbFJnO}&35X>Z`cq;n>U@4J^iA)r>o=#%j4@Hu zn&)pH_AwNhCq)++%Mx=;icK#T`@wwr@sdU=-*<&Sjc(w6eNW^@^Pk{021!)OrFZOM zIQ=R9ZfYGvMceawdG9SAw91u@le@an>3cI`7Mx8w7L@1CmuVs;-(*FOLMK7BL*Zv+^kuUUTzd-dd5(1+%|9zVf5@t&w#tLCMDCx18>WUdJV?Ddw|793Lje z^NCiR{hO+FYeBENG@rsMFBdSmH!$xWNqe#Fl>SPYJwE*-B6Z3~`ahEd{O{^|3W?z+ zP{B0OCc7f;V0mQU-c~*lOcQg=lZoS`ASE5xUOk}9bN{kV?h+5FQ_Azpx8#0k)2+SX zY7K9{svK$Fp%QQiz(fjhBr(`b&1LsBbPcf}=Mbe%Vy`o0XJ?w8kPeG<+hqLvy9A*% zsBH_wa#aD~Q+CS35b_l9-IA*MNX^i@DR7Km*B5M(PV8K<#Q{{=7gLxRZjMM2j> z%MA^WR;{GOpdkF!!EC(m*3CjYILZ=JeI{MMoJL;7#6^Xl-95}Hf{d1%o0)hvmNYyp zoIYdf&7Zl(ObAFf5oGjJsOM@AFAmHoE6qjQI>;Fg{NvvIpW1c81%JA2fbw{29CLp; zLuzuz2 z(()3Xa^D1$D4MY`@`l5lqyt#~7B`ms_+bbihmP2`)@{?V>aD#I_sG%@kaVdD#-Az+ zgE!m=qvk~W+K812%O!v74V;Wb35dGBqNGFGGdVD4B;lHU2+Xx5YX@fEX2 zp?zf!x&b*sAjAWfnY0Sjiu56V4?kj#GtcSVs=aGA9OCl$Td;iN+4gl*b`(q_hSsS3 z`?58+m9N8fIPhCQb4xH6qiTLG(wWyx4KYn2aq^`3?ei-JyJTviQZL^nXIPxO`+ubU z8=oOeS^0`%j(pXgC+3=^X$e?*|NMB;t~+KV`;9(>>ef)c1q)1(q`B8^#IMl$lTqbo zOk~xxfeb4viA=0w%CkWeI~#2u!X~WZSKndn%wD|4(#0~X0mJlP-Bma7!RaIN#0hm5 z-1EY2goPA#+LhV3XcbJRzlP42dT8)%7jLE2Jl*Qmc;##zk%H zj+dLgm}~s+x9(Nm)zO6F`v;BfAKF)=<)QhKamG5DH~jtAc`dXwUx-@BN;1d~ZC;SD z)57AJZ8LZq{>`R26Ddg%%lzV2FV{ANDnlzSTq^GJJ;YC!j()Z=T2@Tj5&H>mQnScz z$XyuUHQ?fk=Iw~iBS^bcC}kj%3!)aoL)_ta@K)%)2Xk0s4bC~V#j_RY--@}VD%JD@ zHKcyl%6i6x!_z<*Ha1!7=F6)SUub=49uphcz6FDHLbN0=O#6c+E=+wWlRKW)y3IHl zYpy46jJC=YD?&04miay+XZW)dW4TCt*Q+Nm%kfRh=c;~(=4PWpGv5l8;N;9Mo^Za6 zNf%F}k?V0MvA!$4@Td;YHQR#^?nHB0u?us{9Cs{F)j|bl&Tv&56t3*?skX-vYi| zurlm#jS-iZAKW54x&eq-N$!mB&M&U2f#}N>JK=}&HlD9zJ{Lc1wvG`H&)#@crMn<0 z=Bm@n@!M$bV&^$h2Nwqi4e?=P{OSGHXw@oPaWw!Q)P~KxeI>sKl|{awooKu|h^#7@ zX~NP!F8nllc|A)f5659+TS7*L_5EO}Cpb`RM!^U+a-PKPyVHaYTOyvMY;oV+>#8-x zzI6iWurs3#8 zdD|Y5JOM|gBSwIrJ({hfh>b4OHnuC&_K4m7M7t76WYZaM#=##i?4k2DXFHxlBbO0z z_rU}0rnC+*pNBpC`{H*JqVrz(6VXo>*}e;k%+VEBFOu<|y@{mh;rTa!oBHu!6)&SR z2Bxf=a%iv9g}xy`e6TNOz6Jo=V1YK%!GuiGW32Ayy0epY2tfM=-(!eNNMNZre=G_$ zVV7QNYL*bJ3=oq~7HeT~6?3nu-HQvy!ZU}E_(~?0k8)?{#&ES;1#%Z))kYYK0dVr$ zU(NyBY1cbsN^ss>&J2`)!ZS;lhP37yoFpmU*D+CZL`!hBH2-v$!??7z|!(dVd2nAKlz9nITS=t{j4@cdcvaY zB$3QenOXI7Xz0D!IpXc*USd?lfm|B{WklXw4{{ggk^`t7QUMma9-6z{06>$S4nwv^oLm(RE}X;C$P_hfOVv7h{O{Sn;gt|U0= z83|zncQP_F+cP*`%ByOPyff7#D91Cuwas~J>EhgGvYQr!2PpUK-duHqN2PhubIAAWE4hsf zb*<1bEcbuDTu;%iy{94kTIj53XDWy9HquO5WhwBnkz}IT+~{efY$7*)CpV91d+K`s z(@{up{FFD_A6Zh-&zt;^5s9)=@(-4O0=d@sI>I%vKLLI9#>vXc^78jD;`Z4=`jbCy zr0u{QY^^G1j3ZiM{lvkza;A4VY)?Sk;n;2Y%571OdMr(`9Iug@87>$#Kd3C_$>|k7B@cL+P>Z- zA=e1g4p+#(+}iC+bAPldNqm%Z2#}a-D(=o9W_{vSKe_HTVOLf=p-UlrmjjLWLb&wY z1MkACyJbdaT{iDSagB!9-yER!!j@uq+4}V`X`GQj%;eAsUENLk*;^dS;kztP%HA}c zDtxLJ|GJ7QA@ud=)o>*nRS|Y<=u6p;2fOkBLfHVi4vE|ySR&S}JFs}WkrAWuECi=s(xfTM_#=75b zY_8?&VO7++D)mlhG@gdEiN_u3PAPCHLL$aw*CP%2Z&8~YIrxeo4s~8Kgz$XVf|85zXj2vGF8wi>H7Vqkd!lJ36} z^F}7-ze!4Ml5b~DEk^IH<)i@s^7w-uc7_}|HcX9*;N_A44x!MnSF4gu7b(FK*Gg`G zm;K(;>ic)11TdkuMcL5Oz?ANSdi#No2g{rLEp7qWrGGr+LTZwZxz(RqL!LPqUyd;? zQM7dU;n}G0R^01DsGF?5o&K1fp%Xa4J=1jE52zk{zb3@73_Ot<-|-m%4H^P?NNj}Z z=#NmOv&C3xht}3T#Pn(Bn8MnQVjWbUI1L8%T-^Mbd88g&ty!kAS4c0x2EPmZQgKkp zo2eEw4)-?c85&;qq_jBP`jr;LZNZ0iZuJA%uM}{H(#}W+^03)b;WAmn#ShlA1g!tg zx-~LhEl!NzXQ|Xo^1inD>FHh0Cq*5E?}{1i#9otXYgV~fkQf_hEWECBR<635m!*H8 zaPO8*XeXuWT+b)!bzK2EnK-{iqAWju<{PV3J1J{6}cI5=4Sq zKFOmYg6!6ne@+pnvYnouGU`rJT~YR6uhms%+sw@oTkrOJoVXf#-%{XwEk<#Wc7X%g z!N8cK*0y?8@x%2p7y?t=uuwL(i^Rx3x%{NSO_V&(uMS7ldTmgfRjZZ?(UY4^4Oj%T zUEP0E0ZyG<`3MfL6VDbD`gJBXk9qXNC<>#E4yX5rnCdu8`#@yzZ7XRT8!r^P3>mXp z+cu(z3OK$RW$(YJABGnVwBW)wja`df+?IBlLGP zf|M<$iRjheRJki>YvbQ(#rj9XXU>7tsGLJ(h`%SCWoGBI(vAT@VN` zTz}mWBT5*_tl|m27j5U3-jJVs2I>(}+3kAK%vQCPF7y9q(2`{cXqQg_wgdCXq7_Zs zy0ibTP+^Nrl*cyq*|@ycG|%bo(|U4p#{Q@EEANA_xsN=sqv{1p~;u$ z(1rgl*LwstlwuFSldR>Euyy6|#AGt6_&S30N1mOwZwJcN-G zOmf#=@;;dTWq*S!(4h4@8c~6XpcAXxb>sVPg zBHZG9L~2(1&rs9Cb;;+cfsiI@<~&r`&j8&%3*<9b(|uoO&>}wv*bD%D3EEzG7HdWJ z$Jw<2X-el4 znYIAGVCHCkg;F50h>m8M!kcH|2@sWX`Qo^XrnZ&d=SoW1EdfLKo+mYg2q_PTcYGss z;!4B1_hXuPixH{>Z-4)y!O@6E?{J5U%ybt;Z}zf`JsSJD+IMD^tJ5yKcecC0LYh?s zI<4|97~Pg$j{C9IUXEJCnMgkA+OM9%N2DAHIlV=sbp3T zNNO|X&d^_5O=kLBWo#y|nr`_I^{-!qMI( zD=ciI+khZKi_Zb>4WG4~(FXS08HH=eu6#5Xk%}$s-BG%7%l5d1Ut7QFkF_i5iYD5l zwHl@Yo{dRzvWge8f;nyNFKgv1EQ?M4fxR_5z;~WUGlU;^AKgLWMH-SLkYm5u9It_z zZVpOs1cIR@R=`-os=p8olrg^Ww0aGx|>MhRh#m*cyR9b(; zuUNQgZzW@zq)T#WJj&tL5Vm`v_F-Q#b}PqxzN#FuMIfL<(@zg~biCRk7v$sd5aqFv zKE5~-o!5-yeDr}CW(g#Q8m1^-0{}Nv)%N=!&umEFL$}UBaZzx#;A=raZp`rG4&CL? zC%D>l%r>($*rG<{P_@Uv*53@B+nd#I!Xg=$ae)3PB1m_u@g~9B=<%b~l)q zV<;spZO|Z{BlaVcyq8qEodV$r?aiPNXzDLb824}@^vlZ3#D(844;@*3v{J)7BI!a@ z?&UA*{3xCnz}W>(d{fdD9MRY-@1W+BT_w?)N$`2S)t}2@{V`_BfmqD z^TE$tv^^M*Ve6smeg0l4uO*6UPiXC%fa7IqhyCxS2P3!N3h>@1eumTFxb?fJ{|~ja z_P9D$%=&S)raG~KKfam$SVUD@_Ak@rYFAG|(TI}|@zJ7^JABNuvKoqBOr-Q|yo zXQk6xe!rNGj5!r_<9yYOEit&28r0Jhz3!~^D3a~UC7QpE?w&AuM=IA~8HiRXh;W+zU+aOL%$N7znSoS&1f3Wc*JHaCFzsSWulPJnR;2vL}r4 z%5%e)O^WS5IPKJwNm@mCn%U{rjLNaf|li5q>?MeLE5#7Psu zO@I?$Yxu9!@~(t0SWH!sc{*SvEh2$&hTZl%!@PSl=d~ZC#t4Mq`3RqC&^^#!Y~~F9 zy85S#Xhdhgj(ut<&L^)P14o%SbQ2CN2}^^s3@c*|mC zAoIl#lM$R`LZmB6%UUvWJl?apQ?JUAM)(bshpd^XJR1eJpQ)*)Le9YP<6)3 zJBJlYPybhxzby)Yyi$*?fWSb5hQ9!fwAae8<}Fy&oLbQ>jWI0+Dttu!g1Yx zRqfqJ!oC!70ulGfGI3|J3hVg*a{kua}le6>h*b^)HEGvOh_w4&@ zgz$tqS?^Q$^Ps?g85s*b?0fg8s>~YtpDWq!lC6)I(IQ~-fOJ`LebmW?<9H3N=brne z+Dg63d*)DBY4iO_EX49aNqk4I(TFmm6~5=%?OEKDSFveXQ2rJI7wCU*!LHRDU$KQi z6zJ5wEfDMIz*lV1sQUfWDw)Qdwm4&3$bK|B@csM{$r995l=K1){ZML?5mUBUa{m0+ z>=f+hr=YgH^kTwHa}AbZMvfV^ROP zHs04<)_lpJq=>4Z?x@5V0T)rZ#GTGagU27{uRWBtZzL@WHLQ)&U)of}S6o48Wgf%4 zKp-^oO*(b%?wzAI0v$Q+IKz$Dbj-`lJa&K0vUf({N<_!ohBv)g7w_f(69N0P+4e+W z@82Wxw>_sic`7d-9Z0c1QcO%+V)XE(%&Xtk9qTQlFNRb$wKW^URM<+2lRtjUkJjWz z&Dulfk^FTzup%FM$mQ@srOt4|`Q($J_c?Qab_=M*^rsu$5uPPiCsLT5nVFdeYYzFM zcY%qLU5irKdV2k&DuTu2vtp*3&1xw}myyGJe`y(+-@R$$cTvqtQml#fl26Y+R-A#1 zz%N@}z(J&K4M{){Z1{AsGoH7rz3GAX`D_+#;Aw9bEt|9sl-3fU3IgfU=PiNFQ<`IW zUH>VnDbfv(m7g8ocebYbIH84+)!s((Nu$A`AT5IInC|+~Cgw|vqeqN)JRH{j!Kij_ z=D~@&kaGH8o^U}?*JHmO;tiC7r?!fmFaM}@$GI)%kj5g~7iK%=@$%jcbKnK z8GF4@-xC%7d>~tU`|KNtWY7@+o5T1w;_vFotR7V7y9roH=vw5gNmW|PAUONwB<2CC z8)lwD^D~FdlS=sfbqd}Pjr@1If(Y0%U+Fz#0bT6K{atLxafL$lRK;8^{R1vNp+qm7 zu3zbU_>#52tnB+gj(@kcMHYt*LaJ$?2}O0MbQA&X0Ns$FF_-A`OR`W`wcv@0`3 zuTU{LZYlW0pHW1`PQ4veN-t-!vixGHUA2w`AwwHAT}V{a7lEL!BYI$Y;@ zB!7R_?+hFec6^PhEdDwO48xshCNDof#%zy~%qr8@Q(xQ;N9@RE0RA|>L;Mv*5L7vP ziM&KSkt`zAgBl7H6K{KoRL500Z56b7N^YT0J_K;#FjCVm=#p{oad>#cOY^Y?D-ML# zjDcADjeFg?h2K06OA>~~I}0+IMMSjsS4RS=m$=CYu3_1x`6OeCwR~`qJPhe6*qVA( zX95tly3dZ2u~CNU8@EcDWz zoAQ$EEpzesus%)+Y*vJzs7+kb5d^X{)u~^11ob~_5HQAR2^Ak|1K^EiBBy+iyoFg= zpy9i{{qjdf#%$LFw)s9A;zJkd_>aHkaZusN9?Io5+h$amP704XbJLigcoqRRskSo+;y&)-65S&t{VVXOZU;bOW0$y8I6MU4%V z=7W0K7NDK@Q|E%V4Z&$Be?mW&2=bAcnOI)syy8G5(7)+V4FHpL2MVivof`k);m644 z<{22R7}L;$2@8!rEy3e(lJh)hOS8KO=NaAqLQLn0z>hQ9RnCBT?jp6_4|y*N9F z7%n#s%$>RnO=H+Ov8x^LJvw<8b#WVD5Wv@)L*C96+Mij1a>@@lDZT0My$aO#XHoy9 zxU|+xxou$ES-KgEV}9OmR_0T$j>(VUuNjJu4FY6g~Y99+;{fWc{czt-e4lgBzBNSkGcrvbcKQYYg zW`^dn$52Q}V~yiX?px>m)_VecGW_rRJ(f%v}sibA?tqBD3Gs?`lr0!sQD zxUW!96GPv{TR4>FZZ#4CnU{3lw=6*D_n(wbPUk3%#E@33xp-=>y-;<#;RA_g#a8nb zR-pcrzmGVt%pEZW{TkTw+l~dFuD7noulCjWDxoJexP18XUv!_-DF8#~OPzkp z9``zlv0#TJya#|}p3K%Ha=PC}Y%(Haxm0h&q=dOC6T>7fNtXWS^0xmZc@EY?X(Y-}nB6qhGA zILfU+*&OxaeJ>IJ`j|(IQG%ST>>pTLwTn9l3jV12mK+84K7lZgpnj$;l*-X8mWPCZ z`kX+)n+eBbZ?>D0Cqve7p&8I%PLC8^bPO+4#Dl}HRpX8eljxCNh)p#hbX&2gNmSZ8 z?c!T>YOk{>J*}@LY{H(Iyg*#{VS@CTDRh-;I`!{KBf8E)8%b}2l{^S^QHV&4@fPDr zQWI8@Uex%9qfIwpiho~j0T&>wY86s*c_9?0ek)U+8hRg>K-@U@*~{?S^%HXqFTfUy zuUcAK=GHwR339N|l*;4y`f<7!Sgdm%(};0uwn`6klOZX6smB#6ml%-oM+}D2X7z zZ!a<3V0aTb@M*h1F!n6$+QG2EmZflm2=acpF7?} z5Ho!H9m}(%{@k|`BF8q|ks#<%U%2>J7AZ8O^0wTvjsTLa&>F3~oQ(t0CiFU*E7jMM z%=l(uS}%Mr^fPri?us&yra*T?Sw;he;5;prfOA+5i<6VV7CUWv@uOS2CB5_Hg@%8p z3hhhCGP+_gQaHtp55E8dWpLbc_3r5VjeD4bAOPEjKm$9W$Y4k`)##UBc$0( zXmMq~{7m+gAASv~uNNKsSgjB70F(rJ6Iisl;cpBzhVn6kBc;>HZiV?8cP9i?4$EK1 zzp?N+`cj0oEC^zZic2M9Bva_EXQlqA92yeo-AvlN?;3LpfxJ4Cw$YB4Yx0k~ilQlE zR3TRwSAAUK;9if%<&yjY0Q=r_JC)BN_r(MBPKtf*@EYR)-`;XcRa_y`oyddX?Ch*@ z@=e%2Irg~Rwdr4a0^9=#d%xRnLg##h~tPTMD=EoAE!;KODyfUFeN zf6~#>mZI>CclCiNNCA<>XXsi8<)eHLrVD}ojc~WKLlKrS z$zY1OxyC+_v==sToa#mj#OuqUv>%|e@YSxlLg`Y>U;9*YrF}^SWfM`syEG0FU{J<+ zFtV$DneeZd)XZ&`=mHR2CFPrDEjHPP z-v9Z>`s(#t9NV3_`A80{peAg`6pscSqIOJl43xZ0ldr%?(QrFe%+=6iC^uysD%fYI z>-V{78o_HBQ#IPh{1sV}GMh9!*o!Oo0Lgn_8!~h4atjKA@z%zTu+D}@Mt+<0QIwkI zkDKaE&ikjKS*zm(2Tb&5$|oW`8p73zTL}$XZnj`?ID+sH4apDH z52ubgz53z{?21RV(Ts0C+b@G_(=G5d4AH<2xzL==cG+MYt$=eE#cGR;dGmbacG7IJ zNlq}Cxp}V9=JRlifr~EO_)(Rz;VHN(|K@pvg4b{fkYcx3BU%t-{3FC&>XsPkuzPT+ z_vpKa6{|M4d^(~yp-rHE{qJP!kF+$5mMR`j{o%U~xwD`A>Rjww%GuWF&@IYFUMm;r zJFSmyc1nCl(<5*NohnM>lAftP4Sl&(pkOfYS<~nHEt6n@K`8@txlWFen0M>mm=*nW z*(e^h(YKEB(%esYYr=+dy%}KEZlO6O9icoMcyBdH-o8TdLqUPX0rt6T@Gpy#`zZPu zV)`9!Qv~0~Dg$UWu&wy&H=j`+rYgs%&{L3?u)U-xHs++fG5bd(`?34F2H&bZ3)v9H<>Og4z zM$UU%npEJKZgTMn(QXbWAG;Um*SO#X`J21}erRK~9635*X-nxi@J(b*dD(3tuUAW!3iFxy*Rj#%cu?I``q)w(z}{uv(^zNz``nCTXPj^ z_=u%dFaHceKk`Nzs8F(%&RqV6HT*IQqyz=vm%8Q(k+J@==1J}Nk^Z5dtt%A;pc;A^ z(e>Hk>NqV!p(W+jc0lf2zl4jtT!T0&{+-lFlBsMRXoZv99xi&WsU_@zzBZVT+E+8> zu7s$y$jImAv)K1;|95f+fQ?OcOD_gt6?Wy7^XxH(nyW@aL@b7U%>tF$xk=3+K%D^1 z6f(6L{mm`_uk~JQdv(SGVKe1+q9D5sE;zs07X2&I-Ip~Ayx(7)+c7d<_1B?T;Ore&_9y1ir}zfKXMzWqn&q%_s&nKe+yy; z^Fy7$6tAmKP+4SOI6!{?e7k8mu)lxP(9rO%>^{a;S|$2K^_SRGSq}j~ z2Vk;!N?HyI@_2>0gZdLFr?9a83{*3b-UhT55CYHAQrax7s?_mUe*o42I2j!_&hZIN z`&`;Jpn3>NF3=W@GpcO4fRDTjjeJs4Qdt`5#chESv#2^IaB>V*OD}fMwTy<77aTBu z;TYQSDCRYIK!e5p!PocndeVt|mj`RA5sd%G-djdh*?#Y$m?#QZbQy$nNJuLvu%x>| zrCYi|MNy<=(T#v~NH?e;NOzY?=b{(Qp3nQfzy1Hcdz_Ew!#QK@^})fA#fs;-?|IL8 zUDupfh&_GRSW;W9sCSSg;HNP7G0*NnQswCEj`Q)oYkocJob=~Gpv1v(m%#pBuLpB0 zFsJn(K9qX$L<|H|PtCP><%8)M8Odl2o+q85ii(a+e)AwH94iZHdQ))0mCybP6-tkD z&oV(@`g|Dm}YZ%-y5RX9rtyo{qGsXElJ~1yMP%}V36Ou_D9#<)P(Gc89#rf$* z%$na*R9k5EWZ0|-UqTZ=>i24|q`W_Beb+t^cw-_3nm(YoltU-NVnt8Kr3#uOnOtaBxA-flmEzv4G z;Up`;)TipcAzMEbq6MC?u84XkEyshN`-WGSOl(N9q0{!i=yLJ^!ESUQx z6B0caTEe_z#_~6kX+-KUbJd7C>X7sdU=1*s{;8!7eUpV8?X}+^!~|UWDfklId(T#e ztQMyIGg}Uh&&;*tR^3|1g>0dKc0kf9_Jl~2CUuRqqov8-+7y^?Z*KG+M8hBTt*!y$ z^*&(#C08BA3<~Fd{2jT6cQLyfL`S#x&tfutmEWu*>T&Xc2e zr#(@%!@p{XV1kAuvcbM)K9zOX>+(2B@cky<^rwB)`7gb^!E68u?@W(~XVAN63reoX zSHv&eqV=YO{*mpG!1=CPd}v={DbcC^){1R=25nHMzVi5%nhoOPy!bODlG*+9%@wf= zxBmX;W3~8^X$ufK8~0#X05vG?{9z~Gci&g=qLF(wSNWVLc4OjuGCA>mekmh&B8D4j zH=*GYa&*yCIn#p=v72K&mJMgmzI*e$`L?9P!q}}k!gn9_$-|vD%$U3Qu)W$>Za4Xp zJi~c8+pZG(dQKhbwsOL3HSSOye1TLLdcE*Yq}87(50Zn9=Hbi}A_ST@Gc&so{JsH( zUqW_-2mK3%a_+JhZcWdX0KEkX*;fFrJF$KPv}d_J_7seqz<+5m|HsGU z)US4mysOoaecqUs{?AvvA|@pQUvvg|=smI;x1;koU8Ppp9wO-P&sLWgzGP}sFpmx1 z1`^&kFbW3;+5eH8d*n>#Cq|5`=+y|H9Ek$u_uLxq=axwuEI=(MyO1YHgN!;u9EL7 zt@2)6zv$}nW?KCb+`;V~-TOF639?jSjGOKvH2Ambc$qL8z8zR@Mc+bZ6T=tTY3U{) z-aKQLOyffHL)9zCLSdFKxf+sTAy0CoPY(KiC1AaL+Ja$oj~+|j0qz|$DS4B3^*T6a zoVspc0O~<1;{NPUriw?0A~LZ0_I|ZS<|CvDsGORZ`fwDW@qBx+|63T!;4`&LN{Z-h zdU|5jEHyE}u{QQUUi@ddA`3SfzN|fbS-h&qXZbe|V@_KvX?6AXf;O1Z;Zd@KM}XhM zM=rEL#@}RGJOe7}^C^?~iZ$j$eK}^Y&~)DLJX%ry%EY-m0FjaK*4S8=;^De^C_*Xb zWu`L0NW8^Gj-${#c4gn~aS~*3y1G<2V^8Uf6qDGIPw`WJd1){o`#uYSDKM_sx z|7@uL{Io}B%G^~Zl}AbS*KZlGJPEt|>KfgXY3#HAJmp`1#xp;QJ@xOXJ) zKdbq_e>!&s`riKcrv5))MhWNtr+-Y;j5%`?E-qe{cG>D5&^vx9&3g+oXlEB|#S-ei z2F5zCEo)w&7WO(l#buLrbNnE(PT*JBZ6bSKr~gVFALJfb!t>+BY1xeJWt+>E#gQQX#lCYk1TTf8t;T3X9^8KQOl z(ZLKH)cKm*ZZDkeee?1TDU(|!l#8?h^Ttd7qzgjAtAO5zRprqe#c*M%HIZdwoJfU( zldTm&Drj6j<_P^jhUtqH^k;D#YSaC=!gTrX_-OM83!j1FUh4YM*Mp3+I4>RXi^llH zV1v;nQVIf_VVz*wpG5{r;s}caepn{ZQ5jx^oHsA@7Xkp&`!WdFa(AID3C`CbD+7~femr@7(f{x!` z3|+oTMg**Inhdr7C!cUao$H`oTKN4IpoUhRi7IvHwgeu0H@BYn9RPcy1Uv}~| zf{7VWqbkmF$(GWk-W;m15ao5T39rb3&pA{+aRyAJ!nM*CZ1kh;PUEoY)^?zCfBsqc z{TfC%w&*5=f*j({M)*?sy!SZ(6N|V|pa;zrHUASVYMyKyxM(__#Sbwpq`s=zc}G+f zMstK#v}HxmRS)Dmfa&)`7C^1N0D|E2M3s?$+S=9&Me}hOSn+K4ryn%lK(hR6@pF;V zlE=Xg{tm(B@JqjC7FLU|j>BRqIU0JIo*T&G${l?JL>dkb<=jXLD7%%GV2s#Hlrq(H zZ7|kX6&h6a7m!tikMHSMa6L`@u1ts){T0%$P44*cT0h6s`Y~~!2sKk8pk?rW1zi|_ z9me-}F;0H>&pZaW_-h?*aN)^hg{z{mFtNgMLd-b032?ew4+uN8&X#1DC`-;(#)O%* zjJX@a8BZ!?NeNRn&ft)b47`K)w;NDhrM~0OG#7Kj>mhqZr5>HV`1}&lD`?qqaIE;I zn{|03IiME8mz2mz4HoAwB{=8`B)}e9F;7PmltR?VmIn;fg@*dosS^r6DAiv3`Pqul zaQ^pN$uJpQ_165DFRN?eurzWJ)^h{kV7u6_iby+Hx7kHG>QO?-p80F_m6W)Ezxn|) zAZ!-{^1nOQdF*|7c8B36blC%+5XJqBo5ey4)ca)bf)g6Tv-!RN0t(|B{Sv&LRTnpb zR%w6jA?RosTqjV1ixVe^2?im@eWyci7?T1CS7Cz_r2kV4!$ml+74N)D3bFEp)Ak3X zrjVz>UbN=m;CN6~%34y&dh6Ub_-~DmHo!fvI|sAfRTO&(3X`EPwwDn7Yw9qUP1$Y(M^33gQvrVjpbfPymD~@mq5RTETiQ$YM$3}k3o<~16^J) zTp#dk+h{K2vb}uw3R=`b2x{^Ca-`9v>GKa5?G`p1i7AbsP(HJdl>q&3InCMyU_Ty0 z8zeNPH%;h@uzbk?Xv?&>^6mF2{ngovI7;^vjU$20hW22WtzAY?$E%dD2GfZC0tWK$ zO9F&}*v%`yz*7JL^`Qmwd2DRfQA zw1z)+c|=>fGUN|@YZQkW{SIdQHB{pEV`cO+4j_g+Pe_4_1CweR=0n7vY8IUr)30s- zjueqeeXDQ$-OycgS6`1SC0$^WA4HmpWt1+*hv(ouzM3qt!2-yro`ef~?NxeVhMRml z8=#>&>N#rWx{fW}s;j~ql=oc%!Y4N}?1DocN88K3XSp$tWW>`cp$sQyaFF!`5SDS^ zbza9@A;UGc4NW8|-$gY8scS@BNkz?*V6?3}RW_PQ7}EDUjhK9WVV@-+A- zH&twsgyU@;!O;rj@);b2#Do&``AQYYLnL4b4x&W?V%j$Z$RX@x;81B9X3XT&S-_W& z?ifqW?1**_<3nyZz#Dhs-9Nwn$~_$M@%692dW&IMzYU#|*{Ou1eTX;Xo%i{mN1$(e z{rYux(kp!Jyj2_haEN`pCg;zWnD<|9jbwWS?|ACPj9R+f3MUjcIA8sgO*oBuG(J!A z0b~H;Dn!DLqb|2~SjCJ0(~$h0`E~kHef=HKUQ;ZOJ70kDFdW8X+ySJ#7p5A66d3Q@ zAIMoNyakxUQe*DhX?rWHC4j{@KzfP~x@X&i4&h?ciL*E`3{?Cr#&xg7amV?@tL8=? z1=02?V9Qj>2{5+5lp|0s0C+{+e|AHA0Gj4V5DnRiI;%+9uY9bwA)E%;91Kr6tV zik)S__potb6xGKTOmsp*5b&DynD0iGqqVqA@^Rmae$6q}Gyy*jyZsanDW}KBwyQt; zv(+C@PI%WtpND*cQ0Rdk9M&$tAjrk<`~WKV#mYXb$I-s(@8f%1T*%G@sQ(#g&Y=Y2 zYw9)|E*q^iU_WHjk#KP_3>x)>7zU{%xTtth3V2Y0aLh-Fw#8QPzw&9R-z1cAJf3@h z-r8$?WY32K6y_0-VgWnEZ0lI`Q?4G6{4jFw#H}t`F}3gklzb4KaJqUAL_tuX(Yx1Vdw4yCHaFy2 zgSB*^(w&`&ED6Q_2yz~a!C8`&zO=p!;q2ZCcbi)m9x7{J$re+&_J_VsG|zpSp0Bz6 z$|uYq{G2cs;4YtFzq;wsiACjseNvWNNeg(!eSkEE6$Rr()xn{oV|B$fev3EA;6a_u z9iz#kayiy;rWyK$y*cvhp^Pf`j5{I?36$8j9=xcTykZ^NvE?P#_h6d7igjTDpl{@Det^3pWxgNKY}L-Q8v+y z8+S% z#-D`UBI)1-KR>_u>M|qP9J{A7q%f&6rGN6-X9gR4&OFRF9~^vgF0pq6lE)AAGnM!Q zDTHO3Lm7f?g-?zTV7BmV`>5gsj?>b}tsdoy-{;Ps&y=mo+Ys>_SoAcR+aec!{(fxi zgG3f$%jk&V|7!d+e~)qdTZq62>$cmDEuVExy~RlCr`m-f3A3JRqwU&e!=A0^&8^Kp zqPP2-Bl=bCjb$VJr5o=C6aHeAw;b%J|X%rfYsobk6 z^oWzgnSD=-v%)HwI^WD=Tw5Kmr8n4jJ{20-tJY#ShjgfkiH)nh_P5Lenu^R?olr_X zZjL#pw^@|Z<#Nw&FPehas2@`c07UJxRSd zStc2_^kt^gq*dcjTu}pYSeSDk9f@k|0zuQeu_~LkZ2gK8C=!^a#XE=Q7zu zkga=_bL{m=L%ZgT?{D!&Km{o$>+0gN2xH0dAoZBq9m*SbcU;&YLMa`TvIb&h(-Z>9 z_)twju9?zvP7ZWE<_xqFZNo$uQxXkEfr4Rboe zi>_m&bvc?fS?!fP+3NjUWScigNmEl2np6wKG*Rrcg18@d|MU{DXmQlv-Ru`5Bt|uk+ULuIgq##$d$UH#v$J9vLkJ*vy-C%kVV6lC2 zeuoSFbND%ihdvpmw!UOF1Yg8Mle4hgq|0jYE?-uHIjDUZ&xDOy7nx8aMRPBq*XgP1 zalP2NeklD^^RK(u@SpvA~;?mYTY%Rcem> zg6VugzpH*57;(MT>W6OWQoN1!NcMbko*WaQk{ZKdCVXlEuAbw-lV@31r(^F)I`JIk zgcJl1+U%O`zPH80#}8Eb&jPn-XbdpEDva++{nUMBWK*+YAZI)SdX`$2Qp>zf3|!-Q z^(&NI!Kj_1FSI zL-7Whwl22wAaF{VL<&zwhbs%dnK|q}r8F5bv%UIvC**|ZrrS3Y*1ev`AAo;V1Z_B@ zt{8nN3cTOu=YDw4!xt=e7&g}hie_Nx^2LkYZJM((mk)vaRdtSt@!kF_qxr#S?zt6AvrS zXfYm(9Wm6bWi8E{)>-%E@<_E@z5MLjL71Z&?6jh<^XAPP(tHs8J*!UOw5aV!tTRm* zw#U|Lz3vcW4q_-40OjLh@bdV&`ejB>q&}~yrV6R)E$>+Y4 z(>Rp&*<*K`w$GX1*UWo)!7C)so;@SKH!#LpXvFGbN1^fzsvZhI>RVb{}69F#(UhSMi9+e)oO)y1=jBn`h5sY7d0WzPr0lpw>LAypDX0 zMWoNJM^hJ&*(dYTeERg`YagF*7?pekF~XpNZtpcKS>iVP-aZ?RtIc%42)`mEt)h$MCKObt4^fQg@%42 z^#&0v(GEwxiHahJZr2tCao6k`(y8A2gDqZjeZ9wt@QVler1|W&w*AC?$2aWetnW|doWeOw2NCg)3mf67K#XQ; z4-zz<)SIY%`El(gGs@_Rwu!mvE=pH6amUBWTH9i<4~6bqZlzxwoZGu04|1qJK3%s= zv6z$MZiE{t#*Ov4{kUr$=f?C0;7nwz=aXS3>rNg(;uc1`z0_O3*t|a79J(+i z!1H&4^C8?K(1?)wEUB`#%>FZ#)byc6FCFRa#Tdc+Eb+SNY4?@N?pLa}#BSP52w}`X z-BoPeo(Ln1{yyCED_)=5Aj^N}#rNdfw{L2#@~(;9yBC!MPDH&98(eg2w2ayl1!a5F zkCND9c;&i|kidUp^35q4V%g)(G|qtvcdYA8b#Na~W+Cy4{v1SivmUY}Mx{sbq0M`m zAJ?|mhF?x8l1MEg3muF@q|uemE8yOkU@{;VU@ywT(v~q;c5-D!^o53;To9OkWYr!X zD$lfq=%R~HzCNoUJQiszpzx2cYBOLiu~3anF)&BX7SKz7w1Jbi#Cn@XtH7b4(s}7F z14EP4($CmA;VDn|LL%*;dj1&Pt4gU-&vNcnKHv;(P9?k7PUgp~b~l?4Z?;S;p_wj4 zEq7OSs_}9!RN>FZ__RL|9dr%ZXlwdMvS=Ie9J#GcH8n0JOgasu(nu@>PtImPIL1yD zA7y}i{qbZlB|9ohvE~EhT8$bEu-0<5%jg&zIVD={r1#dAQ13C6Ut6z3GFb}Ry`+Lp zuC`K}Q6)@G>>8o;o40SxwxUqzwtIAg`PdNM?Q2D{f=+GH76aB{v`02iZ9dDz3v?`f zc=Ft1VAtj*czmoSKDW>+jpI)cwen#0U0^LV=`^mU=HJKFEq~FxTL&8q*(7BXZoR8V zC|K$u78`!0mO7tcyvJSrax?FpW&Wgx;u2Y?UNr%yG3FM>8|-=wvj-85d*jt+)mZH0 zT;O0LZ=OxjgnD}$)i6Z5!1O`Sg#OlPwBir{;R!wPl&6g@qSh`qZnmsWfK*9HNQj7> z+`Jn54fmX-@#;UGs%vhjaHjA|M@|OaHKEzhPT-nSHW_I?msbNA6$%lB#X*Ra@Zfta)vwN#=d=bxMqk-~k9FuC6X<5ka z$9AY$%>|Y}aFn*lxx}LneqBYUJ_&Eh{LSE)8^O?6K_lW{Zb)sQS+*}9ckEYZ^m%Ym|uuMN6?JJwyc1ZE`kZ7?@~? zkH1P?*n~W~4;FN;ZW#*vjQW#q-N~gs9g>qz$f%U6@OH!Knvm&YqWkgUNNzspWW!(? z?(dWy)jYb9XwO4Cy-;M-E#GFPY0XIEC46x`{)~$&~*MdNAl!mvxh93YN1Qq!1YihLQP)rY=v=@7W9YLe-T3w z5elaqylc*D1uMqiYATRx{oIU-1QXD_cJ0!o_^}F=GzSE2)S`oB?J{NMUu5s*xwn_T zzp*L5-6@K7_?7gI*J_xJkWgN??ss}nyqh^hl&x2RX2HoZj^ro zcEh{2OrzJ|u1afYL^aArJ#Tx-yK(T4Nr~1j`GPiA^^s8Ph!5^5C4$izYM~1pdfNN8 z_l(`6d0HTydc(m{>I{5^h z6iEWrx>MrFm3La1NY|~xYKD`EI+gG5@R?i=vSz}*foU>#w&(dD07}M_cuBcQlAoAF z(W67P)e$oxd}3PmOq2RpAX)*c+el`Sl?RqCl>BK>g-D~%S78G;eaO2joICZwCo6*1 z(R5M^T#AdUte=;diL!(HqGvvGXM`&~uctdU&~l1c96DbCH|qy1w9*kWp$vijo&Mf~ zJu}%e7;pVZHhm;_+d4>W4TpSNHs*dy)OSWUE<+dX?Iq9D{cRC+`rJi)N^Tt_lk)D) z-+wmtUTTJll5$zE%;-rvY{AEx^sXC*El`C*p5ENqsUvdO_i#tXbsJOfy`2^sO1rsr zeYnuL`}^a%rJfn)4QyRLd=m?BZL+ho>zltSu9Bx?Ru%k@`TN)GY|qgMCcQ0js-3mI zSK`!e8@qlj5sYSX1PU#(b;q?TJ^qAZF+3)pz;Koswb)k>2syK{^LVjYFKPY}W<0o1 zXV)k~AmSzm%58T|Kem~X)}9yD>^4xm+jkC~OyR}XpJ`zOnL+a~e+_6!&1g9du&nZ(10y5uBnn)+v1idJd(n^&k zajojvw0xVna^Z?yJ6dzDQ=eOeP@7uhaL|S7coW}dGlHt|*x7WDsd1%IGE2qAbS&!G zi1$}voc=RKuXB7s7X8ub|OF9b4_ywpAkwEkH&$o&WyT# zLzeaPVlxspy#atBX;DW9UKX2`H2Qwqnp1T?55OS)IiqS8Utg^*Gvr8bp;AbKT-vm$ zLl_BFu#hqzX9taxTSvEdWDMEaGiT+;@b&kZ6*+Fr+eXWLf@*wKxwi&8A&5=|kVH~* zc72LLqAAcQD@CYtai)1Q53VoS3NIy^PI*>_O%3CzlO7?Grz~AtJLuSQ5J2Eg+3y>u zO$5ab*o>L4<}f;$K>&&n4db zTEu2V!>aa}X<+FKt@Ikyp>U2BY0hp9*98<3|GuY~05t^EX5Wp+Lpx8Os%NlzFRyzu za~&3-_4q;aAeWibNq-E+c>sMx9r+j@l)rfhk=+31ztTBz!T@ zbkM?#`Mb$(X|*#Z!8_G}z-6~<){R;iFN~I7AT4NJgQdy)Peb$FR-|s3D#^WE0R>^v z97`B2*dEF4ZPw9DIZZLc&sl0E$>766YBmg>P;}8n>Jn|caSAf@q2MoJC38>IxKAPc z1v7EBBfthFhOXkJGSYpLYaLTOjb)2g9SU1C6E_pVkc8B=a;hz6~ z>EMIxncqGE?%R8bl$4Zx%l`CCsx9rSRyyS_nsBa#8xlA{&X&<{7usxCodAbBm$8dB zxaO)Cv5SU=-M1PUa}}k?2g(`o$kbpJbzXfwJmc%vo6$09F6Z`%T?Ve&10n;Parm-Ct;>Szm9+!RT!>);n>5;bY%Nq;NI=nU z`ezy?e<6}QZ_B>pMT$IBPeKju1;94`dgvKYO9q*>j|9SUj0PAok8jfBo>Fwl5-$pk z=c#aWI^~ReIIS!?F)N>PS5CM9$$}lVh$%eHNBz z!#jnvFPax)AZa0H*3v-W05}!F$uWBt$kNP?&ZZ;UK{U(_OccK_Sq`K zg(vYsjuLr!(fyy51!IjOSoQBfVuVQ{DI`RS^pkp(J4r5I-1SxS)%XXN{5mVN=6y~# zE{(hIWY-27ASTl78-FD$dyuRQEh#=tTHkNeOf+q!zCV8p1xdYm&TEzX4*$^tlwQ4Y z!w?YixjgI13JN1lnne4Jkg(q?b1O;^VP5?fc?adLr1n7JA(Zq5BNBh5!Qilm^HM{j z&@vpc(M*1fhs1WZR&Zjps6J-!UEro|=5#cVUlaIzT`zrW&m_=N1RqAK8|3O%b!(hZ z*rW!i(DQE0x(>PsyDrM$FHiQGR{-=$cs(73wwwK#2g&oMW(}4$+9xoQRX?{gmN%$) zb=aP`Wp2z>HBUtkf3ZJ=mP)`wC0i|D{l$wfUZkQuOj5)BJVjvd{t3{c#g6d|o7I1g zp6Y!rV~O=k{I7Ht z=3|(Cai5erRaq(ozl9UM1n-N*hS?b~W>SMw6S0fuG1utK>WC?!2wZNE6|s6+oyele z1t?B*qkL5IHbrU1aAe}bQ8k9FRa{)0$GMijJ_@ovfHtFUI=)K%(;Rwbn}Vb7f=jfJ znM~@_!S~me#%!QOwHhmyok;IQa`h~&A8x`V?79Om?1i>@b)jssIbIqmK=Uy?Q#E2V zH@YC+@W546&DYah=t&Ew1+OQmOC(3eVO3y1#ARaFy&~xBxUK2g+7{TIsZ@~+!4Zkf z6`S4zUEhv!M=I+&b-MryphLCCcoJt)LBnw7tWa!6wbExhPA}2Yk)K0SAzYtrJzp^E zaVx!8hC!eKELHdveSs<`JMmRdB6$OqK0hH!Uy<&KtMD)Oc*`GEE?H*Nm*hoNwfMN2 z_s5)0J6w4Pjv0vW>F?x86+rN^EfWZ7jxFM7`m@wjph^lfT0iPIMT?KbK2=D3rz#Cv zXIj-ub_Yf2P%vvs8sbu@FcN-@A9|P(VS;1$8*1vXV`8 zh!X7Q?NOT606Xxt53tpRS%F=}3-+`q`1mRqJzZ7!_@AX?)q<&o(ZQXrfrlEaA-?z*;5XP{J3!aG@(rc9eT=c#GInt z4@>L^^^i?~R{7+i`OjK+@vH&9lW0HbWwm@_|KYj1`M@wn)f6`(BZuaj`Pb98#<2!) z_i2Hh2zk9#E$5c4`)(DT3Xa{`PiF86CTbxfE)Jw5(%PeaYy>=5MeDSAThpW?)y#UL zOtjp$=0nJN%x-y~93aJ+BW6Gm&Cf5^efzEB_oXld#Dh?KN8>3Z8sx%GXxdEEkna+= z&-n|KSePEZVMM3GTD92v`H4wyS$w==Gx&JdzJjxVUA|A1>%v+#;mqaN)-5q+X5jM)-^QCl?wOiY4qGxsdAb_P3 z&27F#m~~)lm8)S!@BoN0+0Rl}?cX;+oa%#*HVAbPavB3qgeRQd`rCRvcC`A?Sus+Ky0bD= zp^l_(>NL*VtNp636Yi3rhU;lSiISa~1mw3ci)0c*`Jm_Opwm}9*Uf5@g$eFzgQn_$ zU%ltIMT2@R>&YgZf_7f{rOPLhzp4d4WR>pQ1JS$JQ)HRdOI3)94aGG!tV67%t(Qev1&z06$(pNKrr2xJ)(bqzZL6ZWvUt^8bGmFd zs?oB6_)+H)<8cYuXaQ-kuU7)9Nln?xuyrv@ZnBu?7{UBgHobPn9>)kfE2av(6}g+V zF(b|Jv*4d~FI5SSG|8Q@B}k%T+@Y5gT|}b6+6j{lf zH<{bEM_w^P)XwzXxJ}_GN4|DiE7ei+22}ZIyoTZwmE)Ib$|Yu%*@JioL-HaQ^CP~t+GQU z^}Jp4&4?APQjZeI8mvmjpjuR>59FaX{{l1}uoath(boqW!rJ*Nd3*H8xTS*M9IR;5= zE&bt_@SVuWlU?UmA0PXWWrMLsvJ)Vg)mjH8A2IcoIrGJmeV*EnKO?0Dxk$B~Y46LQ z7tZ10RPUe}}XqiRqcf)=aZedU=}VL}Id zniorI)$fseykn)^^6lHLQ$Y_PqIZ2gCEQ>5g9Iwh;*m5!DYjR7b%ETvW>k}}&BM3& zmT<^wETeX|J=&aTI*zHIA_it>#(3=<`iV(XK@3EqSbM@=3XpwIJ{p|)JMsMJ08VzA zt;ag4l{ABeZj*2sVOw^;-s^<{&I3~0<|^4N0LDW+$kH1hQOpyqto=1z5Y@x?xO^L- zTA{d;M)zgCbyNWER-!##_%Y33rrB1sR?r+IyFAW2H=sf+t_ZyS7|#rdXC#+jJOV1M zzt&0`pF%)^QF)}}2{{1&ty_JDg;kcjb&URR?qdze?|}z(cEoXol&q-5jRj1lQ|@BS zJ&VE*L`Pk#Q$IuJbUjDPU(uQ^?>0BOvYg;)Lno%h9}6afhq?Js*DLeM($A{KhA8-Cvi2tOiXpe(-tHeQ zun*=8>aEq?8U_QE(VuHd4QmyV08jZ7w<&}W=3)^bXUmYzdTbq-27);xZ%Z6`|3QFRPr>{KJFeEG=a9Amju(Sf zr(Nk))~$I)V9gXZ$WxhxgH!DUCD!7=%BbB(ADtp&Kj$yzkSqdIo&u#Hlf5yCQD=l| z^YiXKN)phTb+^ZsZDHz8m^}9#S|DN3<(rmIcr!ncJBkPAajZ>kCYXQpJlA>t_W24tkl3Oe+G7leq<2^%I zAGu!TDvf?F>{tycZ;1t87=638+kw^GqwGu7E!U>T2=Vd56DMWgz7bN*)8YRU_i^Uo zgO|vu1(60Yg~Ia$^JLjc<8NMI66yexPzNMSw(BfE+SAI=@+>ay5+t`zBH66M2&Esf zBy!DAup715yZ^OIeO|wItjDAkRvL$-7%b;`vu^-D?efpoTw~f4nPWh;MDx@r(aYZg zoPW?cW>Y?|<2U&a#g3nEsSP%`SgkJ>w3JSmufme9a5E%e!j`RB)`c_Y!L`U`qknxU)4+Bg<~PM zLzu^YpLWJww6k^Mv&*KyLhiXs-r=-?RKhZuN;T_f>|Jv}Bl^FIOHR8kzwvt zI`AB-nb&@(mRd3betLVP62?Y#0a6RtR%FNVb{XEZw?33t-A#_>j35)~9@qv<^=b;k z&#k`HQ%AL`5iF&_&7hnB-2qGRorDdb6%jyM;nV5;ELY{3_D#LGU_mB0HGh74_yio! zU+3|`xktfg)f}r^$mH<) zb%qlAIX$X%p*#w{LzS%5*bl^vITH9wz<_kG9^qrYzm*;-u*eUh+U$ug^3DV{cxF~j zraw!i&mB{9-KYi*cysLP(Z>BhjPOBWY(qF630p>`qj|Pg{|DQV$X!Z(ou$UvYAHOm zJgsy9&su>s@FiHaDQcT)lIQO71pi}kggMy;L4k1vF5zizhappxQWJqbLOtsbc`+E_ z5>O66MX!>faH_Up|L!*!VF-aThOnuKHLeO+hy5zN#1SC;tG;8oVZ}x8p@N zBXyS;^>W^8mG1s|yh8tyw#^Vvb@JE;sAh7j3ee+cbphSX=5LXxWV!#;X?ZN0$AWLj zQN{+)V2R7l!CPJqR>opf*FRp#)35s!7+cmndXNJRSeZGX8tci8g5Jcu4@51s%j0KW zN|8z$PzKs^TNIEGobd-2*JBxZ6GS|-KrFJ* z;HSJH=R7@xEh{+w@O1mqsk2{FrBHof%tkaC$-wKUEN`pd`CgqH_>#yxk=VsOH}Gm>X!#zQ0_iKv_VR#?>$|5TR+@$xyp%m^)U}M8gfL?s+4k>IE84hCo^fK zzCcsd1$Q6|dVX#a23=}FiqFxrafyV@Y*D@_MOSj;Ml+A)&j&Tz1F`JpeELy)m%O^0 zmD5+)^ot}^`;W@iQn7b}@<9WlQDHx$a(swc>TSf|@|uXklwDhLyE2g?84LoZ0`R|9 zL|)3P?FF4Qu_Hn6kdE{p!GWuj_oJgaRx)xXzdY71TM47($x=XDp>rjM~ z)h@GX<@a=(`57V$t8hTFB)iGQ)4Tt9T=LW!ZNm*?o8MnJ?7O?VI6x}I*s!IdZZj51 zOVqLylO#C1iFI{c?o%cpaASS_R{#ZAQ3}1YImcZ;KZ90%7!fsms^>rCZHJwV_)XE&^M1v6&UOK~GTJvuVQ(`^9cx?vU# zV5@QGuHxRtOo=A;cfEIic5oG6nrj+lX99B(wATrY$Df!s{hT3njb5qs$pkuMUo@V-^rGz(<&ss(Q zXn#v#V|w<|H-P!gw;dU(2J1|}T_$4r$lhoN#Lj@tP%_3hxS%2jik_H_DGhM!8Cdm< zpalZoabbe5W#*pO{zD-9AG@7^oXm5))c^1ZGn%6g3d;(@WvYc_qWHhV)((U%sKP(L zTCJx;Q4Fw!K;|lCgwQiha>9Wpn2Cak+29<65sFa-dak}kt_?TfWT5PRq(xop zc^@#0@g*vN_SX4$fYCxYh=~KdY8LrK5!GS55WyRkj2q8xLCO1L_k=Iry#)jfF}!9O zwVsud+RlK#EDj%dqf@E02k!!cLi?9U*I+K8TQ%J9czvh7922@M%>OY82}#ic%5_Ht zGHC7>57>FEH99pW;MRef&~&g8XazZ)3CSGcazZm|CC8MfY~nL`NsNe1Pl~UL9hX z^=qp^UoTVL$Za4vp;Z`gG-=gI9S?%E&gU#7i5M0UD=(El0ujgXp4*FpKQDa!a2Ngr zk(2{-W{j<^&bjYHay8|tf6dgb;lfIDpoA(ahyt;^`o%D0FvBsn1N32N*Z@u#4Vuh0 zP!i9G>>iK~mVo4}C9Zkq@$&4YenjmxQq#G*k;rG2BLaRzH71?AZlLYw`QpufCq(X% zpQG@5Q^2qgAwl2?%}5<03z#KwYIfg|QQ)X)8?1~yGepbO%y<&NIvO4aKsB~NtMJSA@ z09cWY=2mYM4 z%bj%00UdrLC0R?M=V_MO`Qnj9?G+;;i6Ez-&DW|p9Fz(?n()L8Jm0rLi)epKoG}k` zwTko*Ag{kkmpOthsJ~tP5eWRHaz`A{btj&nZ&r_#TM5G)34!E119TP0kq{$bRoat= zO7TtXE6H*{+Q;|o&q|@)l=Xn@3!YlNv3C$R+o8__VEKNQs${O#v45eF`|;L*zV{I; zrq_hWeKq;64>v31FkAu*Tos0WbFviKFMhwSbXfSHmOq?y&%~44YM+wm=Sl6je9jx^ z-+zqosd%+OOqny$39^h=4n#D{x8I>uF&%B0v$8@U)W_gFH6h*pU=ez;PjW z(kt3vyJ0V0(7FGU0pZl48EAyU*%s1Xz9TI0Y@)Urt(A@~vs4dS9_}j;x2W2o6KNtz ztSk^_N1rbH)9GCdRuE50%+&%_=>N2Lz)@&r%(J#7bgOxcY*!zDLsn*!i~@W#*vm4;+}`vI;3_KlJT68N5<$OPatfOEt?oHaYU{lR28qE>qA>&v8D zS)8TuN#}JgiOVoKUlxr~qZNwNxZE$Fdc0O~q}Yr$+Ph)A)>ECKS`Hz~k$!_wy))ZW z4c#cGUsqhZt#`-6A|uP-l3HATG~BaQB$1_5Ar{suOCKsByu|H6bdMHCiWEld^6FtR zqvAHz&jdHsULA%A`b>?a--r~6Leu#-4LNgqe`80Euf^Z;?xStH)Q~FyQlc1~aE3Pe zgcp&*31MndBwsz$ssySPstlOH%P8(!25Qrz$m%kjHS=c>x{BA(-|vrP=PA~^N$iY# z{CGvT#!c2cu__6Kx(L&^em!k|S(66e2}5DUTNg>kJLl!$b?=AT?#)Sp6|GE}Xf!DB z`+<5#`c4p9#Z%PIBb7`B#0$txhkP}Rw#2GejBfnH!oZ5)zI`)ZJpWP(oMj;?DJlIj zpHT}~r3YWd1E~d3(B}z=Ddf^|lvIv@$RH8>Fdmc-X&B$FVC9|V@_;e|vc68KJd;+y z+qg|8I?<_olK~Zpta+2sH|lJ6Ga4LOjsQp_pBEXsu#u~qT?xz~C`uWC>UvanT&e== zpL_YB06{)=Pbso9cl>(XaChj=q07&@U}|W6X5K%*Yzo*9NP=u>A(pKMgn7=X7T!u% zu3fvGA37o6^(V}@Qbav1aP6JxqVt*Y7d=y;%->Mk*&0P&uhq)gL(Jx>1F%YOj5(^|M;pZ%3y>m%rHe;SF|aDsw3@EeXQew)YNh-h2RD?to(Fb%c67)+rRjC3G`woBvc0 zvp5e$@KJ@~TUz@?EKJ5UuuSo&=s|eaT+J#)Z#K-0Wj}n34rA!7+BaJ~J0-R}tER$lZ`j-Q%)sIJ@G+Ip^e4QT z)}if+<*^ENH2+Wg<2W-3$@m$+&U`JWF4akk5m09I&()Z>pP%}3&-IUKwwao_N`A6T zw9eKjMw-X@xN|@CVf@|n!Y3J1{ublqaU`f$Kxjb9sSYb10RSL?)xQhYIy!-f6#J?c zO!FdWt2)UV;sH5Tvsz5vyLbDXdf8rO1-(ohA}T}1kqC2u=hOlNcs2% zbU{9)RpwPBayLqJpzhu^am$XQ-9zIKfiGXallX{P!yKmz(DZXe5JAt1-5h9-?=&I@ zA!wQ=)E=%vJ2U6&N?&}c45$jZBUH0A_Yx|dw;WukQ0_&ep=V8IrsUIHEzA`Hu%oK>Ka(UVAENG@egzWlTSAWwYNj)b6< zrx@jAE9tx7{ES9%q^soCWFV4j1X3RPgtQAVR@hFZ2{;yb$88PB+PiCID7-Sw&(6<^ zqIN(IjQJ`=E3FDD*r_Ge_KO*A+qQ#n=N$Vs%f0p-QK`{4{wfW7)8%>Wwg}N}-esJ+ z`crnSeoGpXI#Y(v-K`~yk^T%3y0p&eU!U&4<&;-u$WUqi(^v>ifTY6#pu7J}K&6GW zR+B5NVK^#!3hpYIh)^~4q<-I2^YjbPs=zQE=<;pie&nbX-S}lljI440vI+8aR=s5*w z66?d%wW%fuVHUG6Jf5TWNucjc(ek9V7_{Qj!>)|Cn^O=F5G;;X#kLoA50|*t+1~5= z7L<8vYBL^b+wEuu{4H>+xE-K5GCrvYiE(ON0#_+?44)18f|-Y8Q(xn+pP$4B9;QHp z<7TOC%Dx((7O`-pqe_|y--L8zZji0$AA67W%!At<{tZe6)q9y`p1f(#T|m)MEf+IN zFYVMUe)Y6B-DWWkB$O!hlhN{TwRS%s)3xe>46pO?We|>$%s$pn7X){qxv{K*;twOD>+O6t2-5^OZZ5@aY z86Z23LTXs3Ql+8aic?gz6r?^S&u6rz?EL~kMgnbis@kQieaM^J^$P$VrJggmS>IsR zxCE|RLv2Ziv#~bjuofF{T&)w0J+9XS+|d+j%>9*MBc$gU5m7l~j<08q!MRxitKHzq zg_8qppheM)fTc7*K!`%d#+#)VFg#?TM9YM9UTno)S=XXD77A&jdIj&^_4;w0IjC7U zjW2x3F<2<$(8rr!f9C!)PBArp>z(y^i*itI{i;R8muc;zU%F!7@te9hJR$$UBS^KZtQ;k&bIiZfxv60nTPV~w;#?>%tF(|>iA9G55zI*TYeXkRL!1?95ydGGKPu%ys z=Nxm4IaVm{sDN|{7%}fbYz=s1!{$cKmx5&&w@!qn0vn?+#+a7D`l9#m;NmN~T*H;` zrZ4_qbmk=U?*FNH2~zG;Ks@cY3|t~wQaVnm{DQg?RFw_HvSN^$egsB6_z1U^V|5Xo zpjO*_nt7$uN@34V|8JP>^FMU$`jdCW7REt>Lal~mamaBG762@`>>Htod|=J&Z;?%v zd*oIiRMvC{Dn)>YK(z4oLHm_^@j?^}2ns(;uXAQS(hY<d#n_Fl5kL;n@j~i-xiQ*F){6rdL6M%1Bi)7iCdV z(V+cF{=$ibYfT)%V$Bql-y>>zUvd8ove=p_^E*A-&_~var8^a1M>5Bnew*<)&R_xD z^+R>3%+6y;?yL#-(;Sn7%ot(A1kkY9!MPK5&jZB&;?W)nHzdYv4)f}QkuMW2wu7EP zBLSo!iol`A{131eMSnURVcyW^_@4F22YuN5y@3 zjJG4w=wWUE$-n6~i6ipFEwdvF+kOL}6rtM2J(c!rL*Ib(hdOj2lW47P1GyNt!O-;^ z0QJIfgkaLE{CqaRoOJau19v48``PxeOpkjD+CmfC_cSnm#Rk_|O9FTu-T93^10e6! z<)Wn7<>sa1ze>ExeSyu&g+}Z>@mEDCa0=Q$k=&EP9>=j&?rxQ+X#*$6af26U*x!WR z1PnEfS7-w8-7a}8IHFM{4Nsz6S2R^s+BqNXpKq)patV|um;eB<3qE__9lH`A8mi{Z z;k95oWMkm*zql4ufn5~p^6PyE^>lbwr4dWm= zBoR4u>G{DgkK(@eU!Ah4uw6#LsZIxFo3(Qinv*t|a0^ebjh49N!N9D?lB!5K#FY^5 z1(VlE0jZI{Y2u&2Wv>eRwNm!4IMxa3oNf zkRo~&NY*-VDLDTwuL__3^>3H5kPm~sPlI=BFEFn9rrlm~hm}|(E-4vs9SQIi@)x{QQD>INddl)EOz{VN!ptfUlU%bp!wU?I*sj9(Qde+kbua z{#o0{pWqc8ZA8mi;ka14Rr6pYZlW_MB{P1;e$~ltYh00yHu-~K*-8Xg!ojmaQ;Pn} zX!@$|Zs|t&@waxOQSnIS=!&iqS%7j%T3vny27p19J)T`}oT)Xxe29&e$ROXfz*dex$mJC*~l!Hn&>U6Z@ zgl)-_ll#C0rce|&C%d|nv)zA9l%l&^%3!n~O})kh?=$&LDh>`QN{5=OSsb39#n~LH z-+!>Xh0pS<5Kxt6DUwMO_PzCr&oI!p@TIz1H@T_<+p~ZY&o5ts#B{MtBrgXZ3ONKU zM0Ce8Q`Ggzxn4x+1{hR?(p4TVV<5^Mny}*qtf=x9RoxyjK7EP{Vc;eLtWii(r8RzQ ziO{X$subKa-#ROFG4Fa)rq76)Bny9N?gfV4UnAbswOS7f^g2zgSAn_lg12&&l12Ho z__97?psO6EoqlB^EIPk)_Qv5j%aONYVd-k#B&(2(x5>;=Ez;gL{a&xr_AI4bB7dk- zdY}IKvcB2H7Jr*$^w#5n2eaXB=`tjDLVcv?1l)KIH>V#*W$zd59$_~FVx#}z!{=5x ztgkR!C##nC5n;OCS%?sfH^qEY_96Gst-GhEKkLj?=0Nh$3%1COqD)t`W;E`g4wG(YxD5=jkr#FkOU!Ea) zCVY)S@$}GWpHU-iOIlFt}7ezjfcAh~F8vbZgYh!J~BG9p3>AGekT~5kH8` z9sI567WdTcdrnqoWEPTxv4u%Uh{tR^BtJju)*ToBG+B~DKRfMS;u*$LjiOemJLjhd z94-amK~xZnk|Pz8Mxkt)rYUaTytzE~;y_sdAeEblbKrSBfDyEadf!2{mr?VB#+q)r z4=Orx#TT2D^=7Fm#B_ymCThROYo*M2)%(30d(7z>PI0>-Ik!gZ#W?Pk$~u}jHHY{h ztsIaZTPC(|Rbz$LgZFs8+u9o+@f(QI(qL)f(t?bDLgQ?!l|oj;Ec{SH>NH3?%1s}Z ziZ9k071KIRmGENkk!bvQ$v@}0)L*|kX->vRm3_?ZNkO@Dts(S<)$+DAxZWBr*s%Is z+z(V@8)+dhu*P(^oVr$bd3tAa`T%94nybCnl-47tPQ`;5DlBTrr$qmUD>gVd$Zj;s z$Fpi}eioCTW8qbGgnpm!5Eq$yGPfm!p@FTTV$l^eG^>Fp$0&JN?!iSoXOe5ME34r9 zXjV5_@+eG#&Gx(Bq{MJ=Jjo-0Q?hgP&uk;c45T$NUlWI6{UG>f^5xn?WgbhmrS(ki ztMd=^zqoZ$D`xT({mpllU{YR7s%3pP7^th5B5uz&Q~<&nf*TW3#pX(#{yan#1Flu} zuZv1;D#ql*B^**yQ|IcRv*ZsJzEtv|ejaiknK5I{Dc_#YPsAK%y*eWq3hN9x(^_x-oA)ln#D4+%e^a=ojyUhpS01_gYalRG?P$r1Uz|@BW?4 z=Xm)Tp7uOw^WM$KU0BLQIc0qXirc(G>$@N-U###or%Wb?oG$*s)NX92``+_(y$A#$ zt9A#jn=Rw_dx)?w#eBsb@{f^kleX4G6P+Elf`(1Ok{di`+r*DCKHa&})|ae(9L63; zV$F$vJXPrhBfrXJe)y72jL>&4F4mY~1%_#As`+kM^4z-X>|Hj8bIbkVXFz!WZZ~MN zAs>yYDWSYw3AMA;+2dedWpZER*YNObew8J2vkIiCOx*{EA5SE~9{jsg-nIH3t!R7N zmGxGnv7p+CP8I4ZvxH|QQ(rS3>fHX+g+G#hgKvAOV2)y6Vx69S^HJRVuWrW(pgfTYS`7w#WYP+N z&^mhMVZvTu4W{ilgihr}%|+mYdzYN!Cj7tAizBpPk|#qNb=IUVvmN6u-&vPmKE_Ea z?`@Q=6Equ(_JBZu*_0Y6grD}VKfS&EiP>Z|I-;Lb+ECi8Re3#CI&1Spv9kCEEU~fE zF-k#YXT8}M#pZ)j`tkV>ST(l#e^K|OdGJRMkQzU$t5Ya6x{c7X+y>~qi^iw5jc(Re z-10gi+aOP~jT}tE+ETk}%iWd|#%~6IL+7DFcJ@)=ItT1knC>UV7?u5E5}AJ?Yf&K! zS|SAv$wSZAezu1!^Cpc<^Jln^WB(n(Om@(i-bN@?*enVw7v%ohEi%@wwu_`eIJ`T; zaG7fV&9=%v)Bq~#ZR}gP)hvJh{F!yxpgpTo=(EwNe3)1|v3ge7ZVqH2(Lvf^7!=A3 zzM+qJNmxXJgCdmBAs@Of7yNL}ag7Dat4C4GUA&)mv3U{smRBOEfs}}r>A60b<+>d< zzr*wNnv&LA{jM|>%wR5f)I?hxxEE)KHxblybcWmg)=mefSS;FyJ|*@rRIb{0%1#K@ z;`0}6*ATfg)ilWbr+rO#Af*^vt}YDjczap%=_7fd_2AY$mUBmqZ2^2@Qp2{9l5C8n zC|2Fs#Z6Brbmn00n@tKDtZ>yIi?sh%I1lwo>~>r$wl+t12Gxt5_(#k~1476yjf|r? z3bC&ncP=}UWI+lQl*on!F}gE~F)(;7stBVSo_)4P6)}*k{L1=1d}CE31X+`pcJOLG zkFWyk#Gc$<%4JkF3I<@ff z5BZLrNkVFR#T2VM-f;`9{GTs`0N0b<85OMyG&Ltk3xQRh!dR*lB_-!&u`lWxU5a93^4h)E-C7%=Sll?rnJY9>tRe-< z%?pqk`&t`{>t*yYXn{#{ikPmpL5ZkChuza2fuF^Nqa`d$GEp45r9s^>$8dbB3m}H_ z+FJf>O;%uMC^P)n-*jZ$dm|}F$jB5GsrK>aX)VishD6xoC%U;z)4s3TTl5pXy&K&Q zuOXftS;Wr@7(ZQO+k<^1;~49g2P6Fi?kXJ!9hsPcg+K|EjSg*U62%rSsuee@s!N9Di%e8wf2pt(RsRq`FfO& zx$#%$+AFtK3WZ(&^=h2h7|$&^V&D}9T~;~Hh`=mlQ`cE_T{kV|shW)3&FMRO8~G8m zA&TWkFcZjR=A%6~r^sHWN>6u{69wKKcxf|kArTxy##b1#!bnJ)r@p3N^IV1_!QynvQ^F_+1ZsahYO0E^r^mWG&I-GD zPI5gvrG^ytwEF~6KEIWi>bQ7z#EwYfsR+{T%}XQ`7Z?A%q=12#EplaE<8C-RW+&&I zTr9du|J5!(MNQ3cN@nV63B#LR+%7+-I^p65>@IW~G*udx+w9=0GHH4f_Qc+*#nx39 zak&)Tc-z`ytU5_c+Y*^eS0&>Rn+;W8XZV%)U5a1%u78@@)eFpU?yXO-s7b8Z^d6i3 zQGThfov-)&`%`+Cz3EC7TeF!;!ZjpIlWt8V{e)I8xJ2dGM`W3KK$3Rv-mcKERpfkb zAOP8Or@@*wUDUX@7rXZi2<{?WPfk@9mR4+B$1Sq9)*iEReOSJQu;FzEcg7-}YAgg9VW>@N-I1wE8khxHFqFa2y}v5C@AQwpWxM$FAzP6u!i~{R_`IgAh@`MkFHPnemBc!XSz)gIKM%NMwhxQlg1ultAo`qkWA0Md(t zheu^0+!d|9A(`j$-2@3@)C*%vOMGigN2s#?q;F<{+=y%qIozeZ;r*_$X9^vpt*=kF zb|TXGPfuQ39c8}Gz=yo3puoD^eV$M}G`?|FJDFbOHsz`$HSS3NAgI@Bc=zv%*0R3N z_$G9OuJ!2@7FCKSGQ=#Pm5ws`2j9oENv@H~V)~UTER&^8H-xuW=2#diw9U0NHz&LF zp)C(u@=Z<(-6uJH7|EbopP(H(Iurx(jWdal1k%H1NDqH%wZ4lhq_O~ivo8=0zlgP} z*Vy<^GS$N=*Z9xhP_Z>Y+NSbvEWd22nX6vGl2(Nx#mmQrGLG?xiB%q$ZO`;z??0*G z=^`xNKsuS|r*bR~^=;_zOOakUJ3B2B%;Gg&8M|LY{kPfiJ_UB{O4cUaF`4`0gEv}h z&wO+LOnO`B*x_$FWgpk63~s zVP;B-msU7yy_-nUR0Ym2-5PhVbdH6`BKK9JdN&BfZE`h{_x^0&=!gUvzt$%$aSE)Lr_AQK}HuB#k-!thPc6n<4ckSHG$Bg`$#Slid zx3|1{ID5?2b~3s`YT@ZU+0$IbYZ$#A3Qr*m2Mz6(iR$h`(ij#!*sv4kcw}w z&WD1sO|spQ`{z~$7;Y9=(Sv>^b^rPLTSIegVwxKk_(reZ$jC^A$GX!AUh^Vva61%5 zJS#GhTmDl~Gr8N$RP)~4EYqNA+&J3+gw#wU*%Lui9u)N|Go;5ylOAU6j&5NR)IYf2 zQo78(DYgm`^>uqgqUMy9`Nb$|Z|yA-?#~KNA%F_ljE?yLles%UJq|ax&Sgl2q zE?G!AbJj967+?}I{qC)(iT>nN{aRqt1@B25Sj!)gADUy&hvl{OYR!@hH<9!#m}|gJpp#1w2!sVKldu|s+K;eD|Na%8ZS+w4m)3!nRO*+{ z(w4qadRoo0D^=q>`NGiE^%@*_Nv;(jm4aHh)smRE@PGrih$`jh&ZXO3smQ{wnt5+j zHcdpCc+D->=g7M*JTxz>UNOQyiFq-T$^vBhOj~JvyPKdd7%k)!Usk zRm!?X-ndKmvdkRn4mLcs9@-Kc`7gvB8Dmo&Mv zkQ!wc3Sm2h={B9WQ6D7Q*~xy`A$X$h7H5ZM&&^~WLb*&UQZuzLsSW^KRX#Y2d)2W=(X-_cQt#jEAb=q;=U|KKzwVPckEIM{@-@*yez z2|Ys)dOlO=Edd}!Dv`7#Zu0SIF(JW8yWQcOHfddaxFH6?)gvJf!7jp-~483 z-3-}rYN^l=4|^m;<9OfRBo(TLa`?me*k41}r*d!a{%c~4!kG{74}S6b&)WuS0gcMm zpToQ5@Tft4_m>$XNky{a!-`Ml8)_9@ZNS|=Hr8D+0zxl5P|YUeQY3X2B82S z?9gYjf|?aX9}}+*?w@BrM?VA84&hVb>oA8Fr^>Jr!Ng=F{`i|QlWl?YV2Sikr=7n9v;ePsVtn|Z+ct_c2N!`!WOS)6_Si66 zyF__zGKiG(q5O-)`Auz)<1>ua5>HWvNP~>N4?I$tOP@9J%hY6Y|JJ34Qp~H=Qq*aU z9c9W*RUWDreW2H(m3aXhxYS~Xxvcu-9&LUhQ?MJxy&@wamE-Aa-%~kBr%wFTAj8hK z{;USc4&P8tPX9B-O8hdnav4iSW2x`$W_&06^f(F}F9y=({nssx3A$UPqlJVD1>^Hr zmbyDTarO0C!|q>6t~dY+VD2os5Z{U8R*+kZL}cXy-hiuJoDYNKSZB z$g3jC+b_ziO-Vc$+S1&b3?l5$XE=%V@q>VLQwO$S-d+$5*7xP9j<8=R^b|Q#I$O zU3@2TaHVAv)z=?CybW61dk&YLtPvb`u}&6izUH1u&km>Y@sNIOnEN(UY|&Gzl=2Oa zqTpKX&Qj#pIId}9>NpN@r3XJ(hMu3A0LEcFeWz%+!0&#zwNy+CDwd1oY0+<%l9bsU#Olx({AqSeXuMe<)or5?|_+Mc{--rW(^v zR=E)a6#B*AzomqT=lJlL`=Yy40Vx2HjfCRAI@8!j*H-Un z?mKq4j7aZm6nUgzC3yMJuf{1OKi9Ct;fs;-hxI+pG28=XR&$~NxV?Z; z{s!}ZhZcV>GZK;!6Q|m@DQWj=SVW%0wEn@u!kSy)e=um$?FsRueANXV>c#e)`I=_* z+`$SQ@1CLN!##$+M`bqn#RrS#<&#V9XNSR95~a;91TX@RrkqSSq1O3=@RMthmV?9K zq@Iz{bx6`aoBsi3a0ADd&+?xd)+p@z$IDgn`;iiV=3uuXHU-E;EPnm5FY(XYyFFn- zBVCBJNfAbTf_htB z)AeII={3!q{+g@|K_A-8+HBO%m&5L9W}=$a-CvhAI#}?eK1Y!Kt<~U6Hrua|Uysfffs9Z6DNiEo#8) z#v~hLujTH0-y5CJxmX^D73iI`&y!NwN0*9{jU9yq1rVOo#SWclEIwS5_Pll@|3eEd zm^*wu_~iz;(jmpuYf-lc`_DXH{7XxF-O?SzxCa6Me)`gT)5n}?UJ-73is$Fu#$&`E zdDEY)Dbi6>db<3^^$*fFQdVDajv2!6UhXWkqeuB@u80`du+fZ3c&ix?o)Ylc>0z89 zM>Eh6xn=|ZgoExsUO)HgTAwz&euMHhCCP`e&n|>jTUQ9(I-3;wF0w_;sj!38)ivoyeLdYr+2v?Siu3bLz254V2t>Mg$PXU- z>RIPP>o95pc530;C$U<28F5dr=Z*iyyApTPaegl-#1D%2f&YN~Hw|;j!+z>98Qp?q z0IaU{=gw!aEHUwRp0Bt52@b+ET={#V{+F9#s>)uJm{EGDG|wO91V4MZ@%uGD=W|`{ z$ErFD#Q(%YK9>UY^?j%VnO6vvH{VP1k1;>mhx-cIceBajc4Gi7NDHpu_}Ac-^mLkZ zij3d+n&Ba_)Q&dYNt)>xDc@TDd<7-I$Sm^}3B`b* z!(i4Mwlp=xP!8u$n`eqY=I&`P4-J*CN9Mg}hzRAfUrsa}ExoWrJloQlQa-f!=c4c9 zQ==>(U8Mf~iG=Jt$ z&|m1{HIEJYsnCj}Khut$j_gbD$#Cn(f)-%OS{VXiA`|<&(6ywXKpYxk-~=0)i$@%N z(jPM+q-d|gZ1~Fnt^s77pBHMy9_uR^+z(IO#$GyqvXI$+NTkNo`Mko$_}`|!c56sI zAoYmyN65*sLHjXnQFkeT9Ae9?26?z4_{==HC3$P$t6BO8XptHwCuJD9nry_gpEDwt{Dw$_cZUT6QAIKghn?E{*9m4% z*#M4CRcaFHmbmxFsCgsX=I7II!98$--uDk0D|kZsiS9Y=i6)_L2$5+&nleSfGGM)N zPwfdmIgrT%KESWNXi6&0%fTU<^<8#A>XG8cA7kB8*41!n)M=S+i*IMWva52)OR>en z+ZXh}1u$ipL6qqls>@mX$~{dJo+UWPjgj~Z@NO4L`uZ`3-tfSNVzAz2j07?HZXL|A z7?6DyuG&!f)uFv=t6V>r{EdAnbf&x5ex}dL&YqI{w}W;?K0yEv)t22;!-mskIftb~ zE}M#X*9b_HU6(oqA8HzHt`IEN7wutqPRDFSfY7m9-s3Hjcpq)6r}2hwroF%aei|(; z6tefTsO2BgZON+TO*QZ0Eq2GWnhX%WPI`vMN8rcpZbTg>Z9vc0D?fs;4^2MXhEKFdQ_`FG|o&S-<&y^vw!?c6uCAr z{JZz^u*N~jifjyNj6^C!Mq|>m)11wpVB_;88_Gg6u`b$R(oDC$LSqgc-A1UXzkU1WZiX`Ema*w*Q!~&DiY?981O%mf zhI?nVqQi?#Q`>6-WQ;c_;%TqL9MF+>9d}p5`mD5U8}Es*DNGv zh@+aUOh%{D(z*h_)l}iE1?R~-V+E$Hke@fKAuSikrF@3+7divrMj5o1RybMu-)l~Z z&%YPl4Yc9#@2EwdUq=FQ&D~<-9_83;migKx0GVeminC*RE4;NKNx*0NtufOA4l4z{ zJn4OLYHu9yM863-UcNTLK1$|_0e{cEMOi*VCuc*?bY9Xa8pg|t_QpvW7QGzv*l^)- zJtMD7m`ybJkxN%cr#J$q@eY<-uX|`_TE;@2qp^||uBe3EfA;f}knfTd(C=tS3);Gc zcw^E%dJDmA=7C-xO#7RG{B@-reTA5Ud(|0nkuc`Tw;x}is`!$V47 zcH@zdecd90nk1z>9LK|Wg^IAoZHXK)?)Y?gA#TAaI!~7AqFK0l5%I@hCoe$A ztkZirllhYK&=J7B4q~!w#O9IB;8w__$e3J*I~aVX&5$*_wXfHwhE`GwLWmDgS;1;^{j@AA0F*p-fXYFEIQq0Pav~|qTgqM|D&bzS+Cn6%uXW<1s=lh zDc?jNYOa0$uGH5s6zA<|r5i6IDc+W}f@d1eW%?}FiSQ#Knv-jjSY1KUdvlAMlukuf zE4YqShK5QixoE=-DW6;+y<1~$2n-Hx(xAEVR_^$e8w<(_Ewyd=jY!yCMqy0fLCRet*fU0QB3UHB>S?BYo%G%ntd3> zk01Dc=JqUe4p$9Sh;ke1EHFtc@Dp&ap(P#^+y)f#7EqiJT^DATq2YY~`@MUJXFW08 z*Jr3W7)Wsa#Wt+}-FVS-E&J`lBD3I*a98{FL|nWATEl%q(cM@RSx%SNr%bw8R+jaG z?tkybsxJ14xc7~`ZI`PlGTESIJ`Dewh=dTE4-X2V^&*tEFTne2;){&ei+mqfnNXOi zEioFSMxrpyUkUMNx%y3~HeJ9v`SXf2$V{QcHr;`QB2S=VN>2Ps_Mh*mqg#p^etWRJ z38_D<4?W^_480HT(kOuMe@7Dv4Jj#xYB$ySb^gtxsiiz}8{|WZr3$+-HMaNX&^wih z=DBm{Y0cagMZ3;Yger>v0mY)v1}aO~GOtR?vE{w~R6+RhTZfh1?q9(`2QeJ_(E%qU zim$bXJpFwkMDRobwFa&u;!ch}H$J+J;%NAz$V`EYjY?iwDOUD9iI5FV=hu!yP(F43b6$iGi zAF0HuJ2!~>SY0;KtWTC;m)*FTRbjoyLrPXIP1o{kIosF>68>dp?SI}-tAb~u0I8(y zU+)2%F4HmVf_~-+hYlLuP74vUW+&*LN7JxAU{L}r9i+>&639092@C%*cd8C5e_3%?@ zx#>@+{#FPHj;Xbuu<+@Xf{W2Kw&D9QO7Ae;zFCuzhT8i7sh|KqTON=t+DcdHN;6wD zwoDu@x85tAb>5n3)2o)@kFYQO`o98I^zvB^1S&1#R=PlDXpe(yU#lNBMHobgx+8KU zkuN41xGhGZ=CB2}_o}?$ft9;12;9UXPT?9;n1O<+JASK$`~$5#$(^Eb8XO#))NR%^ zt_SvOqeX^^JccYG4~6`X*bBhMt`Yhb>(8$t#yf*l8Nz-UCbSvAXMJ24oaH((-5;Xr zT!dAMX$T2B(ZImgjU!I_m7>W~=s4b}pW>5;-oV%NzR`EF5$TmhD|7d*jcwfzpJ zMPPv=oZs2{4YLW9d*95ZNB&m5{zy}@B;G+yA{xv4{8Az0p2@)91wNa7YFu1lO3FFB z5OTpA0QMt3jURGre5Pb&X2ycyFBtXQk213Gk0_pgJ|uHVhNaW3JJspEU(> zb+qoWty6k)ZZ1qhR<;F#w+6N_ zpOHEc`LtMfLdZBM^wO$&n&1JVz9E)(4)uKisv{70m#?B4u`a&7FX}IOC32VOY0MP$ z+J8c2mwi~G5taeB0!Pow`Bse)Jc-6dyjH+-3?TUseUbPAh?6`#_drHwJXn9YIgCXk z{bSYe=!U;oE0Mr25d;hWCP4dR!DqmMgJcXJTsK=wOx?2^UeD;%x&~J{UKD)nlGCbM zY;#A4Tie!1;2-u*3swf0rlD6wub(Q2g!6VS(gO8IpmDlgW&faP(aB)bl@*9Xtw6R^ zJgY6)*ihe6h9`<@(^J#ZK7Snc=+UEF7MtW|>MM(r&Jq^I_56?YRB6>p4+g@sXQO zjKJ6psB3|yG~h8SVK!Au`nFHId9w~XNq$Bj6AeeyMoM{KF!jI)o}FmT)~rITY^)6g z0=ODtq~)Zjnc2he7K7_Ig&O~+GHSRPLWif$*|BRxIFiBG6Yb*aTK$b0Z<77nl#Mo- z|3NkxU;nxlcl9rUqQ*_t5D?E>SZ*Ou++V+bU4Pw4?eM%euWhjOKkx{zWuu0b`RLb6 zXVMl+8Wbw>SUtqxb$oTs8YwMFvZnz--oGo?TgP}z4`#g&HI0_wpZ<+l@T{AxZ1i={@76W?(Ujhmt%l)7}^_Q5WsC3Cq@G{#AA6rQB22ofN0Ncs4|C(9KV1&;kirUtM`p zjR`xV+_Bs)8|zXYCrLT%SS-=f!rn3)$MLLwu>K8C$b>M9){ zIw?ev*BnXD`L16j)O-TzLJH77xBI?eIc|+e>Lapy=fS?L1(FzG5Czf*EvcdCN-doSh)=*>(9@{=)~OzA zrjg4~dkK69HRMO8*3u0R^x4{Uz!vG(U&tXbRC2PClwQ3}y)t@hzdTex1}Mn)*pC{> zO6scrq^tnMpBxQjq;N__Er!&oG7H+RE(b04kaU@gSf4*ZXvMP|kDEOOh5*W6`{U>x zrX8J@n}KUX4bj29J%jtx%CR#8ox`M~LLEt-Za4&~pnE`Kp)lvTvBA+ZnHUbdHD0q9 z>Z8)sG;ZQx9~?q15=`0DT5v?c>HH)+hq24;GBkXix@*=nMl92v``*k1y^uC$hH?N` z2XA%o-&(e+%A80MZ;_p+=yU2{GxcGgg>1c13A>Kazlh>{7q&sN zD%9mY_z(71GparRHnlmOkL3y?W>G+(R>sfC-Qr@dAaX&UgIt_KgR#fKX{3KEDqLp& zre>jffI?L~4N&wW)E;e49feL-8fP=j71^QrhFB?<-vjVQ&!0Kw3*_?Z57b7A__L%4 z81<$|EPYlCQHdJVFNja@4H@Q1M0`$MF53W&Wi~bil`b*C5wiDy$yg|?5K!9!=N8=2 ziHVMyT8k#t5wES#(wu_+CNcza@Rtf{kEPhrWz9<#dX)VvNJQ%X9Qa|AeF7}Aqvm^D zTo7T7VBr;oaCzWC+MmN?yD8O)wZ|eK?;qc%5|=f)s&hZkZAjWonWZD*VA^XPIoc&| zcpuz*?t-@Wl%q=@m=2pq$e$nam~^=0b1}AOlMQiT9|5z5VV}VnXiT1771Q5D7s`NS z%;&t0KVD`U_|cZbg$_lN-QN!*EkHsgo2$iQXzVXbs`m4n4?iN;)6lH-h4F|@JhEEF z1-N+II)5qoPT5(Z33_oe(lPm$=;IDT?+2!#*J%-Ii>{SmJ;&vugb_T7D!eF?X6nZH6|T@cN}#@eT<+D5{Cw@ zaz%XR+V$D+;3%g&lq0m&a{avuN+Ni$v8rm?4eAfl%ho?(FI?c_qCiE&o(;J6W(a@d~MTeDdZ)Lpr zd@ulqq}}SS2;3y`ky?sDwMggCjIxn0DMyEqe2p8yo2CN>19bJT%YBcz#su)ogE#UFkvCifB7D793Dh ziN5{LL&kf#3213HDYBUC+}sVA6!Js;2IKakw+3#Y5_)lKu8X#TTHdkuB6gR1j^(n6 zcMT0&&g_#NF0*q_5XNspRB*^5kLHNKaOQ$%cuKO?yTdl`6~8XHQR0@x(0i>I2|IFP}VkfJeyS zSM-{&YH`J;x0rtK!eYuerMRl_*Dko|b-E zIJJl>D}WWrNc7@bInibLPOenmN9gXFP3PkhFn)iVr(L-o2wtJ+h)Y378OpS{#BB8n z@-q-^J6&WOSETJ6pg4U8oh?ry*abyZfo1iC%Ef%9_M;-3Z@RS0Po9E%ZvQ%dSCy&| zbDQ9z^aRdB3U`Tz)U4v67}d9Jm1q%t!)195*ilc^^OGjmVy0tFjvVo!b5hznMw(A= zI%TzWi7pe*BfVnZPAce3bo1VEq8@RSu1(zML|cB^g&Y}$_WVb8@7`5NLX_3TOuHaX z?8Ih(5!^g1onD(ot@}xuZ}jMha0E|56?8qLC5B#lG(6Ug?}CVgC0IPO3zX2a-)#Cg zzmXe=IPlBpEi;pO&hl+pH7$tXlE3^8jNFdYWWgn#N5voGK?a{|T&JL8b}Y$^i8pOB zlhIXBSWFH^X1!H&`q-O*an|YF#zrL*POyDe4ZBm)c8>^UMNfOX#2hymd6dgpH$c6~ z!{EmR1Y4s1EmpJfd{N2{H6<8v(v+W!j<7mX6CL!y-Q{F3gFa(nms)PYS-@P=J1$+( zFONBk!bgksZ#W;V(jLXp16&9-sCtP(fnGRkl6EX^k{hWEr06`m?eI;-Bt8EX(E!>Y z94&m$eG_{<5YEqb<|1gq3oh}D))=DGoZyP?UjOgd=1vWn7>dOXO#IebA78dW6*6%((F@fs!nwf~{Ktl`K<_K7*88WNaY_2|L0JgGT>j*() z{Q$)u{(CZyBDVO#VcZh9__uK^B_I9(Fz}n8H0kb)Yy@_pzDaOhu7WTsp2b zxLj8;HnLbEUM|exv9D!7Wg!Ykay%{ZxfvzD{xW&_)TQ5<_5|758$IGR_<>6573vuV zH(;A8O6=Y!pGl~iz$c_y>e7R7clY78NVe8ys!D8N|Al{cj6>;Y*;__nx-qEvs{e>h zhAh-Q>>5Av?;n52oc(N4d zNEZj&FH^~jPnG2OUt{PTpKH2lFkiWVY5u%)*qqJa_z~0o4;u9&Q)kPVsTswQv2IYI zTKv|{yLWG62I{X%T-R2ZRKZ_rsT~L$t0&C!?%ogSfF&+AL*XeF4#Bv0;6SQWntkDXiZB$qM;!G zghhsGF%qKfQsCaigQC_hvrA`T$Y@KXzIL#E4 zZC1gy^gMIh)5_y%3F;Lfu6scZLPYw&GtzkFDPvciyDaK72aH5);O9$F;k?Y$x}xE{C&tB?to*b21Mck6fs{?~A&tM)yS< z7Y^?z4)UaC?~mO~u^cDIqdX0d=`2Z)#%B$|rIFclcDzODo&3Mh!Zdza=;vn{6%cJr zw>$!>8+6AME5G@O8)H&XAU?s_*zg1cFTC*2zvz{zs-xvmAL(D;;tx2>B&c!4#Kh*1 zx*i<`XA*8gtT&(v2N4>=%8T`23#pmsHT6z3NY&FWm`gBL*p-8{y>+@;=$GvAt5p#%u|8n%bod-+p`l& z*1q^!@%>aW-SD@^?`ffW16&VTJst150c&KRl4ZQ|{?B zstdqwzspyAQbQy4jSVGUovgK`fU&JN>$&X|!=XX;U-x)|*D}EM%9?AJ${7Toh$Q1K zlaJMOGk(N_w2if@SWwpb04)<$O_`Zx{++}SX?xM%y?xK2qYjNqGz8W|vRx<3TPMN;TTiZ%;APQ4ECA{?8UlDnQEe`JZchOA zX$>L|fGqd(QQo=!(>d3k!Gjq{iJD5cy~FS6i7 z)r$T7O8_zD+QoVwduvU;5cO7!Pb|`@yN!WBF;~KAr2p+q-`{onIiq-~zs)WCc-YQ3 znVU{!Ek9c79 zUX(oP?&(%2`9PqqmJtM4>B4~puIQ}}^h6Q5dC;Pj+pn>hK16(itmL^NX_XfoBD*#;p(t+DGi{Uv7mq!|N7%S>pwia2e?z zNm8i+zg2rkKuj#Hvqej(ytI@L%fH(B;HHTQjY3+Giq6(O${CtdvK5x&k6ehP>d4!e z#Dw1Pz%cRI5cT$|fADEe;VLP;&+B0fC=SKdZ5pW`qSPF{Yg7MY9sSpeI-y@?94ONZ zStt9?Pdgp}`85E@Yl{aK|KmOV_gyjLx37^s`mc}wKfdzGPchy9{_X$!zji65_G$h< zKTJ*W|I-gM{6Gpm`>!bUzi;{kI&@-lGer;XZ$G+4DW8~pYB{V>79s=-`{h`nDnpqY zfDmfAT5UpC7+(Scd=1?&P)j*iTi_Wr$H)f{ooXi^Xi8H7@(VL8e!{0`XB9AV-f+Ey z5q;k*9)O@!hi@{T8?B_|KX>ig&|>8LDSLyLR4Jz$60eEq4Sc z(=iZ0>PT|0skDOPmxzeyojsHHZyRXfPFA{MU!r*enfnv!B63VaMJ7spGcx@DY@jFy zKq&%7m(@{%NOm@p;!N_rH>G9)KtIX2nDn@p2=tr@NK{x(4_7kmYF;(STkZT+nXIAs z1aSz(kNPlDj1s`>z1NV+GE@}@c%A#;P5?gppR+Ay!G*@}IaS-o9ZJE|Wfo*EDA-);x+H0&^}aqEa}&`%Zrk=U08B$vPPU}WlRi{X7cdI*_+sAsl$7|;-UYQr3F55NB3H`4A46j}}g_CbiD zs7{MZY`EtenO~5>P`&|zWIgBrH5fx$nD4xR3nt-AnrF60xgxD0jw+R|AejT5-K)6+ z5Qf|(7a#=i_w&RB2n;5t(&{1OYyICZ9!~n#iNgR%eVZ+XvZlE>15fXr1YQg7#TWp| zz(Zgt&jz80dff;{s+7hPrZZrU&(q1ZMSN9gFkkA4_JpF1;bJl{Di@{uLiCr)N;|Rq zU@o6tU_`P{ndkmF0%Qa=>w#W7w->kyK;^tDLb{$_ddyCq48dhDm|c1($GFy=z7o{SA&2# z2DfWp1un|w_Zt!h1z|EWP2|59ggF*eG8pVjBLK_hfP$@t_K*<>+P(&qXL~>4&Lt(@~&>~4z$ysu)QW20Giwq?> z6hU$9aerKTblU@=s`lQ`v!1o)oNG};78O*;z z*f&Mp4Z=(KZeOW>b^}D*PY>$Lrp`TC{=Wn$x!`w!fp;Po$P^S%y<8MZlD5szxIbMm z)mu(>h!F7J{lyf*GzRuxhKL#w@0>;3@**QIy_%}(BKcHJTzf}mVjX9e z1@$YRoTs>9`->v*(oMNU-}Z^kCw<*;`XWRXMP%&m6m#|gim4W(A5a2NP(W8=byxkE zfEe|iE>Vx^Yd#UVN4^=j#EBQ(ZU1uhur&4e@-;o^e??Trb-{D@fw=2+gH!=PN>hB} z=eyg9xVwy%A#ZBHsX`}z{7mkaGmAAl8{3r|)2DrW9Y(=Pea_XaUIq9iX zqgTB^1`38fQRjo8L#LpCP4WqvCv7Vnh&bc^z_RPdw*kv(&oEPaeeWvdTr}Pg0Vt3% zl{-e$D(q`wa}kYcOW6ux7RahV76Nq26pP%vu94L zy&OQiJe?{dD)^YWTE*$=$R6`|xxgglRqp9MN{9p3QHN#Zr759;OCH*<|_{ zEg-D0*#-1#gWeCgffeNV4I5H}c1bNIe)mU^^9+o4m}m_DKDhPnG)x>Ru_xY#IjVyF z30zt^hknb*4B*VT6(S%4y#)}o-QgQDJjH*pD8~5>u1;mI5$mJHz3~iE@8Y?QZth3M z#=*Wj``^3gE85FKfpFnTb~F0BCxpCtGoJOgD=;r0D$l>=Vv>3k#yteW(3jEQpA#?g zrSU>~OPKa%y%(-#(Q=5Q{E0n{dkM#!D@gnu)ASfHYjn?GcEe#x>D$m1W4i@6YzA9mnJmxE98!+ys(ZQAD$~}BxI(vay57KU!q!Z%FKLShKHp-Vbr% zKVx|vo;At=h;o2pPt@nmyx-sICGXi)(e)D2Ioh)JB*1RR&j^_Iu-?;yht<2bjmMXB zUC&i5yGn1do3b!W^Iosk2oGvjXY>b(KaITiZ&tfrrML`|Go%sKtmYl;1AK5UxiULn z=9ebwkN_jy-yPbQPC9s~j86&07oiY6Q6GVZNebo|Y0onad-1{+VhYO>;V`NKrV~(5 z0PAv53YsAspKxFbhm1~~aOv&IzYFsXzS`6s{qCF)nJ`OvNB#5vnTpE=moM)7D|r%A zTot~%ZuZoSo{RX4k^+YlKH%8d+f!I@ez4eA<~=z4?f~xcI2R9tvp|7z14KVUURNmq z_IX0;I1M;77h?^dK{Pdm^8qqYs?c}9JnmL9#a7Rh*;0vW;=?F%*f|%l% z_Y}ldS5G>(mL~WomY;trYD#Xos6oh@+hwxJYbKeq){VU;eBQ-uSdb(nkEIv3wmfTV z`GG~2TF}0$E#>;}w;w-V+;Syd!`m}zBspFQFdH2mMMd#b>b?k&wd}EX`9{`TdUll? zoE6Ou_v*ErKzkLfH*VWa^3wCAg&2CToi}TUb$tDTwYPADA(#E*_wouO_H4Z>IW_hW zB}dVv<~Y2zxLdT*^^annS%$eg8O^J`z1rZ`6VsY+TK@&CH27a#VHV$`H7Iiy)FDpE zSG|AVtXDj{8nur?bK|$0HU~}L65fB7p01*i>P&(8=23NhVzuE!@w~Nk^}N{Ka#zJ0 z40#j1p-t6!dYd~jq+RPbrV=@-WmuHUqlM;}562@y^#^dP)(QtCF18eha#)d;JtxDB zN`hxQ8+q&3%3ODfmr7h8koa52-L-LdUgp;l144FfcIV~EV{_ZZ4g;!iDHcl3QHEJ;&(7^1LJ@EC4d48DBtRabJ7{lJ~I*jv;M9th^ z#G>tud~V*niA`d;EgO1mrhmPR&p}Qu4VCV-#(6wPZ*5ki(6+`p@%nEnl~$iO=5&Ft zORWx{3BSHnx#X$cYc}RU8ta2XK1u`LpIf`MON3W-wkw?<+f;2AqsYd1TrA@dCG||# z3_qtqgDm)Us4tD)S1W9SB|+YOCwkVtF;_|r25bacRk$s7&Jm}qTbVFuY>7Ks&}ugY znNE92)Y-CkgRG7>WaQQ=SN(one=gIAt@XWW%cNdEXAH1X z2XynFB%`c)UnkhUVs$SLcAD5ww)M5{$%y*xCD*awZTB)j)_$TPioZR7NoUpvO+`)p z!Tsv|E3Sb^Lpu(C%IZEhK34fH4|e)Z>$v;7Wft#<36H|VC9k-fEKq)rmu9y8`^l|t zr`(dUV)jq^r^Vr|XsQaI`&ji){$nQ}U5J>8SjIjXF?76ztMoh*+gi<10t=zLaVoxo zII{2a#v-%|2f<5-Z$rqd;OUa*`kYEyzQcVqUrHVA*|Uk<7-H);%ebw^(^|!?eVz_O z%rtTkbZ9pmV^i#I&>#ss?z-sv2hY2z6d7Oc!p`=Fb*RKU1n-pNyIsE@*eYz_ z|AjgZC-}^V)uk9e!cu3s6Fk&kYV{7aqHx?mtRx(Tn6KyM<)Qsjxm@3}VC?pG{Dg=X z5(X5xG_zhWxzlArtu=d5%Wv^TH#-OT#BO^o=VFs+MvwGqq}%4Kfb7yDl+fNE99I#9 zXJJXa6p`m>w$qWxedPU3RF`r}M1}jJb?=`9RFrHEG_rlVnLS!%TLnwK+;Z*A)1o2o z#S*KL(;EfLDH`O^-tCkK%04Ly^p$^DH{Oaa_gKQBI2^7r?sj)_Pq4b&dW!Nyow*(% zXrozHQGw1sWt*XwTAZT7nEPf7)3zTisMK8^FSU{YqCpO{SJgu1@>=#I{-KU^yycR! z-B59-c{Df(z+~ef3Sl&O^(ucMPBpBHiZ4zyZXCMiJk=8ZyRy48YwCdN0GQzvf*J^X z%GR^Pxq8Tfo)Kf+@OX3z*d#3TCM1rzT|MNguOE9e!Ds{5k25J592!!`58G_xX^3iI ze0XwHtv6A~p7Vo+lzKJB{>$FnTnM zi?9E^Q&uCj#iMj($RfiYd5JcW>kX#iH9caP_V_*GKo!Nh%J0)bmjt^vH|7U6axtA5 zduUrOwkI25lVltOA7n-tT};4iF9kHjaYY`bW-=~`Rh8nkPS`&X zCq+)6@??$AYa@tt_SY)uJy{?0M615bm2%Ned9QW5!qquB*lBIUtx)Rt%_zm$A@{Gr zOp-k4Z9hjNaQv!HQ7p?(UV}$ldP&Fy*+ab2g-WQr-do zg1#GezGrw{vTH07_F6q|PfWLu(My`cMCx`Gmnm*lb@jsj5<9EH^Hw_hD0knuaKr!0 zvyf4uT&UoR-RmmI)D97pmMB8GS{2KLig_tR_+^YEwgF!Tmj+!!xD!bdYuZt zi=x`C7kDEcZ9O}Z(4G~Ax7=Ab=r6O$rDmk+dMCx3W<4RFVU!D#&xo$M`cF~#0m%2< zhGRt&grq9m*1Vpr=&BUNQ_7vX@|m_P#a9bCk>IQYCFtXm19r{ZA46W3M*Vi2h*QZbW$)~=e?1ATUliY65OqePimZn8*GL5P zS6etzEg{xHpbc4{TkFX&@Sd27QqjoV&ajWuZHN$zc_@?~c~!p;7dRYoP|l#x38cTL(`86^gC|7K3+SKJpmb>f(XW-TE3)-lw5i)SwVPf<5%iwiruQKjmePe;U8asYPTNvMa}`dU(93{?z{G&#^cWr-qbDl;nz{AG!nP zHJs7+Ys1$C;?<(L8%_BTn~MG^%q=X8r1s00)4N%}wLH1>V6228V`<>jd#_D8&O`>s|pcK4U17K$Wr&J^!D($NWx4h2j*K~uC`C;w(ygh ziXvKJdz+UukDNYD9eI|Hjuq|f(m3K+UeuMw51vbGDp6PJB@}nx@#5Z(Z`4lNGOk?q zTl8F^wdr5&gVR4oP-BHx8tohpku|f$CN~ZK?NtIVnRh6cfpGN{C9Ps!mJ(z?$oHcy z$Y(w7#g(syp~5-l69L^~<u_XiTl2wykWrrx(*?J_Ukx$R_|zp&Yl3u3j)Q!X z#SR6E)ujV^v;Xt;&C^VN=OV^o%e$hQuRB36GFSU^7HUSW?O~ia?VO`wou={P8i!G;PCwnTD7XjNWqy=zfVeQ zGTV)})V4l9oH`&R1Y+DME0=AXp=~Alt!fc;hn_>X zR-{8eo37vRZVen8uVGF~^rNUFCnC{UdO`m)g>g@6(>pD?aES@1 znZD5)0rS_I_Ei{xf!ssvLM35h zS{8lNCHP0RU4f>|y}_=)C>Ipk)zJI?k*rson4)zq8QHxqKqC*<0=b=jo~uV5E44j+ z$gIV7;0XO`r_NtI7l>i${6&r*$`0Yw0&*G6r-BwIn`6N7G7(~EMke*E%kffVVf5s! zml+zIeM-_8sh{Qye?Jo6{i<4Q6Wv$@kDggcd}Bne(0WYr_1_ud?vGdPLj1(eJWD*MB;L5V=mqG-MQX*4W(!0nXf1e$s zxvH%M%w8V~-$@W#Ss1E_=5tL!xd;)H{1PD5+t!~=AhkPvl@5&|0jV~E& zLDO;v+#bSFLFIYA>*rG9CG%q?5xho7KJYM8Gq)#;IN6WfwtM^*`&ZE0!~i9`lrr6Y zkpdjY-)Fn3&i3kjk90DBO-(bmrFC75cJ3K z$l=2oru9?d;#$g#;(n@RO6tyb6Lu7Oh>ZIX*+b3>*U2|+AF5#6T9i%$YGY=5je%3M z@HNDjJ5bOy72eKLYwRC+F3E)J8+9hb1h_5Z-q8@{D<3@kET`DSFVajcJ$?yA!D6P{O*tf;Mbd24GU{`rM2H|kw^Qh ze=xIjI{$tgVf$1}xNu0o@?>+Owptd<$I67Xi0kTT3Mw72kBR!R592}suMFF|?ZnT+ zl68*}z@lJHw-E>2W=CsoKpn0=)%wzM|LNUrr`5x8V!pK>H=3df8o=_7O*uNFt?ivx zfpHazKUg7$Z~`m3*>%QI(Dac57+nc}UwjLLug2V^J97E`da|eWilaOY(oAB>RcG}Q zzE$709!e?5+l?O*=MvkFs2<~0OHr)#tB0fGUBq=Q#U_KT9p?8j6){v2p+=DG=@z&p zdTlUXtse~5epbVM#`?LwXnbcP_mMx3N;{Nw6|%A`{K&6#OJ=fQ@+cbn>eLLou&{6d z@$}iVCWoiJJjT0Q;=G@5%;i&Gl1RE9#n0ssFVV1mPiTIi!YHm{P4(VSB~SPvcgb>2 zo9^qi?&YfcA{Dr$<`}%T@Q-RFHJ)(cEx_IPDx~qK)GxQj`8BOQp*E|J)d6d4aGs1p z)o)^)P0P=kyj8FtDfK>$gFc|Q@7}2e&g8Vb`bd=ERLg(#xZuBm7>_1+?cR%LdQL;> z(KYwneO@Z$&6{@r+bn^`zGE)#?wv4ONCW3X7t;!(zpYI{(TmRkwIFMK?All5s&R{S zvhVsiWL1w5VI#CR>0nUWxCyO2#5U6cSyj*uM@Ajw|2R=++;xph8&ez$9uo{(w1*|yj4fhC}M>Uh!Z7W;&n=k^G!mQx&h;Z2b%0%2tJVc2Z8mIj`J zfAeg0NHn{)1C)ZPMr`CHNZ035MD_Md^Ksq7JHPp%>(>yv>mPP{^A2k#$?o{qDg0h~ zfL48&JJ=Axnu)++O;Ku0(+bdv{9j)*_X=o+32j$=H5%#$CRbFYhLJ+K`Wp%j2xZLC zRZ@C{k#EW!!{XzwGc?x-UG*l6N7_@$LE9XZCO{!3wH zszn{Hp-7yazAHDA10RTXd!LI6zqS-RY-8=0{%G^pO&Q0of|_?$HTh-Hf@2m)x(teH z!k4XrHRFPm?Q%low%Mqq@77kG*M60|fR81HJ64#h?=}v*vi1WYQlV!ddc~U(^@|8V z8V^enySkOSZy`JsE>;_b0H^iXpMTAD=huoWTX&_UMB$ZHx15W2vLI9S-EF6&7xj5x zeL3ev|7BR+odfPM$XH9?cz?d#mnEvoO&{?*fBmv>Ntmm@5jb(4J}sd`b(0$s@4!%$D)K|5fak;{F(OLSr@IEx98DICk|eKcta?y-{;`u z)CG4N%~qy3wR43r^!n*)*fX@WsngSXZ;r<4G>GceC5>+=FKmmDy0i7f;1Dizo>1(5 z_gB3Y5*wM-^{6Pi7lx}c-?yE>CS84bBDplk=Nu^^teD2bCrMMr=%DX`|GHWVijH6X zt_*~V#lO&#O#$!-HOOABXRbT&MLhvG+==FxsoU9C;m12Dz~=8CUo=lK2SY5|et$rA zH+s^zN+H6>5EvVcrxwek^wjt+P+*<+5RnsiTj)N)s$ki`YtrEfd^N@Iw_Q}L&CzT& zl>c}&3bbk;U$Ved2}ktG)Ip^fDLsH~O= z+o2~D4H|LM%wHf~CJmN7s;RBvbkEV}1R&9Hm4^e6ftjke@C%No>Hf!MGu`oAnS2O` zwmQxyYSr*O{D`SzRHyfUFNA-;OE1emaKV3l@0b6ve=L}PeUI<*|Gcg6UH_A>ZyEjj zRsQqG3^;u_`d(iYXrXS2o9Ya zMHl|}MM)GQFVo=s3;YfK=a=cNe^&PY`a8P6{^$0B@7_9k@6$h*I`V_>51ju0U+%wi zssDHG-Gf&rSBEOiVhp{>c8rp4SF5z(*_gl{bUUyTda=LT}mLZJf%wR*8FN0H@T6x9VEHbVE( zEWt*%!Y_1vk)|!aYHxX&Gc6;W3)r>{uXNpsdsC8dB0!DS2{abf_QppaL!aB>oDn@S zr%0KO#<};Vs@&$wL72qaX%On=vlB#h&aqNSHiW4MEQpINa`C$xlxa|VaH`eHCio00 zvMNX{uDY?0x5QmEYd}FB$gL5{0H+annOH93$o&O%Mp*TtjNAXq1A zEp>#~-ef^1`xvSxme8jGSW+Rl@A20KUY*a}7>7vU>()q}L&i~{VMw#cJ@7Ut zNCT)60>JPA6ZV70v;d`GMQ7{zawO0i$rY@%{BoP?%?8dQO_7cn?!8Vlh6p0?B99rW z`QiE8{g(Jp;1l%Z%@iV4LBOdF%n0=qgS69I1SW;|SDn`t?DUb`CvSZ8i{H)UvuMd; zmOX`D_W>8rj^B&2XzYcSgyb*xsZt4?DV#0bB9Hl^x(K=M`3(^~YhQGWHwQO2N{@%S zE{|Igveon)guPhWJ!zP!J75Sx7`L9#DY`CM6$xY9QE13#b^)geWlD!QY{!P@#rh+L!r zSciPKkmOpI8ok8V$e}4VwJhLelp#l1ZQmc(0+5n=3ZuRFd1?9>HFf)J5d&fYeTb5# zzA^Jt#-^q^+=W%BmO8!HD85mXEmsrULnd{l`>U_!O$9)LqW<(?>-0-(D`_H{!2d+@ zFC*1DKkGsMWB0gQ)Yk9AQGfWurnqy@EzLULxD+EE~Hn zn?m<>`nHnPc&}M>KxgL{WiiJ;@6B7b@4~0*^7oTG%RM#c_vB~zn26-|h}zZ9e(wR+ z;R3MDYm!c7OEcpWSVBvww=!YHG?|`AMjNK=Z^uBRwMgFtscJ8J*sB0HG_|zT10uBS z(VDljHMB-;-bxIlmsqrsgXHweFM`)~xCF3G?UsIeTg>tDE$mi#)}5_pw4s)W z9;KB14hQ$ZA~<#dgs7k2Xi*=1|2gGqL`;m`4gx445o7DEpqS@!A*eD@A%kTaNpe^I zUKavsF>F1DY3`(m-%KeTzYzS6pEf8cNDbJ*$BOQ*LgVGAbjA8->E(~X%I5(|C@!2M zlhlT_^J5-j}d1f4kU%!q) z_%vY1SkTcsbx)9WS>Y`1Hm8}&bKEEi(Jdrk)-lJGRf0cZLadsjPc2LT^~q(bg<(Lg zP|kR3)1z^q;svs$^UdT%$&75FXcn0u!k3yxMrDWXg#m!p+0E)76K9wqA~}t*+pI6T zFt(6JKIq|$S<2?RQk*jymXp;Nl) z*ctg87;}ZA3zzj#X?m_3Z!Z8;-9f--=FU3qtHe1YoY$!*LVV=n?C0jU|F;x?(6 z@m}A|G?0}>cMKcEV5rv!eU)(zmh)+>~uK(UT0_%rYk% zzV?iNdmg6Q(?G$*3o)FOT@u5pV-ExsLgN73D5WMp!~anf)6_G4GZd?@@@}(d4Pr)Z z@Q#klp8jR@Y+vF#7z=MIOsw{y36iZ2j`Qv+=%EN`4MwGFylb^HEI;HQ=uiVSl^quZo1|r`NT_ozT?64@`5)*+Gp|X~cyi#$sCF%ErO~y|Mr=W0$qbYK(E?~fRA5eT!qN2&dcF$`ID2Zg zhaetA>2~VG)sg2|mNR*s`nk?YnB8_y?-8A&fl$^1A{9<-6=@!>zL!Lv_A<-~1CcsR;frUTm%HfJ z7;dOTrc<(22`Iw-`?93DvK2A!h05-nfot`HX(bK=Khh~5C)O$QF)0f`KIR~h#)U=z zNce%Y`|l#T^onh%`KN`Ko7DaxdVV)m?Cty5 zb4*O1pC8z_Y>b%KEq?5ZoiOMN2^R6bq%bMd1*}7H{Rd+Stv~I zAqvby&eY;#KJd$gjA$R$0>#qE{oU~rV=U>-T^DZ(FU$NubaaKj7W%u{Wmy#h1h%nBR zbc&EybfrcbeHq|`Pkipu8S9n6D?oT0Jb17Olr@PfQa5QHNFRlx~=>EU%q@1bnenVa)ePM!O)M+x$tw?rJWo|Si)T2J7iu+ASFj;T!Whc zHbkFw3ii7uxd#L+f5}yxRs_Wi&c5e9khNHpFJV_rV<|fgm>dE3;j4(4ZSPP(eRH!C z@L4qHHcnerheb6FvNx9xKAH0 zYHb^IK4#W0^>~Oav$q?XZ9LpK;j?X3(W+XY{PxY8hu=QmVieg70WS5!xK~9!Go#bG zNJK|2^YHm@@?~Kb7T4`njF{Wpi{QhI8jf;l$Oi??r^sf7|5+Fl7fn8sk_vO>hBEdk zcICqLn>nu5mFhL-x_8JVs9rvIrtWuw=p5OTh=PljN55k;k7aJVr;{Y%T+CGAN{Rqn zHvIIBf#PN@PNSSaL_GRsby48X-GJ31z4!vx-($rIOh3s@{9BTtK5pKC z@g!oRuc0~B`en1F#Qe7Qq3&=OqjgXYmjwaxAG2F^x~7z(ubT6M@7-9TgztZ>5n~q2^r5}3BeMj za<#-@7~wg_K3adbdHqxhlp;!dW`RpGvNco_tLD{S*2E<}q*9#D3x!Q=qxcfr;*Uw~Cfv$E!W)HH) z(5eW@zu`Uy8QklJ@caPQiE7ZP4KJOA3IC H4o>~~{=zoe1dOR-CgddY z;mh6A32d`~-uD;u7=aj&Lx=Qa&*wF$7=o;=cipN@9U4Jh5%lfl@iCcn>u~wn!rCDE z422Rygv6Qz>5XPK?m`AMHr%Gjvr))y0H;u7Lr@GMxS}EL6PjPB ze&%ulovvE;1?0Wf<-QmY#9cCvHZ1ljLIivJ6_p~B3u=IX zU&L=HznyelkHYe|K9Y~{kZPY|frQAW?fnOA(_Km3-QC6~puV}HGqCcNcz0~1#4S$r ztSc0kYox;CGO4*JjcnEWU(|*6WHx{ZFTead@?2$EPm~PI&`clyvo%uY^8IgR)?r2h zTmYi7W=1Wk0YWKwR_*#}7efGBw3oww&VJl$A0l6pMHZ6%9MrVJA$ z_r^-nYu)81i(C1P41>0vDurwZv;2H4%t8$tcN>J5l;&&TM5$ESQTHyF#o}I36NmPkb;wzy!HCl32kqR?xk zD)SY`A3r)i?SOF3R6T6T^T{eVw|1dAcC}`TxldgiyY;M5)tDE))81YZXa)00G|Y%^ zt=o6`n?Fk3{O*bb-ld4gB|P)<9mP|>KHMemL>E|nY$u3zCdWEsOf|CI&Q^^of)iDG!# zDvu}>x)TpXDX!POm~ekh?ABvu$8H^U1L4lL>*QkpY7Y@@e(dXY6Sxi0e0CAt*~Fww ztz1$4;sU<@vh(}f*RIdyBk3%0s;Os$Wxv6ckIsy{ZpQ)N+6iU#e7?`mNUX~VIz8kN z@ey5laD9I_^pEIC32N0H1V-Xo9rk^zMHR60WIak%SMqtDM6WxPMc#|U%rz_+KNS!k z$t()mfdEk1c~h}r^kHd0ZS_166M{r_sok&XO7C-P1{|uc)bH*Ju(qB!aJi~2B!X`> zQ8J!v84`W$%j$~>kfdmt%iG*(BE_C0PTS{2d-lojdTr1*WN2^G#C3$W7veaLC zVB>3>GVaHbJzEV!(bKA-ganBIB6f)-rle`L=5Xqzgeg%x0CC9p%IFE}fo@TpqTKDwUix@OH$k~J5ze~I1Tk+LAQ!$+`$2Z)HCV8C|{C_0|(tk0X~n#c#A z2Yf4$PRG_Z>nP1l_T-g6zp`86`ui1Cl=r=gZTo;2mX_43{0L&80eF?(Fm%X@oHLF| z+y^BGi6jB|`-;V|Bw_kN2O1jY;vhZ8WNM$-_0H#&3Ftul{%u6&fL&Fp6XG<%fk&SWy=_#GLLEu|dA84XJ^dy0ju^AZ*Z{mzWHWHb)iBdcvBJ8D zm;i#7EW7tjx1E3h{eY_4QDzA+dwZVii)-dQZyJmmPx?*_QH40awzx1<1=!f!phs#AW> zO$T(d<7TeyCcdAS?4WH3S)p*0!m z*yn(Zy8g-EOLQp>t9u!#;+85?mbc?Lhj20KD#VN-soLKZh1n73LNheeDRM17S z%Q|!ypWVF^^r;_4-y&eCT;Z-(v$O_)Ac#=hW$Ia|;JKer)z7xu_*XL!kXlY5bIxFI zk1{CWCpIuZ3R^bs@Ffb%bgVpO?Q&jkVKr5LNbCo6CUl zc9wl_2||s4+^FHDBTbR1JM|DK#Iyt*~`FO;4}_WACW4KWAz{JFXE&4 z>3*fFqYs-;*@Qr2?<{W6@*46nwSn%}C6Qkd3!3Yw@nUTWs*N^}Ql&Tvq4pW~#|v_N z?o{TDlOAbm6u;!AWfkbQ+nHMZ3S}R5XXy|C2}GK1u!VLz${^&xDMkH^U)ce*%f_(p zfN{dT$17`d!=inOOsI|C$XL9Ee7aA(=R{9-;_{#Z?!!kt%>$lD>PT$Squx$HrQ7zY z)^3%VHM+4x-H~62?8uP1v`UtPByA}6`*IJuA-qwDKLL7FK+_Z^x{Z(%ovJt=Pr_(stAN`eFKp8^fW0gH1R)GcPx5qyB(nGV zE&zbb5R|?f)OjrNkt$Q>f zh7jPYJx|cCt3p)+@(96()O))nu8eO$Z`M>r$!^gStJLk>^Dhu*0v0&zG06SwUj!ia zUXgi_XF0r{M)oLTCvfe?4LK#EuU?U1`e&vg{6oM21p#7#wv9FQEbR{{JUe(W>BH!T%1Y-o&LD-ZWBm8IJ<}y@kmH~&%9a>&zKGud! z=3+%x%j}x2`2XNL`5Xm3ml+K=j5Ju`aeY$|Pr^!!|bM0}>+i92_-H-YG z9?|N}^(8zYG=!^vz9SmbBK{8PLp-&@jNuU&o|Zdqv0-vYUo@E8p_GuJ!T0;sS8cG04@Ish@IqFwHQE*lhD zAtFZ|o~7Mj;eBXanE^0p8cMC&wtn)_lNwOh+YbMD7mPDI`+6F>exSl~-Q7eVVWRGU zJp&k4MuOiZ>k=kNC9HeCtH2*f!oaMn8XhzZdaB0Zp`($fbTQ24( zp(6@lSazV8`%X)#KM$ZQTgwv!0IN{w(A1^}Ir^eOZh24-Sg-q?jgxTg7csovdB*GV z5VXV~_zFnue^poCJrHovb@V3(asklgYB_juC-~)yrjMespwdBL4W|or!>iD~`^;|u?e$m9@yv!#DuQ=J3Zj<_@sVdr?6Q1V_ z|GSp&-HCdk7%QR?xiG&WRkb^3c;{>2AJt@e){4ODV0DOJp!%QfFCvNg?Iry3q0<JP|zpo`dC$;`6}VptaPWmliyDICkMq8TlOqep`|{RLRs&0GqNq_Vs|HCiLRt> zZX_jz91x=?$k~5M$r9%G-s%@33i3VLoKMI^x5dG*@5Uw*o{Rf`@bdpDJ) zUAk%O-;C3%G<}IMFA;0A|Kb#5@?taNXDsq2=@oUMr-BFXV15cqe^Bu~0hq4+OH4}1ZQrY#4Ui$I_ zAi$ZRqpm?F4z0sv2%~!WuLjY8CcDnd49H@;iE#-s>UUybq`%>!p{2gRvEa;jWPKW-&Ib7~55v8kLxIK_tS*np!UkT*&4hzd&~HvIaeov_ zeDY@JVWg?lq?Vl3Ut~?+`n0;5r7P#IFdRf614x1v!`@@B-n@OQ30fTl3BuxreiLwjQ~}L=5s(g?rNu` z_XOH64i7v=3Q7j^V%y1ysfKVh==11!{m`V)YK2%&wdz_-)NuA=F0Cj_2W14p6+(o! zJ=mJHdsjhZ2E47Wp>-@lrgmVfKTi{ zSv?jAVczQdk7R68@P6yCuPltPb)wiizk0{2yT#LyUQjN4I%7a=NZO+E;Zoc5V z=v^12{wtO}v|ju6l#mIN{o&zPa;C4kv!g$&EG}ICHY4-ft|`7k+xX&T-!tz*Z;oM3 z9B|x`zO0seRf@${^Sjxu&(_KOXg)!~``kVB6cnu*!`JU#SgZ~>+!R~%o-8e@<2227 z1!m!DPk66P(pCMwz+)I(r}E=L$LGU7-MK%LG0HIE9N$)mzWcp(gkds4a-X+xF)*aH z^h!NVc6`*XgkPLTSqvTKY++vUosfmN_RqcyZqHZxN{@gqjryhpgALcE72@*=1==6g zzVSaKwqoMp^B3bweuD4BIm7PBCKrn;K~E>A!Bf2Bx38VhcXZ|qIY9PGbQ;@s9uPaV z@tpZu)&Lk1*siVA9$gIQ>|D)EY;;n;AGz`ougpzQ7n`UL4LB0EOmjjskNMTIUX>Wd zr$22=BXVyPoA64qQpBFs$lxs=L>D$_y3~>*mD^4t5m{79q0YHMS6qi#au2UFXK?%uWuy*GS>OWgYbQay?&g@yW~} z6GLTLK4<0%?JtiTITN~f7w@8A0Fg%R?(~b50*T*JSZl7mQU8cH?qxe0m8|P~8u{B%tV;Pfb@qHf5Jp1>CRY$Ji zl;@-S=w%enN{<#Dp*S(wVoHko`0-lU1b7ZS{3T~+{P1H{VWl7A_Y~4t|8{tDbk(sU zlAzYsV*6OC=r)Lg4*b8=cLbtAKZbw`8Y`iob)sBx{&jRkyHUi=EJH_hr~ z{wA2UIy1zG%o11HURfVwH~uIvfuX9_CaI<-EsA{vqoaerXD7KiP?1XnPU$TPnMz9k7sbu+MSIUkQB|a3_wRezhY`)aNKU8l~P{F)Q z@!?_nUvHXz7nw)>NK1eey(SE8V(d_NMAV=hd-GhS&(1g1jV&s=#d}xzn;c_~P01@e zKDnORHu;&$ju^Gt>=G_)qw-PAEcVX80V2<}Gf`Jmm8I{(hVYtfrQf1AfbRXNF$91s0c`d2-4l%9nxLWjr1blvGzIl-1EElz5ncw z8(8ZbbIuXZc%CuX$3OWjC_A;42DUN#>`FR+#Y9$c#e3tSwdN1?Qb8kbhGPm>@xKGi zy?iI~78Ba`!dGQvWJYW3(Zwd0>o0fSeUFYVaN>?C$P!G`B}d0P`vCKv3oL|O7lf)t zELGKeej9x)X?;Pe-D4V_cr zfg2A}NRXWGjO22j@TW_m=Kt1s!94mTBZ%xw!K%p2VtfSY`2;D1kk)=Y9%1-E=2L8d zj>ol@rgmP9oi(0NOk8UU&v!<%xpuMF&L#GsRUo@o(G7&)SF7##j=!3860b4ttEJ7R z^(}Xp&_{65dDuy+$jpTOx@h@vr}IVCd+u;9gIdbRtpzNsJ9YF4Z@5H(w3I%2J=x2HCH><=c+9Yt`7$m|RHozN}dfg2s%o zPO_tTpy^$@YxLl$>^$yud(5meS9jzFrGy>**43%U4<6j|yGG}~r7fBSLx!7cD0uf{cBK{q8CW+iP((cH;pm7zyrdZpq49HLu8()`-n}Vlebq~v)&Qs|rjung59nj7 z<2YROzKzsqQz<*-`1mwE9JI-Xw)s5H`qge!z6_163=9m!FvO<5xYJ~GJE8oZj*v&h zgOab%fBYH^H!TiM;CF5_w4ONOA3HBKi$C%frGRZhMv26>LR=x2U~;RBpcf2*fi+Km zf7xbl;Q768uZqhUSg&8d{+H(GVX==bate zBWur!EetJuqxpTjhoc3}KEeIZwJXg%!%ezc^Ob-?JgH!{!*z=utjzj9R%W8oh4+ua z{0pE#D@XJ$@EYQ|$A4wIM9LgO(|?I6{E9etkM zCy=wrjm*_C3?7l`is7XxDQUh|E$l<|bv}(Ic)ZWu*P&?glfqJ6sV!RFz<$MOM0X4; z#_-wa?SY~OtAC>JHqOw01Zg;4Pyum4CfV- zycjpkg9@EsGk+Je7l6al+B0?9m!~fd%s70{xz5`bp~BO)x>xyUEnOEnA(&sm-}qU38C>`PVB)6kL|N4!H?}jv~*Wf178jdCC*= zC6)14d#mn(c~G(YIfPF7y$$)M?Ka><7S=I}ocJjdo$H~7z_-C(&c?~9a+;q!^Ju-=&R z_>Q@r-gvZA%n|=$wMWvfeArGuoTN(3X}7M}*gggKYf~6gp07==5au#UsCdrj3^P z5Jxmiv+&wERxk!a4BsVWjZ>w3le_15Yfc)A760kVtX`-QE#5tY!P}hoH@hd;{a^Qg z5-Y^OgLDf6_NjmFr*!pFDYjYO9Wl&bF>%q9Z8z zvwAy9!F%Q}dTse8YEP(Qzf=!lJBs%=+27z&d3oS8uhottc*SzQJ zBrNG9L=5w4V<U^Q{L|C-EynrKDx%SH4W`6G&sXAN*r478Zy9F&K9G z%;eA8M)nef?8&5#yf8=RJ?3{Vby%{OSt4)zaru21_f)s%;+$~U>GTSs!hSR0;`|%Q zZFLP&%(@|4*_4;zWAsP|8Bq=|QQIG4XY_(T!ZRhe!On-^Kak1?R*oXb|021#%(JqI zsK`Uhj*r<5Uldt5cBi{|rKjJGWfQJ1{~Fd`b%xwCT>N-vrN5ePB!uMbGp0L5#q<6{ zp^P7$PUZm)$J>hsG1w{FL#fnqva*I2r65h|$=@V3Sg{#YynX#H8HWaer|2@%C#rNC z4OB?cB&+%;sNl`N&b<$W?dUMi?PyzaR)2*ACS_7s-kLVpA5BLEKCGf@7>Sw`$80pr z(lxzsK%1`fmC4cM?$RnZ@g%$Ri=AP1s%Fa-YPiy&dodBD*re;vo`dCqG-5m&Jy7nQ+hFE zc32`8Q(740yx+!<^;pMPby$mmD&bLug}X#;mB89iwy*bTseZ%pmo%kTQh{OBmESe^ zpdkrN@#r?Grpd}KxCm)_xaeQKL(YYUFzUdT6w^>=y}atGFn48X>DeAn7@?``XIaaC zvKkuX^Gb-6NjILpNc0r$TuWO^;;xL1?IZu@Ger^QrwdXGA!+zC`IE+veFAiz!;3DD5WDP>^yQD@dg66;4`abG5Xzs8>2u z$Xugp%4tRUwV4l$5Y&h`A5r|c_w%EOs;X90%Gn&PO_-)rB%tSdv#AL7~*NK&D&(Yz9hvzQzFr$Z{zlrObsa>VSH)37EEcC z;B@JZ9rJF5=jp_J+DFdie1`G4TCBi_9bUqV+nM9vl6R#7B@GN(Vp$*KuLfLNWB7|< zAi5GnrRSo%pT`^?w65ZWnlEhS!#OGVkwLB0JUV)Fcv#hRI*YjE-CyJS0?m>wgU*$g zS1+Emwksax^d{8m0Z4`L1V_+Ut!Wb8*%A3vfuGt}@XSfZByW2PO`2TNRYq5$O^vBh zfo6eis6fza>Bi`cG{nU%3bW4rA0HZzR#|gosqA<0b8{P4PYmLB>P69tC%{q<4)PV( zKaLiGe%5SSFl#BbM2$fArmugkVpJSA1kEmOeI?91xzAT$vM5#D0A+plJ#D72{G{0+ zvz;qV;nO7^x(-c<{M%?5~%!N|4IiLqNSyE-W}J`wV8uTC-N-ESP7VUh}i z_~#}T%^a;*wyV&+o#(0tLgldOGDUTkgl)U2s$wZMYGP!V}D-cB7|>E!F3bw&qchn zy^FOn3yqGGs=x`|W^z}Ksz0!IzVj{Fu;+ki*(E_#B%&FtMR6x31r?iez-n0f8;NUl z0@%`53Gcr@_ISUu!;R|DUMY2i3bn6ZqYNzkMUaUBiq4~gf|9LY+@HMW;Tk2b~x33FS`PTd{4lf)T z&h_$mvA}yblQ99QF?8=C0l^_|FVlQ$NF6)^qD&?SX=}1lQ0{ZKf9)JR6tZ}<1E2Be z@BCwRP0iJ8`KOU0-z`KBe|q?1Rv1$nYigFS(nK%Ft7Hll5<49~H}N6bWlVJ7d;1t2 zybnht`lhL5a$6fqL~upUq~c;v4=J(Bq6h#PUTEhonXhO(|Lk-_cM)j_f+1A2G4{5n z-|zXE>7NwJZQa3+xF6mTK07C&dv{$(p+*CRas`-A)1lC z&0~1_gZ1f?A6h%5Vl~v<1BvKqC7U^ZRm?k#8;>5oE(%3?nUwQa0dRDZ#^-FueS;#$ zW_B&C;po6QFmL*OTz15g`9nH5Y2l&p+b1Zu(cEE=C^O%%Un|SdmZ;oZhu0~Zus)dH zo=UYQ((j`voEq5Ri<<;Jlt))83mXv#hX9 zOh!YKTtt8nb3In?)y$YC&%YU#+SL#fP>KQ;)(e?B=QOkj=&-laSMiCW<4@@`k z8d8bygA=V*Ni$LSqL@e=ctB5`cOZw75oAOE2z|L(f@HgT2*G)zOMNBzYIZaLYL zJq+jN%YVb})i1ws5`1TcRtX-xE$ne&O%Q0yq<)1=DslrKK*`CScsKLjKBS7bkHBhN z37S&V%Rj}veFq0?e5dyvd6_(1~118iKEb2 z9%AAzSprqLB+Ii>#FCzSxV9p|Px-36J`4XPTWKagNs^;o z8`!+XmN(t1aA1;p>5yYnAMeK*W+xo-z)m<6e~2I|ZkuZ<>~)XgI9DkY9?*%` zr*w{dTdIAJ#BEiuX{>7}zYY4TQ%>Vv?JEe=@t+J!Jr11(FQGH7foZ%1^(Ks|3V(Nz zAmP>m|3X7_$ME;3MOqm{g{nTz!yA>v04Fx{+efiGcQC13OAv?(htPlj|Wfd7-o|1?o9_S8!m+t)oE_Vpmk_Xj2ZcNs)`1M zfdwj=*uJJBpq22;Cz;IC*oywc|5emsyYQyhm03TBoBTF#mDYozRa?wZE<~)b3oY6* z7usx(w!L^cBJt(PHr+1$4fqjjcW6*hE7Obx!ZSmK4bNQ$L`XWi@(1lrP2Uf0LSF$I z?kFA-I8+T4`x~t%4O5PW5t3s%&6?m^oH~n0WR7{q-IJKvvivDhCUy})rx{@zM0Rimj>}J&B z!D~3iHEu3f5b_B)iqF2%hd|EK?;r)<~2jQL{2Lr*(F7f+b~}O*xMq^=39j4{<}r{~kZR*%{K! z{CbX};CcU|(3K7gBnm%z>)(49>O%Ldcdtd@+x9p0;qC!mjTER6KPA9%m>e(Mrbj)% zutnuu;e9Rtk{U<1F(k+SWL=WI8Sby4J0 zC}Uo<1Sl11l+LUTH+TN`drnNJ9!tbB?sk%|6SsTG7Vr?zu*L|DBXc;b6()!5T%2S5 z{P|N4P&{_Lm-El-*>_I`EKamAu1?Fq;8B#Kwa% z_1{B_Z~e7hjaq|Qa}9@XCtXOPKOR@O^R1seJMn=jr-kG=2-B&8s0L^8XI?#OhS7o-Hd_qJ0?9hu>U|rx2DQUR}2d= zTWF1U6`wX3UqbWVo(CSc%a%b&&ShWNC^RWL+>-2aX5%yeZoh5fiD#a%)o{RqG+Sk* z{ww*RsVVfy^E2$rWahc8{ObtCsT5W`uRjNy10)d#T>sW(T=PUgbjW?d=~@ z(2;^dm+o^Sj&~RF#_czJd$dm*%;F4Y@n^hQ1UP98TjUzcJ@JnBS9yU(lW%+E&aRnH zhEQuWktdaW)4+n5lsz3>wY8Q!Mnn0iy`9TE^X6A%Wkc!Gn%{pBQuJ`mRH-l*y_>*? zX1XIQWvhEaTcTDNus0v9mrUKz`CKF(3Q=Cr#j0Q$uSu^V1d;&(0S})&!+keZ)9HM0 z<^IHTDW!^y)=(B(MpbRnMlC+m&u_}d`NJdT&|4ZBby2~9kFU7@b0%pmEinS>eUrwz zLl{Z)C`f(Ha1S%^q47C8};XgFR#NNwJvdpS|7Zn&&(Sv1(xbuPaOU6 zyXlZjHFS+s9{~Ts4jFg8Ik6dna_6BY#C%O@++o&>Yxqsg&5WF!v>ybw^?Jk{VN;=b zu6K`a9jR)#zq5~IH8&-33=PK?@*sw(o%COxSZ(WIgFkHYb6guL3~Hz#?J$Xjxdqg% z{)9NJF2R)jMR(^JpjHLR82Z&Or;@H4Z#l$Tt#n2DKY_5y=*utYccjd4+tL|NH;SK=UI>RlrEjQ$Y~RA|ro zDm6<=($%@CU>GbGBBxI_?Loq4-N2IG4j-ahTpkx^rl+DuwB-#0c;F@J**AnC)YL^mcj-1TSR3803 zFk}51rep=v-9J(CMseu=Dmh7##9?@t@DIcW{|O_3L?`q6cOeG}3BpT42^#|kydw1QOw>z1jArO{a|BKwWo z!HX(Ks~Rov;g!ILUZ1g&)bp(FB66l*sGOGw*g2VumlzT*aqYM9@X~N`|7C=!V}?fa zm&Wo^&pOoVdFX8o$dHHibBxUNJ4-ZRP3R$pWK(l040(NidLRQl-C_~4@d*F59gQla z{7rIhsMN~ubV1eJgL++AHT}B8FXmB@RA#-ZrZwq_Z?#e2Lfp?(jduIRxtUWz z?VUcboM;w$0V6Dn9(+~}XYFBUTReWso3~v@j5>s&PoI`q{l$gy>lM%Sm1yLo!0V`= zP-Gg4$o&W9dryBlQeFk$?;z(7=7-k=J+Eg12;7H{6rC$oU_#2buY0DNA%`o&fpJ{W zZ?|>NinHtmyL^jpkQ(YQ5s?gqR!I-Wrs-6mNKot)!BaGn%a{l9O2mDj4CF!IISb7g zSB;z;xAXbd+gm!Nrguxsr!YO)NK)k}eih;Sm4(>dZ5=OOG{8VDMQPL?YHe@dach8Z zeg|-1Ci(bwFM}AP3bG;&bdTcseeoHS;rGbA_AX8N9S??1G!5piPN}}Pr+v0vh!UZ?$ zy-)J>B0MaOUeivlRN@0{^Wc1DO%Ec@XX^l<+)ub@L?F;i&c}Rno&f;$JeEgxGn&P> z_`F%h>IlTldyFyoVe?H2y5BkDT*4}B%*BaQX8NCUn%lk}b2o06tK^>Q&7 z-VHD%su4ERXQM1@(npMuC=uFf=Zu`h_m>Q4wWaF>2%$VnwvLFq+4m$lIPjBO<&CP% ze6n|O$;&okF*JtLKGa(GovSR?~3asdyG z%WVD@HHcia%GXQ3JNE3-%225v=afB!R zX6lM8SvQ&12$a~tbfRVm&DOln>36jVolmS!9>ZIWy_8dG1MUF-G_-H99Buj!f)ShuxnLOUuu4tJz@y8hKB(P#@1IBD4>-zhzpth==MNYQv80zF{HV#vAu-Vl{KDn)4Y>ZAoE0W=$ z4XgP-3@d7dZje`?>4S z{ET771huc+9fF!(_mgLEb5)pv}$zhB|y zU0k+La=z%YxDKIra|fyHs4$w9#veZdy4;;gqZ}6+GnvN`T z!%|)hxWtL5T4?HX%PU^wp#!uB!;w%S#qBS2;S{k1v?mQP=RD(ZEGRGWo#<$fYZnV& z)va-r8X%(?yCkF=P5SJ+r@vzODP}fxx3sXR$TPQ>@*Ai2%Qrgm5l_jvv>QKZ?5S`j z12!}AZ<~F*p|iZZNv{#br_TptL>b=em}!PcxLnXd@9msC%iY%TmT_Dv!7M*-?`oNe zw$3%JzEtX=C5?{Xs<~sH)u)7JRjx|~S_6j%UkUC2Bj)bLz~jelT|^^aN)|^Up3a{f zz+;xrpmXE5trSv-;rV>TM)Pa?uS6JNJ;N4-kqd8nbGmVHCN8R7=mt`IUpTqGH+)Rk z2#hSgn(cMgePMFLm;F6goaA=vV9aVu%cP@;36*;r*=7ihd+Q<|vquKKt|y+*Xr&qN zIu1*&l7Go)e)r?NIXy@dZgQU~_|ivSJyC1V!p+SR1TG2EUY{gaO?N! zD`W~sC$`QjOW&rh(44GM}cB+b-!1q!rIJ??HK8t z1clURwQnj*vS*jqQwpRqU~HbyQZ3ejM`rT9sp%dvFa`B3_?h3{d4Zrs8qO^O;eB=g z#YxvYZ4o`VOxdvAi|<=2>SRC$O5$lFNB9v^`2?@4<@YYbll*ft?LUN{)tYoJ$V&qj0KSrkn0%iCBG$n}HKaT{W{Zu9u8P}O^$(6PO z*5zYc{=IUO*ROpvc$p1%65Y);7wHO6WlD~ik-HeTjO{Os{k^@#9n25(qr4G$tsfi?4WN z9VnGgPds^N%BEuUK}7PTIGpt2{ZhA`R&jYrfHBOu3{M3fTb;$)`>wdn7U!@|TObU6 zIKQleisCb=nrK$7G$KEI8f;IOn(LID-yn(=Kt-`%qrz2QnD1%?Pghsmt+IrQ3aVZ+ zoTI~fa{AO#!<^)iKw-s3j#)NmPkAK_TBjV6>_o4|Q)9wG--^ zsQoco-tF(@ioF`*n3_9(wa9Dmz*= zLYl1#kq&AWAs@=ig+=Vm@epZhrDV?{*pu$nz9lu;nA-FQO3Yo?)Zk)L_;pY>)d=oY zWPx43)8;Hk%iP2Dc32a&DcVlMLk5oCCvf+) zR9@qC>lBZTlu4JdeV_uO@Infg$g8A9c3QJ$nY=@}ilWXo_jBr>3OL$vwOc zgUow*u%E$4g@qp({U%qq^#z60sH@+QnQIuM+MNqh|5Qr+C9kmXQN0)DAZJW;^wo6b zAEoQum95->TmtH$MAeqs>2wCHSHKECUB9zYKx&%SiToV%^!Cf9rj}d4Vly^I>YHdz z>KQq`eMc4#ZhGA=KdxPuUo_6USs1zC)80up%j*gR#OeoF(!6+aw(EA~)RQgu} zXB_1VNbskdo9^$*dBL!B)5+2JuV1~6j|o{`6+H==l(zY*%=&2RWKy;gth6s~H^8m% z9(0Tp#HAC>)<>AWJlWY@G=seJMN-wgf@3xDZee>5ir$qL_P6FuLUxZv^zdDy)LxOB zZpn_O2BvrKYE6BC0lX|PoBDspNMkcx`v-O_PPVrBL9?m0_lUiv(lP(Z)2APNAL-xV zGEROG)lf=^xc?Lj>$@>=VunI=6>l|UPa)c6h>or?&04G)@e-J{Bz#DnzA36_T+cwr z?Yi&~q2*Tt#j|z(v0x??!D5RW1#@(DcMowghP9*Cm8qqL1;GB6i7Pj2o_F+E5B}uP zjodqSDQcuT5m|nt8Pd{P+j@FL_gT`zT}WuujP&O(4!MpO(vq_0*vE$lgGI_W3iG7^ z!6`ha_*bTM`#R2#AJg@tO*diB6xv(1%TuuISJ!q}pJ+^*z$|SE*C+Q~&s=V>D-$)F zXW^?_X61gWxv?U9&5uq#NvXBuyXZvs@0dMlSvfiB%MXmB_jrJ(P!Ao_hpzstzWj^` zYVfT&mAwXo>KmT{S~X-Qn5YtznxkKfY37PFHyYP~8B*$S(z2zWt@M9We;2J)Bi7fg1|fOjG)q$jB~knc6wxR#V;zWfz4^`kU)fsd$~Q zCx5(5zXlY$H(xE^lQfH;Dc@Cynh98fJxMF!`soZQH@BcX4O>s?t9H;7l~Z|*9HIcekJK~_wW2aZ)^eU;fI?4=Wl(^JXwDK z_rdy~kMNm}2=fH?_5b7IyXYN;|9UCz${#+IS_4%BM#tbZ`d#bl+jidFr^uNp^L-o| zKkL4Ou1?DFF+(M8ZbOTB)7{ed3T78+#3gJ%UgK^o1Tg(EG$#y%E8PD3PJgfkKEy4h zuw@8;HpD4tzH(nVUF#`~?E2k$yqwTkW_v^nz;Gf^V$xm>QNTq9E8_XUL&}PYF(8@h z!5Ao3mF+B}C`|yTS#7&x$BVi7JtJjHG{z?{GMk{h^K8`U)TQ~)Yie-^TyQ1U%QN(& zV`D!`%<%clhOzlG)H?I+531>WOy^-}c$w3>F2)p|%)=(l!Sv0K(frywF6(4@MMa9` z@tn&N2x<{mYM^K)Ib=t#jFkTBShV?(_2Lm&kvofQyUT*UFyci=@)X{LR)rn@CD5*v zmHE~N9Uj?(qIx_99rO;x>owr(!hZEKu&hV`5ws30HYuA*U7fo}U31E_k`igU#Y-SW z%rA9&Sg#+}1_THB+umX3Ggl-$KRN8M(N!)7`~})@NW;kcJP0YnJ6|9bu#wY6)jG9q zr+$SVm)^6p{=ohGR8+(_n5juMl&SUz(jz#GKWwzY128MZH8=idF7uGYKq&qqaGW`= zmXrM+y`)tBP8|rm*j2%zmse4y4;b(F;S~R_)#du;$o?yDV||2Jz1qRMrPW~gQ#*@l zmyCXN$&sLTh{EgFH+tevv67Oso@41=4CiQ*1XEt5I?xr^x&p1o59)fRRkac(e|2Jge*od^3(*h*S8bJgaE+|qRcE06cuUe`B$Kwrax0KRo&#I zSdfC!=6)1{9lB*%#lt>$pRM87;ERXT;{i+!nNRUPpqr>iN?$!{UHKx-H%+G9;Su%R z55^gf7B73wiU1lmT4E%=u~|S~xVt-Kb|(D#8Zfl}4Ia+gC|{5~s1dZt1t6mKkB2S! z{Myj{`d$kZXvZGScr%X*=;rC~YGr*~$!Xd{=a};*KDiCvoFd{o_0-ue|~n z*TXGQ2zlI;ITOZeOF7?Gv2%a=y*yc{^WR3_Hm`=<`unI0ON> z&=$qZpxJz9ZHNk34&;FGbw!BV?$T#vXCoB)8j1T*tR zH6=Cm25G8xr8|jIs`XgLvAH%h!7OvwWD1EB>ZY7JC)|AbO08|+S1%DDm#*gyEEoki zm?xkpN|HUgK$LkF=u2O%OMl?xBkn>_n_W42(i*biSM4@TL44;r4givY5TYPFlccXE zg1rGBI9Dg-K~`7XWyk7Dy^Lycb_}sI|1JxRlU5P*d%#!co&jq?Q(&6Bb z?*04#Yk zXqQ?IP`fhM1u)`;kckf}ECiY07M7&X_R^;rDV0R7@JpZ1+j5cX_G|mX>;d+`1xQoN z6@Z{6M+fiqqG`-9$2Xq3)So{SD^t$A0+1wh4 z3xl!s`PI6qQeaa0f!Fy9SqrtKwO_d0dbMgIKre_%Q_7K?8D$r0;FkA92)pWGJqx!% zBu<>mP0TZT5EkZ_px~W`d@TxBV&?hZbB1NEiy{clJ*(0j8hZ(e-p0$uFy`Jt+63s) z#mK|@%HlEU?)-1HM9X;UF%gu*G+j8he%IzpusNYO9lN^0v;})o#PO{^>(vhX{k6X4&oTcaGI$jf7>HSiseG_9Ev&iz?ipd*+sQJCi&tWyM&lWauh1>Vi}W<= zVG{=bHGKRU=>$)z8uf*Z_cHm{sDq{YG7bdw2n2Z~YnnzQru5@a{_3&U;CJ`jwT5Th z_J(WO70u?(G)zZINMlCIUbq3uO${@;h`gUq94KFgwPNbcJD&R3R4SK zd%|O9Ulod6tcYUdTmQwzcl!k1Z`2ib9IE!%t{YEjnNZV7sblcxF&t)WM{igSkl_b$ z#!Vzc_{=W)_R>j%XtqdjmFgeE4;SvrMiC{z*re2QB;JL?+o)#EZ8D4hOd z>)-^z=IisiOxoP$7!w1SMX^HpDKz4v1`3{D&t)p>>m~duB$o^4bm>H>8w^!0R(Syj zv<2KUNd8uF*H6sHft2^`aH=T6NG%u4$at}ZuQf?3BkXro7o;BOBkyr@e}J3-;FrwZ zn;^^BfJ!+c^67WNUCg4|+Ep9Z9!x6=TUl@wB^>K7(iEixazO=Z6~j#k#r4N^$e?E* zYR0J(c0(3XI*E>X67XY?P9YGDegw+p)a`D39@lR}Am#q@@89je;6}=94z42T`NP+< zE6sY*j_Je$p@2Ge@f>skYPr+&vuAhAfye@l^Ba;|6$%e1a&;f)>GXPEZZMB3{Q^by zN?$fFAYwZp91Bml6V{G0s&WTKAStwUxXAlVKY-;Qj5jSUDr@g>P4 zc9s)sa6b?t$Y0lC#nT*0hAb?6W3N30LyEW`Cz6Bv;T70_PhsNudul#VQ92&BCk?XV!};KYz~d5a(ol=W$}k+g*gJ+IJ`_z&j_RqVhkYyUsVxWYKx4 zWKvdVh2(jr6Z$T04xH$z9G~enFG*C=PiY)z<4r#BORmYwiC2YFc2SaH!DV348K1x% z+mr3rqPM!!?xM_6nKzJ9P&Fo~peUZmBOttMSr&KxMojVraG+VDEtg+%6s=zBPRPAw zlSOuN*VEh#Z8gZ#@ySZ>8H~~kXh)*F_A-!RAn?7vJw0{9%hicy;*tP?QWSmr_G#w! zuMol+G#P-xk81*Isd{=`BeHIsfHY%{#E4l4xOhg4WIiVUL@A7ciASdR zo%73+JpFmH!@9e@Pzi_;%=RrV4(~W;{I3LLfnfUw@_z20u~*v*>9uGG3lGb{TaVZ= zBcmWp;GJY*m6LpbeDiQi+y~ZCziCHuY#*YV(V4X?Lm;a#IcU#*#Ydu*suE;8I$MYd zgk6-_BH6Dt{j3V?OxC+{x77O_Izt&fc_6ws*AmOoDn|p0W2f`4ps~Nde^$Wa3ZgE_ zr+StL5_-gqD@Jz0&?xy$0Bp1ZlvXTlQbN0f(w^Wavm_cqQkSd5LM&YwH|lxn?~>OB z243K78j^g(fz#|CdBnsACErIuWbM1BIa+hqXGQ@52S~Wy2s*a;iaL5(tsiPbz29Kd zP%Rhp0lT~(*eJY;o-9-qhx$FvwVLln+cKLt{&R zxPnn0nc3aJn*_hR!)?zPB?In4jp0c4`w7cF!|?O@DZr_4To)^J4Wrz1td`#OQJ}IOnc#@Lg|SDnK;Nk$@2JISMK}L&uErz z8*E?*4rb3>KcFmna4E%TecWdKJemiO_p+1-@w-CB7R20Wkep6a37GB2om~jNn?$s< zG%zsiw!XMHu5oV+emIs^ZwX$tzEdrC&ST>SbieR}xNIKEx#7wD;E_Kv0kR1F)x_>>^xWl*(DSSr8>#L ziiGv=OtDoQ^lL2zTU9BUr( zEdyw%fa=x&B;C}{UxtA$)BpR1LcBy{40g^}Lu9|N>2MKojN|_3-LqmlQV>!n8T!u@ zZm4ivkJA5h{6f9*9V4);rGDkO{f55qe3s+bDj7m-_&6!RaKELRdnTLYs0MMwcX3A? zNcqlatfcf=GRpTRHS%&?d#wW>egtjkJzxb~lv`1xJQLO%45&A+#taf8B0G#Vl8MND zE$YUEz$4>m23-J(1(&VKk5#AA5PNybUPzC zAHcNOdhc7j?*a~iO970!`i>0Kl2Tz#@qn!N)>Orvq+IX3;e3=-v2M?J=y_;nw6hq8 z>(rjfbE?Zm{*zKI_~28OU-Jcl-h&u_&SiH8Q_bNt+f#X>&K{w}OFHutAXKT}W-c17AvFPfHuywmOJlcU3Ie!f7)NgERR}t#7S;fJm&=C=5 zrh9^PcyFu-rCl6dTMjm8zR^kY3pa#aG2?kE{auTWOCO(4=Iei6b4C%;9pfROMbuTq zCtCg+(ia=QcHERNl#mK-y)3_SMu2OszgobLK!9R5ue4O9(iKEOFO`&tX=nf@xifnG_3T1gCRh<$ee9 z5Cm|AJdYBK zfYv6Spk8eWrTSntVtEAt{ki~8)>%9`lcq!frlhH_6WO!*;)jnot4bE&I$gZEtZ9}B zwDAmatulAyElK-eccHyeLPo{6qG@rOlCfbqB5#IB?cXPG@X zPm~-VK*?Y#!TTucF2=MB*b`TQcTzP~PJMs{mWYA$^nzrUw>^6xX?P}ViSLiOkXRUfJqMo%~^>+4$=I}B*NCPsE|pUTU>IIV_i zlJQXxapR?ObZ+OlT-*kA!szIGyKP}b{a3)%$a_C``R&j1eK*&V?MXb(N^+neyx1(b z?fBy#AinknvQAY83WLj*Q>?q4<+-)$psH5WZvNb_tss$k zncAiL@0KmWT>?hC>RFoGLBJNB-wj_E+BW~So(X1pN}vSR ztPpDn zd%hzT6F5}}P-6!_pdavbuhxH2b`QkoIs3w}e1G2kcB^tlige!Bb-zT;Cw&AP0j>pr zp8Pl5Ao0Nq-g$rUiXLpb6xcA(YPK{W3rA7v6_z`xb8nO`JdQtq=@SIA1tj{qEQ&A< zgeq*Y7KPXkv!DG@4h;qMLLG2aMEOEmzcLLxbZaEZ$U0zt)=iff2tDw7&v2@J7P>QI zi>J+|m~OBt6BTQb&NBevCII#sD5nCT6HJoJheREnPLZ-szDA4N_EXN=~!g@K}qGd@;mIpkQ!L^ljdTghj-9)*T@-G5o=I5YR+ zh6i=4q$f6pFUEBdFYK2;u|9`*dMcBW;<0}8>~{%clKaWhAEQi+aTk~6(S2t^BJ3vY z{s-5w?-0@ZeqK0gU5pUj>fgE&dp4cBJm(ZL6;)l`y|uB`pmoU$+q3p3INyiK|Ss zm~dR3O=6TuR6DUdTIZgcEHGXBX)QAwrx7W?dEi)gmquuokuD+mE^du%x)x5d%B!of zV}?2jod$NYE?ony{=QR+T3T8^4vGXD-aRYG$+c&)e051cpM7?^tzo|{eE;j+GKU2< z?{5s=_J~m4W%p;|Sp`e|cLq#@A{b{*X!pWy^IIN9%bmcOi18_TXmV-Swj9un9drny zQ#Di-AjDtX+S8b7F?5t$d#a1|rtPYgGkm_37&O~N^Sp_zaM=Ep zmq&G?KYc6HqWa~p)ZNAIc=2qy^1hhn|d=pz?I%lwfNj zmHyTU&NEJWWPbToIYEgAn*$eb^<>U;SVCmC7O$3Ax66xMz* zMTbC)hD*3P%S8*R(u@~>@%OL%|JZx4u&B1JTNDEZ6j&}rBpW~k1SCsV5wM7oGpOXO za8I>H0l2Bx*)92p*f6u?qeY`LC;na(Mgrer0WAxE` zYpwUju0@N>!0YDNZ~6Od9hB+z(u!ZT?qIf?SQb%DkTMm@LRwusw_z1}BOGNGpj|c}U&@Xg;#iaL?vC~EBnf@Hz@M>R=1iyuz3@t)@ zKYPn5DP^8y)6AdTc&=%JK!I46x|?tE*5G7Owj#Q#^dAZuyg_ebYeG}~u?J_qUWw@| zRCboXf4{Y%!Q?z=u;>Ya!s)ik6iwRPJc058eVY5`G#k7&0`JoeHkZpLd0H+--EtMY zR;9ERKrUrJ+ITZ8ZDtj{$)NSLIKk+mx86->G3Ss)er3VZE#r!x#tE@;V1nzC8VhD1 z8gI^){o?JEiqMJr+iG+}+)r3_voUy$?Mqs8^x#sm^q$B@ZUG0XKUYViUS?dglz*W& zD<&o;3&vt(c)MmX-feW9JFtl;Tf|3|?9c5i4v<`Ru)lG}rpa~#CE=h?Om(hfwF-_W z&e#S7n8ScY^I0iWX83_}v{$#2g!PIut;^=NMO&-}AUwT$#JUV@M6%!vOA@Fa`jm2=*|y->J#x@FFcg0P*^mwIazAkdHco;2I7otTlZl}u* zkg?FS<4zQLDBBjF=Q5)txeo-zzh3)WVBp@o?YBOw>h0~#E%#=lb!G2&QIA26vdJ!$=Ps& zmop`!|2kzOZu3gWyLZ=Nm@I_SD?3U-@EY&WnHif7gd0 zkN+unMK9>UOu5?i&82t&f>8*Y97|%?$N8ySFYl$4o)4xm%mXniH)kBzjVpsxQ6x( zv+JsBnIs}b;xjnJq|Tt@-R5Ymgc#m+Od*@+%2;8-)<5ze z^xpm6R5U4>w%JLMH8V9Iz)ziS9#3uvR1GKqr42_lKlbjwPJ{PLq_$yKu#qib*Lu2; z{%(?8{EmTzMWlwp-tI0(JYPi8xf!_v<9;ZhM7-v0aw&|I713c#LRSa#H2SR$YJIna zeLIe#GQ0hh*#+YZrpFH2Z76FP~EY^VvIcd}Dza_$0G&_4L`ZJ@KVW9Hd>!_;eHaA90B!{aN3rRZPz23QR@}1O> zyrQDLkccU{G`NG-zbB*v;?D^oy&2w}4 z%_@0gp?B#O?L;{H!C~|D1J^~f+zmMQcONHX4~N@%-b-rHU1QRM4QVYA=Mgv3Ze!uQv(!cz3nRUVc(Lg$vkh{?S;e&cu69V~is48Y3 zc?{RXAI!%sk}Czc3i_~?$9WHKIftw6Y;|G-N>{c*FzK{1Ud`M$uq!-U>mA9(T~?!> zSFZ-6Zyso(5`JbwWTRtYaV%|%TO*HqPDHXF)Hq~3JA2b{*EJW$`tzeatV7fHv-VFO zDks*O@|#rU@k@|2@83^fo5SZWXmJj)&<$xu-;4v7LaW(&vn1iUoI^mB&0{d2f++M=; z&}vJBSot&BJ@bPUkKW@aPS|cGA7IiM`^`k7vl>_9${!W7_uAAIl-ppY>wdQ=rt(uz zV4u#mi9>dm2C1V>bEtHcub2X6;g{pRd(ZPMjLtpovlC1RAni$T!Mks#b)cXWSg2` z<9gQ2sN4aY$wN6zdc4TWNz}1_FHEmBi;hHt5HnvLjIjSV3)K_>y(34mF3{0szz6KF zG%~yP7N6LW_vE#U0@|+rNJEKBKcfjv?WaF~j1WVt?nnG6YBQXDRJmvUSD$qPEon82 zg@tC*j#S3gwG1aJX;J9GVE{P|(zPA(L6{GT!D6{wJSmPSAlq->b&r~YC;bo7yjPVWIOanK;r2aMGV+Q zT6@p7Vc*lgay*QC<=>VlzNOU~S9D!~^2}@udm2F=GvU4GPRDC_ADBD4)uuf#0I0dH z7XNX8&HdKVRE~uufl0gGlmOfL&)t}GP^8RbvyzoIB~$z*(qvR(8TZ3T0e1W4T8MXg zcJ>X}=szyCJS>vQ#~>%};uyA;-L|EZXJh=ktprG&As<-$bIy!3FWxoO>^b2-&Q0vG zS7OCe6WX6{DI^xypPTw{Mb4*oM?nacsV11Fp#GttAZ2ADr2Ab&K(1oJ3yDQv zV+=uB4g+FFVMwJ>nM3cUB@S=92Dol)TXaUNmfGvZSS+RrJ?lBkBIS0!yW5kFfguAI zKhv#F z>F+E&@n-8_JxcKt%;^34#D9HU`B{ha=8h(EI&aOW%lXyK?G`hLD*}iZ7wC**c%yyEruUpSaVy$DTwC|1!oZuU+2i;!l z5Lpa_>h)HPO)=^7^VPebwA8QZ51S_U@JIFaaZN?_xAPV@9RK&;`FZ*&X;Fl8`?d0%r_8!$rHoNE0fk~U7iGbe<;WIBI7jkUI3_-GMfVS;o9JyaFdUnH91 zA>6w4)oinn(Yq^dEdX(s9Nxpz1tmVtp!T0TljK|VTA4Hsoina_O=s1)Osd?JQYJ3!nTH-xdUsat4b2{R zshJZiN`g;DP0U#yg>jit@ws77LBSfM9CNR9g;q;Fi-xeQzV-RhufH3=k7+fWaM!8$ z~j#W~xz(c6e8@FDH5zwRC}K1RmTv)m9=<&T2e*^nso0 z`fPIHMD-JK_ocPU3GXHMT&8^_FADgo4hI5iM(I>usoS5f$4Dx3uaiz2R!7JTQZque z#skI$S!!hHSodx6^zo|5wU43kDbP_)AjGXVHa0D!Xl2ozcU4DDVG{48L;g84>PRTe z3YW22g7f{m1vdl*l{nQ7c~J_iaARuM2bLID`|q$S{X30$PCn-3@aWk8}S<5FmDQ8d+IrOl30&3EY0CjUop1p`awo41x%VNsbX9ccf^kZ@s-%Guo($POl1B+zwb{7V#c3QK^Xg-+ zG^J&gxM?=|{S}HAITZ^A>H}!~7O`2{Ssv6g?GZ-6O7=me)+B*EvRxNT^l*L5;sDOF z7zdvtTcg3JHB!8ohDG8@X}%JjGsGV=e!bPQ7EaW`N&gH;KbN8;L`a9nUVY$b>fTEb zYMzU;F3PcuPzVZpKiHn|tLoWQW+5K}1oUA)7AVqagkLR7qGXYlfwK`@Z@5lX!EzN% z8*$O_U z;KoL)&P)d(Gnq2VBy)i5%2AFXi~S%qFB-F&qm%-PNAv7wG8|EDmhJYmCqI>_Bm+ zOd7Me6rds<)2i)63gZw2%F8IrL$$U4d0Ofit^dr9y3)7pA%B7;E9R$pZV|3>_FLL(7typmW zohmGw%dzmJ z6noa2-qh80wNmwI^QDHjuucborTLxz%3J^So>KQMm124@jjkorb9C{NL`8t&Zrr$i zf5b`lfFS94fr)AFN9NU&6co>wp4>P4A0Okn;yl<9Re1^M(;wyM24}TrtIu3IlTBVz z(P_W?-8elnvs2-D4t_!H|M)#}YNEL74Ok!Cdifhu6Ljz+6%`v{zVJ8x^EGr8YSI6E zJ-z#%_X7DY-`hL?^K&6z`a*eb{tWV;|M9B0{GWFo`4;_sr1bcY*Uy)yHvS7}_e&+vvxc|5z6cqoT?woo?|C@ca*XjM4|Hr#NC;JBfzn^8QFjIHATVaiD zDY8TU=j*2|o~ZpG-XRbHtN!!#f1mdMkN3$Bj$`O@aI>o_5Y_u4o5i-3|DO+!f+DO@ z3xdQlkQZUUr!oM>=xbXzue0CyDazlE%uApY6p~8cHx84_Wfe8E|ZC3H2HIggC!%( zwgNNS-X_`d#XpbDSZ>d!`9Y*r$_UEQ#RcWm8FRJN(DR>I3L_=BZNDwpCm$+uDA!~o z_Tqq8b3eRnhVgFr=48_sdpf9=J{K%-Zm6^F)pG#~=Rq7U07zxpbx5z1?q+IFhVo*= z08Tq^{tOLy<@*?%t8NSF!3;u~3m#KbQ>Fe5R!}qQpQPD-fXUHb)tynI>)$Tbi-K~O zecgGYNY!_XwXg2rB%RMpj#AXk{CJU^9MVY~P;nfpo6mlyGe`s+zGTN*Z>hman_9R6 z`Lk-Guyo@n<4}E;%Unm)r;@vOzZ%v*E8gGVcb}dYfUZBis9K(E@VbMn)DYusZaxKI z2^Vr+(@yvrLE4q&#l|t$@#~sm*g`?Q$6{*dIm(lP*-Dnqh%cfu&_ylv?~3QXO(ACC zVEL|$DYEX&EO)u)377UH>XKDn^mt zUR0ynp`4+Vjjk4LB4?>2-~!0fxqxJ4dlwI4+I)ZiQ$O2gg4|s@m^$vWYuhW-h3zHV zjcl+j&$h$~1;P~kj2Khyk5@bCb>Ez2(A>^_&Z+0%khr_a_Nk(xg1xtNZ`nM`ADiCp zVm*PUkTOW*RcCKricG}50;8^;MZh~-1yJxo|A`lIOm8Zv&DmHWgoXbFSnq^=5vsdg( z3fHb)E!`b-2Z&#Qtgj^!|e59B95tHIa0y|y*$7zBE?;2g~#)!y+(64 zY+!1@ff@!BIeAcy8{vrK&YzzU8#8T;a1;J={kiptpGp8~Fsyc}4c*&W`f<(-mAO{v zS1IU&>&|U4ovhE>R;}Jz)xxiz2xBAkL^l>tDHnj4VS=A{I8&(Af;!!{1SdSe{-0Y7$jdD ze9oifDRx~{Cga`IlqzcK_is8jwu0Cp->Sd-31jYIUU$%?b0$w&zIFF+>%h` z4wt*fmuo&}N<~FeSX~Fn|L%6f)^h%tQ@1l{SbT3>z1m}y1Y~4;@@j1mJ-?M05oc81 zpWAsEN?$&dVVPTUkd)cb^>JVv`)gwe4S@*L-ak9Fb>1Z9Zv=IuW)j8Ey)8I;jGwW7 zuJR?Nc9F$1I(}2_8GMumsBf4LLx+a+LlSO*+jT){bsf;x{RQftmOmbi&LbDhrDeU; zoDx0Uz64Ctj%yZIfXrNLNPQVWyZ*>lXQg=Ybu2voCbIhO$?Wzl7Ok4v*X!2lH{QB- zP8?&rZBsG6{s8bPdvm%93ocPnHL!5)!=&gvz?`6&&xm#wR$i5naHSywMvoTx%~ZXF z1i+TbFrCfi;pOGxskxWA6`sW8oc!p<3=Z}rwXwatI@DLv$& zb(D?J$}-i0qG7R_Qivdvm;M?`n||jnw~{t!9|)`Nb;=A_JIa>rCUhoBn*p|yz1W{) z({q1sj^Q~cxS=^}0^5XRvr-p5B+F+dBdbK$x&C7vx{4#t^WW%=GOA}lc5r^!Iwjn~ zN8q4FtJ9*s8VW$Pq*FRxCgNC_5)=@2BQ-ij3jj0ay`f$-;B}p?J^Ll1Id1K~OO0Af zoJ6do=SsHc7zrlr!5$?g_KL3ZTsT=bV7EGwMsfiXlzLg~qNdb=ww{dBye1)GXhy?;Ws%$* zG9fD^#WRXL`8@vfV}e*iKTeT+fAnn~qr?}dJ8_X!qFsR|tZ)7?9>|m}x0}nat@_KW z+h%V4&r`jH7^NJGck~EF*q?3MkKI&N95u~QbX7lfx-##g^8~-Tr2lH%h=0!rx9Us| zm+T}I{@Jt>>N4}9P(;9SJphOYA-}*B7t|EG!`&> zbAP660@ZPmWiO@y6O%hZ0`%NFtA714LNUtNj-ntuAsimTD4-m*egogtjDwv8aJybm zZ~bUa#_q=AlTwHNf+gYE1R|zwFwgcH_3|V>a{}KMXAigf9YgV~?Zkeg#~^~$#dbGn z*Ba7QFU9;9x@a@u+#IGPtnj^Ca5!#iTE$?YZM{UOd10*b%wktz;4?Gy!%=lv?dHzW z>s4l4;qiMIi$!+B0w>;FOWSAE=^_A=c^1#DRq~j>$%5HZ5*g~wiyy+{LmBua@84gg ze{VMs{BF0#ypz+;!c4EsVTU`-<&#Fku1~G}dCT_2>rmYNw;*KH!=%J#MqQM17a;7A zd!1uETzY)!gt1D!`urUexC@K@)*o~a*3z^>=wOVPMnV}2-9-;MNPreWa}!jruMOn) z2EKI?JlFYD<0OoRlhL})H4}Z@&JQ1cmT_3GWbc*pt1e^1ZohB5@TZgO;1*Hw_3QDj zKu4Lu0v>vvfWy7o!o$NoHiUXxX1jRZP(O}EX4(EiW@U{O$tgFQTPriNBU!p&a$x@> zaAffk=uo9-SR82;NB+P0-t5gnfn8q`@TS7;aI8^<3!d_()aw zF2d?k6m$#^4BCe*Dq}<)#y%m1bN^y#Ypg(8yWA^w)g+nb>_nUHyh1=mt~4qqh>{U! z*&D#-?QSrAdcAIS+t_9T=sxo%H5EbC38_jEi-(i!y$+*w$}nIoirv!PRe94lY%fWB zEBP3E++hrhG<*vJxZw8|_tU2NsP4CGSEM^m*AzB`U97r3ygC>t(igCPsoD~UaA)N<%9)rE= zqeK?dqJP}2Z~rTYiDUlXISg2CXYrwfm9~LM(||Mag3AKtaN9h>k7jQXk{8u@sfL_m zJqVTxTk_h&a#)oBOh&`Jgc4`+-Gh>8ddlO8J>Y;WVm-i~t7K@sb`<-|W}J@VvUf>Z zcc@iM|7iE&nF+tNIDxe%&`io_T#+51c91J4qlkzIR?lC@Ps-kb4Xx@{7ShZmGFK-= zRKZ#@OpksvVFI4l0Dz;BLf5d12iwJn`!%8i=zDutcLz*FN%C{1$T82Z#iU_Lq(azL zd~`t%AcDx@VA+CcX=GfEOnN)K10Bq({4T5Q5P>QH8vB?@g7tgC9Z>}X^s^b zPfD~%NkEXbU+J{U=u%o0XD|yH4OTidE7oVXtvexK5V2mliqZtYDq`Fea2^?l-mf`C$coaxhK7O+lNLu ztbk>LA=>eBIdQCexOk4#DVycqBYWrW*DJ`Hp=KN!l)H+kid%ae$=Hnb)nRYK@4>tIic9ye^B6EuwZle)Z!tSYxA z;c(3Ec!BO(erlLuxh7~S+z#)h!XV4kGcV}-fla{amvvcvH&n!1ScgWWS!PU+Az_j0 z_B3XsgpduQotd>Y?F3P_Z2j)5Ya~+dh&z+pl|P?m+s*PoHgH?SYXa`mdFsE#n8bZ* z*tH(HEc6Vdd1W<<{A@KA?b5qCw54IRx2J&WVJZ;oPkm7vGLxZnF~+lT&4>7^j0#kV z{{Eagg&_YU6#wm12dvxR;I%+TX$l^1y@zQEq!10A0F(9VDi05-Tg$LbrsNj_ha*Uc zI-!bNr$)qYS|0~uGl(t@>tBlOND`>bGw9vO)7*w7Z`rZNl|4E79}{Jkx^$4_x6~&| z=g-JolFxOcx3O_&&H&ioo-EQbZ)*f>m5A-w9g`|j1aP#fiBfX!={uBk9v4C>M}4qp zZ@%YT?(ngxK;$6^41=3e5`O&xHB=(a4s$;|+Y$)(gmK?HlfewpIoQyAC_;;7a@pfD z|6JO)WSf$-(+)6*6O_gwTn$1@?V;>ve*AhoO%0+XdD+98C?v2$LG+?9--EEot&>x6 z-Cx!O2_r9F$pFn`7qo@%X){<44$Ap%nha~d|C9IB{ql44^jRR|QxYV-K{=iBL5)<{ z=CW%Q5Fuw{pzXwHXSm3x1@^;nZzvtxmMEeQtiM{fvvP3S+-LT7qeniMk(-pM8kcIF zEKvIvQGU5nuG4|AAuWmT6|%-G=;j%&zuo*HvMl@b z#|>ii&17>OCvA|i@yn34Ax`%d)F0&2<@#%7g{B;2vHDO*8AkEwc;%&~irML_o0=wz z;s^6g3LpmH=ROx8<-XoxpWj*ElNBdiDY20C)*cKjadphK`9hu+kv8*g+A9eole1OP~a$u%e?P?o&N)4=zz%)3XGy8Bf-Xs3@(J^m+;0TIN7rxuK}5k z8*Jw#|HYBJ zmmucL+d}XYdlp|9a-v{Bb<=liS=z>Lu%}V>($?QCZZtmLvwa9J3el5M zG(F`R&0(oymI7M($_`ufamCKZ3#%m!k~~o8q4#KQ=k?4GNsU6-&cLOwBT>gsnrVWH zH9|f1r$*Gr{L7W0Y7prZKA3}dmUitfzDWYI8{JOBGjr_^0fr%3=kuWVyM2)~26@16 zPLynC&4^yBmvH43H{?7A#0898ejph2dNN?ERM4`Oy=5a&zuuGu5h6lHZwHc&#nI~A z{w<_(Vs8ObP&G+v;#3Yl%mG7G$+=syIv@%pjMR2s=lk*RgwDo*OMFX;(Dux*(k=u{ z1EN5%)gCX zs;ZOz!o1AH<{aN4_A{jyaH<|{U?-6s(C|*>yw}ozBi#7*%)vPE$!GNu3ROTp+fTeq z*=XLCbwBibl(RY26q2A27Pd9%i?=#BBTtp9@QwQSmyZp)OZ#fuOx`D{=N*OG6|tB` z(xy=X9@yEsI)Cg)!AV49fUylafp0x6w5~c1n`7nv{Y&_3*V0O!^gCnH)kpju={!)% z4CGsXzY(NU&m}0>s;>u24+^BaAO*;yT+igJa@Nq$P~dNrsjV7P$%+tnwL**Z^|>}~ zT=u+WDQk!UCS5~ZgEXVGYdL(>-G=;*>SCL-$T#IphhYF13`)t%=2KQrA-wx+FlWQ- zyQs4{p^Ca`uCBJ)5Up6{wvgu(A8pHFJIWhdc+b;sjLbN?n0iBvP%shMwxqO|E)TIG}0Hb}(!aR<^12hssDx4IX! z36;REi5^tyfFum;?CTf5d~E=9p)6rwD>emrY`_SjGGiiC1DyKzU(4DqnMpD;%HIYu zjfQQrAA~BTDRq1a7`2brp*eL%hYEYOcX~lzQXLf!@?AX;%}zrVtP&>(Br^GW6%OjT z`7cM&o|%?k&+y6jH5;EP?F6+p7XuJRlCe6`fEo1c|uriz+L3Gi-*HDiaDb z%e&oTm-H`qss!LEV>*HjRt|}E>MvhHj9*FQLNGXX+vRN(6+|>K+%>{6+F7IhUKd!0 z?A^o%DoUN`mQ@IN5n>C9Vg^i5cWIyFIIo$sp~4y7F0Ie2EXM4%Us1bf&^@I_c}*@wDT$#d8;LE z#DJ0=>^GfV`NPu(8OLS$)f2Zzw-cp(MFH$k0amWR!ubtSFsJ(jut*28=}GQ4Xu{ez zT$^H^B3iQ6_OdGCAL2b$b#ez6zn_L;xslNFJ6aw=ctQB43nK22y?`gIIt+`8V2dMc zSHg7}1j#1S)t*I$WP+zwNM{76zd6g#*vr6=GYa{{BHCSyZS)H!F(<=}XB&nX=7NaZ z-hyAY_xrmJ6+RRU116Mhma>9LM?_CR4L4O)RNQtPt}?;&m7uOAgcpyG7v};Aib)5L z4}F|#rV4;r;)c2s>quk+z^W%GD$}J%ud_q++OO(LON}rmmKj)|U0pm?9@1^IVi~VN zzYLlceUv8XJK;^`a!I!C)D?m;tlfjlDAwVvEmDH8=R{Zz6zi%)Q`FiPZP%B(*Vqjd zaS7|lk(MOsdH0$^NO8;PW-l$$BEdBh1{|w7_qUgn%j)Du$wj}u(wnTGv6~t+Rdo~Y zJVaOL228GSjl`sD=RMQ~ZMy0P(ODe#9SV-%&RH%~cI;jBo^(4570F!?n&rNFRTJR7 zOAWvHVXr@k(0)8k-jZ#ab2-hQObZx%%D+WPIylje z&xvYJb#-Y=v^YIb`DbR;1{I;I1^huI;1}jX3N6#$nK$jAq8wic5(I7G#db#f_A1iI zXWREW#5Ykqs@GEM26HmT9c2&P6mre&0PW6lZc^?0)ldh*Hj_`+2ETv*ZnH5ssU)bQ zEk3fu3jmhTc^{WP=!Y@&SvY*UA|s2`0vJin1t{+oB|&L@ z%Ql!LpQ@a-Nkhnr1Jq-aP|XqdhQJT&f4oMONv!L|F`1Ea@&^#DG0>WHB%aC7ff%qR zJ)4ywThQ0cRu?n>mco7@KJ#@8$RA>Tw=jNKgDQuN?zDbQ&^w5v2B_40RM9%gP zAQ?xhjZ^=WB7Hp2`u=%gI4V{(;4lNcQ%7!k0-ge+W=0$<$~YxP+zwArzGjcV4pIbB zocgZ38-9Sm_-E#60yxr(=#u@Vm(@g~hXfF)sryju4~>ubY@bfC|15QOVuNVZJnD( z61f;icv`>ICuJJ(ILIZc40@d%o@x+*|wwy_Sljg2R@iWIpQJDpS*?l#oNPSvJ|3s}|4PEbN3z zvQ*+Un@E-DJty;9ulq_~$mFd(ogSPDiF-ufk@68>X#-psl-h6xM#>x<6kP#*(=JHK z7==7O>EcXt3#YEzg6<91!`>8Ere_`c6%Hf27K|BS`p4j;MSa>617RN0hJZADkcXQW z!*4bE+VL8eXk)OrjYQvmFzQjF;<5R^0~vw_K-7oG<>cn%_b{S~+Tmz&?+9q!Kp)Bl zDjbC8>aQxPI$=B>aJ5TMkaBNxW!M11k`_pLH+nyb`)m$dvu-&_gF%TRLbpvl33~s& z7c{j9BH_JGkMJ&+&TXMq*Va^u^!flm4|z%Ys=?ZsD9+i^Cv*d3?$9geHvK~YArttc zxUsPCvY-B%OWcmy>c^T~Ya#8Or_zK1(cDlTMMYhEwZ%>A285^a8cM2ZE!c;27nq-< ztB0KQT^c!$umu0STm>kRYh>k3NCI;7fyxRw_7rBmgT94#ch%Z)=#e229tU?+txm<$ zyE{8Oxq!UGY-D%p`ANAH&t>Fu=eF2WJG{{==e&Jo8>CjP?=rEvxT1kPBj@xe73sRR z7p_q?cpiwM&_1vPR#!;_d;K=QjFU~-@cY?s>btq32a62peuEknTOxm}a`@$I>Kfy@jYzTu@E~Fff z(7Ko-UM}K>$+r!&rd3$lps@?1 zVyO)?jNL(c%Oc~V0-zF%Fj3D1a+}+%&LK#FyNL7p^`>p+3l|b|76g(YXnt?Vt3FDh zCodTwrxZ2syql) zs-qu^nbFotI8BcCNP_<^znpnH^~d__kWRgPV-XpnG6qAX6q#CB6(8w%0)$3bwU!=7 zA{A|kd7y1mt46~~hP!ozg@p*{qI*y^5c{hXFgoaUe1r5`7Fn8VB5->azf3P|m>Iyy z0G%jfVCiDD9x-K+J^@-yVVTE~6XLG)Slfs+8ZVWfA~9w&qUN} zh|sliKG$;^pcSSgPRaqMSon6PSG6o>@bfq*0drlu3_21U!g5&-AN$VX21UGEZ=!l& zrG{u6a5Uq)pe_&@adY+d&e6<(*hwWYGBN5tpUD-`G<^2uOrE07o2nvE+KYIAP$4sp zCs+0_hsw?;)4If}Pk3?`Fhk*42LJKf$N=UxSCC?X9=S&ouiAQ*&rGOk&R2Jz z%^roB+o}kcvm(70;$BZKL}6^d_dS~o{wx_}Zg`rCYM^a+odZRbdN}MdvnYbnOqSa8 z^^cutiBLwsfZe{&iEF>-yUjs$ova$)OHLN>xj$YNRkUC>z`k*L2N=%apLGCixGznZ zaUKw9&Dem`U^?&fm$IPKG96E()`5?E3DUhW8gOfvDhPgZ>IGjRD^K(ioD_5b89+BK zfD-=B{cnFfa9|ZAu;AAcMTIL^~?6>^JKe&$G)KTv*`|#%{3bAjF1*3 z){ScN=;Aa03<=qpl|0xSB_f0q#JI+lk`tTvK~m{c%8hV>-B;!YaHB|v8t5}@R`%IQ z-GM|#+GJ=+WYo$*u+M|N&0E}O0K3$Ju(y~V@La;3kOuB8jI<8rPUE^^rpJ)x4G0JJ zi_@!3TZovHSeNpz{+gc1xE!tOH&hpeLy8J{KU(A1aeD;oG{r~cx^WSQ?Mt}H&j#n~ z5^_MIo-x05bemWS5k})#$`D@c5Bch?E^P*cFw4bG9qN;_*tMp*Hn8U-MeJJ@BUKg= zJ{8}+_Ptwz!+P-%_*?O{2+vF+-1otY@DP8)wfF3{Bax>?i_^68weLb{0fV~bg2KYe zjXu^{6Avbz&Z*sxpQdCc-B`+}_@dJt>cIw8u)pL;M7B*gJ)-ELfAuoNGPI2LpTJ4Y zxqLK|LHurfzc9L*7AYAM!`?fI@Lm5+C9(Pa3GEL~>F~MaehcePoRCHfZTg}x&@-jy6qdtYn8Dl{u-M5ma8dUro%i-{H^2^{}pqKM8(g z>r@Oz*a=l`i>c4fU$ zy3BZcs`K<-T%%Rw(pCAD@|60A8$0af=iwl&_9Sw%PZtg3kETM?2nu6ZrZW6vm}{o( zUs?{f*RYM4=7KFhd`z>Phh7-_t`8cRbifR3@6;!^Mz#oFU7G3QvD-7S22?WV_50{d z@6-aG$d6%K(AlnlcC0Ex;O8_W#RTE#0CW7BG?yhldI0#|3(S5k`q9x_ulo8>+7B+_ z#9(K|$Q4}LvR2-s-My63z~-gqFpwTT0O&8YtJ;m$y_Y%sW8&@QHUI7Po%Z;ikAQ25irUhil@eabIwgxmT21eKt8{^Ja=egdxK*dYqf&oJS`clxx2%e)+kGo* z<7(E-@HExIJA{#b!hmf?zsS$U`6BZ1OBj=c1Y>;{JL-vU@j!Xn>@k;A`e$I|G!Z8Y4Ov@#di9p_Ua6a>0 zC;aI!)_DWB9hYo&gOHcDVcxakXgiD6NK{k}&jZYLKe7HxSDKc0Nw=skc?EFq{dlm1 zO;|onQ)w|azt~?rDdY*0Vh}`Vj_P7puSzHjv-q=xQ|#_sUww=JTz~GC z^8-`}gd1cZz8y}1I7cA!HOU25k) zrOGJwpy*S_SQ-`-61kVnS~kir3I6DNMFPe1uH-MnGHp;7z}Hc0n|uWd)Jse|7*`Ok zp)|)OL~uS2fXVHRL`{{rtYFySmi-=JOJfprR6AxW|!Y=Cm+H) z$0UdLt6#m8Ln`HndNz9!T3t3t17?Kj9{OdTtf()WOj&7^GLZvFAIB=#o1vTqF?=D= zAVP#3h;2DkplD&bZSxPe9xi6S9-4{$vnSd3d)MXs{Az&6bf0O}L1bbql3SvT=F6%( zr}yjMhJ}eGzvIxdoJYF#qn$1q`R}~dc?ve<1TmG)Qz@vL#yg=|9KKoVS z_wOj7NRKR;+JK$~zieA3H#fI06BAzfw^fbOJf2ron(BI2xG$+uWH?gyHH_N7^ivFD z{+>@D!x;3lhUmeupAy2P@AUk}g14nblt)c*;wMB!MQ@tkeh+qppPkwTi>%sn%G-em z<9_kw&Cw(6bPVpwl?CpLe~!`6RH2d=2e2*Qc7$R@raWOfvz?0xizF%4U|n=$zTfP$ zF_W0prOERBf!_y0-{W1k-AfwkxnEP|3WeL9p!cnU^g`}gl8*xDR6%^ctv+xe2>uU}N~ z-FOjP!A|}4Cpk1TSnmJBrIgirq<%y2wz`7JvAA)jsBX`xOkD6K5mwJFKLxYz6C!XS zR|;MPzIoCZbR&gL+TUUIDK_g>2Y0QDU0?RS2!6&z74>oDZ-aw@!$SUgPB&|P-7R<9 zD54KnIf0S;If;`Llp1%xckk${H^G|V49p~QpFhpU&xOiUi!yI>W7`YQtqEGN#&=(| zzJHfWbqq||Uc@&=dez^)5+gTU)%17!ys8|V`6%V~OH7onZ&%W^>`zxtW$Ht!Y8%{rWY?q{I zdI5BM^8;yYa2bN`yUcJMpT?N)9z4wUwoxHW@=8XsMjt!5AyEBDjrYox7nMgAnbb*k zQPebM=FZN}xA3{*kYjv}v~|5CI8R?Jlp5av%fi5ADz&zDL3qcY*h)SlNaqbz>8$aO zVU4ohXr8e1(a#Kw ziQ#m$R-fHiD0UdDi5mAkl*xGESVuN+-$)8bNRHxfG`UCp?xYEtp=?yK6jrM_7c z@9NUVsyo=NJDrA$;=Y_`KuGY2H9HG zCjxGoHHIv4eQkLi5jb#4;(Xi7*8yGWsB4yHP<+2gNfCCVTFucPeG49vDG4;Umb>z! zy60%FOwjQ}w@;~Un1D37@#M(x^Ig)D+2tL89$xm|wKgbpp>`bgvvx6=t%*5(Wx_N% zl5=2y%fRqt+IR)!Ex&n+q?>;|etfQEX($Aq;|9~MU`KMk&Z3A?!1fUsreZ~Y(Qxx% zO5JJVY?cCv8(bcq&HoWdI{Pd&p}Qg8^7W4g{JASir>+R{*eXVNlz3*a5F9g5PuEm( zuO(&>j?MAsjQTGQ<|-dfQ#^6x#e@KyiGLXoUNwbL;Q>8gXb>V=;q zdQ)WePO30avG!-$+WT4EZT=pk!CL3Fdhhhaz;T%)c}Df8pFft{#?>fCD(=IQV5Yq*hAE#<%e{n1}ZqDZKcJ^|9BpHo$(XPuUINeN0!+nu%5aVi#( z(HzQpM;9r|_(MvfGM(0iuaj)DD8LAiLoYv3B0$LAz?G&x)MHzZ<9+S!cD+}4s-Lwj zLym2)nvDXE6xgQ&GM~)|-{e;e9_1j!%_VTJY?4GP$THe$G}oG{Q=p8shxyNtIsj=xt~6mE8@NboSeq zWVAhxi`Y9%78;>K|Jai!PMB+4p2~mGwi0rBgSzrU>syVfmSky3up?7h|FvlHap5B- z{?))4AI(pecP{{>kfvC0_`K>4lek0b1oh~^b&fmj-Q6!3w3?R=9Q_x2UcA2&BkpnY z!O+_e|)PrBBAa`-5 zbw^-+Fy*w2=L_^6P0_-nBSi5>zzD-4j}31)xk$;)WY6A~NxBmi%REL8IH<)CuV%%E zuQL=u7d1|vKA9w)<>x87Ek(g3>UibPwCyXrZ73RKv#p+HB93iqQ2`${8wEKZopU{U zQKN|{2g^FkDkSH^7MI;qlY4JBmL_oLb+~nINsNy@))I_|SX-}t$nfKwV=dS5-sn&Esw~Uc~|PL6g}{DXehH!%gts`$vIoh z*_j{AEfkvBeE&Yb{v3p|QI9c%<>gCY^jg2c_U&UsGkCaD!0Fay;Qy`S+y)`5<8!98 zTb2l(>M>T&z!QeP#zi5?P<&Z=Da4vg)Z5=!x}OfVd(W*ZpBTPFnZ6FrgRCbSCmAPm zjpBKxnSY1p357>J$J^oNT^11Nw)w^ZsZSQ=kvaY}sXo@bn!R;c%|>n(rn8id{@QhU zrl~|G#b)JqbkAih%*ZkvyIVq20PT2rxYmV8YI)u7?Ue9(z!` zR0!c727p8l!zO`(34_77B|qbZq8mMPsGDmglC*q)wd@o5Fl-S0_d4Af2r^+NKH<{7 z9BYn0p4ChKhoGV>%Kuy?R>+kVfkwMO)Wnz zO%I4G&*CWhL^+H6>O~Yn%0H+sD#ACWkU7k@vMZ{5QR zQHVjSHZhUJGfljwTAgYzS5s=XYXCPFBoEVJgu}NadOUSG@%ON&7ScUshH~_)UH2c^scLP zt@IXlMv{j6$)6*<6tfhr_8%JCB{lfs$y7$UK25y)F2ng^%((>1ZnDi6Z>Y`2CI=>d~8ZtIc9>t-CmJkxpM zwA9B-PX5J)s^r<*v@1Ejcr%ie>&Cso2kE7$)g3vLGE}lHiwi#??Vbv~+}Ro|$JWnt zA8$wcyvcnL5X`Fo*UH2*!_rz{ea(5q!vBZK2oXR1Yt~)X)`ka2M@mV;Y%KG= zoxMk9gNJ)jHm%57P4A;Q+egT?KpmIS)wT*M^O33`D3H(|bmx{Tu7}(tV3M9t#*E`M z(cgA0f(SgbvLc)~GN4+f<9{cmRA-uuu)s5KWxMa%jd5xsvg`g3bnF%9+kXuz< zy);<-1oqin)A^lj7BQ> z9v)aRs-O|H*Iry$sOVZ6OGMi=JglmExVyNGLH4uHY+u`p?i$#m#Ko<}rqUo@K-vTh z+Nb^l9BU;~d;0Z{*|Ja+-yop|&O0NFJasEFuhkc*YUzHq_tSGd6g6thDp%9=~ zymM*m2~}9{s;>SmNcNIUiO@tp(7g1UBi%@e=lIhL*LG?qEZQ}>-|#e;|E$=Me_!AS zl1;(%+%+9tK|@pC^5BX8x!5o(SzLnPqB!>Z13Jx5%ks^3m!8=5i;UJMd#ZyM)o5^w zA#lDmGi$>|s;g9!z$@`QF2^M1{29=Ms_jpeuC`ZJR7@=`d5hf_*PmlZ+K5)2ObGe}oIr}>frM-iL?$VU!-s-5&?&6EpCt9+3vAIrO%c(s(4Eu!{Id&v%kr-$^86nMl@+tqMO_muEcq zw-(^TYYJkASIDoe3>IWt+caV?_3!nlHAoxbFZ9=c9~z$8-CIJE@>KR?Qb0M7*>i}! zUQ!R&l8}VxLc&(`wH>Qv#sO>Vi}e(G$wyxnO22oGA-9F-j@0ARAKEa7r3lBTS>!UU zCT*S05wR-g9TrDNtv)Ulwd)F7&@SI*qQMti{&kDeXJH z0M}MARU}D_%f(yUy!5QkJ+pf*snW6h%8B>3&W`b*VScL^dsYw<&TU}en*6Ujos_hJ zcYR{w_?Dvry7i!#n)T*|hk-ASziC1lJ8tZr4w_q97Dv6vn+FwFOvW|U`Ba4s`*gV}#sdp)=9ZH(i z0O*6&_>VEnr6PCp(%0>~RVj3kY6D^>Ic#2@Oo$vU@nuEDOdT{K5*?#VuCT9mlzhVD zF9ycmE9@3jfrP*(RtQ#79lM=VCb~S=RGnU1`#uq(GrPFaG8g@^z~HQREE>k<=Ix-x zgLAB~I2oEs6|qbXZ3$SSLjyCU-UT1}dQ9m98Kd3er_Wdb$pIT+ow+3}%7Be-zAYm0 zE-Nh5jYq5;-z4|-d-Xs=>F(6Z{PI^jpQ1etXL~wo; zYvz%dDOA!)GaE@=bG6DW_Y9NxI-yecgWc)*27N?lVp#z?qp@Qu=3*);S4nvGQ(k0{ zCa`X^np#=q?tOwi5QU~*78VvX=hK)7N@9YpWMx77C|X6iV<|Si-_@rqCZujJsyBr^ zkWqAtqOh$?^?dQ|Jo&RF3FcDE>e2g|!c{mEEnWPJOui4?lLj5PQh0QRItH$}x$T}X z;xnkJw20N1>~b<{)`T_P5w04y9J?-`WN|Bq4?z>zZJEP}K_}XGszvGR%&RJ&q@tFg zFG&)3Amh|T+qyX(B1_~a*zby~dOkFXO~e`(TewI(KFMJ=klM&@y7!~=aFCwPw_M8z zb+y00LS1diksd86-jPvrOWR6Pq4l_dh_0v-T;nKSo0*6n3jz1N4*()G{#G5j_{#8P zMW=UlrFiwMznUop=V}~}OLl$sED>yLmVKX4VmWGJos^e%eV&9CImgwcZ|{=nk^T7b zlgLf>+Wl6=bI#e%7_G?>Yr!~koMGF_@f>isXOmLo(uy)NEX9YO)_O;j9J~k!A=K#l z^}7uL0M<+!6H$8kct5zNM%eLFQ~zCZU(lD7VlwNT9vZ;8WCgKs!jHZM>d}GVpuF$c z#l^*nBPJY#hVtUCUq7W>Km#DjKCD=E)gj_*t~%JWKM@JW?63WCDoxU-k*?oz82M;# z`)~^hM{Qt9GN6B zr_YY7m?I+yi?fU+mk0_c96!sXnYw?C@MU`#>6!NVz6m)x}2&ig*!JiNSQ&oU*m3&(~6>f7d zW&w=AHA%<(qs`D|$H`ptVX%B-lqb@D+L7IW+Wf-T%8<%P zkG);GG`98Mp9x-yjQ1XQHZ&yGqn{F;bESA$8BE}J)EaKp)v%w-c|8baP8HcT3+*tP~Z18I@oDLFy6o4L|(+UQshi#P#n*y{`6v(*epGI;Nss0>*(X z`wIKx8-OUGr@Z=XWuHT3*6GLf9NfrgrV`1#b)PiTEEu@VF{XK@fG;DKbhz7@ z8LGvB00|9e-BMd32VB9~(){qFNvHMw0ts#&9vOa@2OpWyhu)f6TIM9+@U$(b6uKIG zEBG?J8dBE*@ z<=wlL=?*yIF#>GfgBCoiif;julPfe-M9wFxA46HbteEO5b`TEpe@o*59D|pIs)WL) zeJ5lYX2c|;8GPsx$t*+ftMARMhcYE+?U+|8nkk?ML9Ln3$vu@Vmlm>@uDm*01z?{Wo1|10W=}ZksSpQvKI$hinzkR0 zf5uk3o)MR>tYSVWKeolrzBq7OEl=t$zV+Ya2*vu>|q5*o~)=w1E=4$vA>0vpvP|03+EZ}+ek}94jQ*`p?t?E`dWhy((Vm>6~;AE7pf$6Z?&t4w1 zXFiEyIEou;=|g2pmwK|udRi=+!4PmT))K%)ENd-5o_!KaqH;APt1%>h45iRW2VT9R zHlrB*HMag|?I6v%4y>tTHfuzKM!<8eA793Z{qi`vp3lv&teRKn;tmC(+OxWXha@q( zA}TvG+}ft40if+8r#74@M)kB(4QJ=4;uk7dLc3P+D-u~M&q)gLARKU6`Vx-iP_ogd zgm(<~vJS`1>PxDcbnF&!H2-i!MiemWOx&rSPx`4K#;v;IbBB_bAXaY;xQ+CS8bK#6 zv)I523|8LCdN8XK-xQA9eab=;8W1uNIc@2}X8C%Di{TGJ|BDmN8h1a~UxxzQq{{7P z7gpXQk+67PqfGt1{23qTN zzR-ViJFH+&OlYwmDG1h0Uz|S}%#ojLN0rH`FNn-wiv+4Q6k}H0)Y7DxR!A-1QP%V*gcHt64vKH1wZ9&|FeU& zap~ZP+!E=+L)QU-lS*_$lYz$qlH)NL?oN4*{QbMMXWcft)}HQFy1mu&=c z2LGkaOd|~rDW9-HzXkLhvgNYg6+?2tYr!bHIl{Of(wjLvr{;j9x;*ndds=EKT6kHf z3m?9zuOYFl%;>DrAfUJKYv5$SS$BnBX92~;p#iw+1Gwl5>hW;FS}I1DU0Y~tE-i=a z|Mc8NbJ*-5<1MBT$9KR7-^S$Lqc(hcwW@@&zt1SVyL;- zL@nHiqa$a}3j=0pMOv`LYy$k$V&^bdqd3ZP+-tgPU^P=aml05UM1L&0Fr(%|QxJ17 zDQ|sW2JPDVx=l-bH2ih2FmD8EJkq;M`}B}=CvLTHBlioKgK~8=4g)zMz2da#|(&T>bF@#|z=>n7Aar zhg&{c)mXmWbAm!7ki5Zj7S6Awzn?rHueNi4q#%Pf2VZ0LFhsz_F8jq(%KHWeBEbvz zHlf33(4fg=%AoDIx#*giz0mJxNQWIP!HI5I<@dzOZ9R|hnf$A(NkDk{WUrM2Ue)t7 zv3VOu+s9B5L952%F!IoHGPns^csMC6E>*sG{wC3-6yhggT+*aIT_ykwEVT4xwDRNh zH`Ew!6hh@b`*%Bht|J~(6caP=-R>e&f%CE$MR-7b)=eLb3yFg@8p6KRZMkkibKv;EEU@+S5y4z*WcWkw0z2?Y z#=t!d%4$)Sc0E|iX3z0)_!mGO!ZH6b%|UE%u>R;C-LH!M_%aXPIJ-rrndNCIQX?ZE zB0HnR0=4IugrqJgv1siI}&72T!MrS{k6 zVtEdcE=Foa`rNCR!|jQchxQ^=EDQBM0ro3npGQjvQt^XH`0rt2V)_^efo4MLkrdkI znHb){pat(X!-h|mnbx;&mTXoRcLu32i%XBEd1>AC-9MPgTckuq1*9kNIrxKd_%ujw z)|6YqHVaR3Yd?PYAU84xVX_OL%G+d@S7b1)1YFL1V=!@#J$58uX2-ZMoucM<-$tFT zd5tQxxaU~x^usuV z`!(1->yNu`W&5-mb-M<#?*mEt$|m{SJ=%zZn#HbUJE)g{nq2Iimnrx=8V+FR+S=MP zrwb_FgOpk0oYu!CjL*-2Re0vKaRq?R!JF4POHei6P!A67a&1%bsF3Nv&!*1=SbVN~ zG0@dRxcEJ2QTc$`x{USCFJ(#MUClN_p4Ge}YzBqyc(2lpsqI;+wNa-putgyp&NM*9 z7o%PuCYv%hJ(4+&o{qm!gM-ro!|W|#6rZ(ttJ4fJDY|51>w}1O_byx>AwZX~qv|6a zSW=kA*!KDKo??OcWCck_{_MMFyu6{~J)s0lT6nh0tl%WCAi@o?{_W0Y?eet)byo&e zc`E3O8>btZKh)So%V%`y7@0wmaQU;Ng)j9`@J((q=FZXf-Gs!%qhc>I2%r(`6=id} z+j9FC8{@eLg3 z+sRw+<3m@pSkv5Db7aQKOz3K*la8CN9-AiA;t9iuv4g)z_rm;geKH;XQsSe#lv47v zG;(Hr6%?PN=rN~`LdRPVfxyZKgjV5)#ygnPUtu61a*e$77$WsvS079}mUCU|mUZ1D z)v+bD7&*Oycl-7m;Gbx#-(zFNu)SL5$6O(2CSsR6w2pb^`IN&n)SvuyT`wJgf2a!rmudAf?%T zHQNRQ6?S}w`>CBsLY#UA2a(~yE;J4NoE z*c%ilY!cqQypMyq+UeIWe98xOeo3$V?WvyB=6>X%-_B*KC{C~V`Q+BFA*!+ga{_xJ z7c|BIt*;)<8?77}E?)*~Fe)7_bLC@)(lwP)Ag^1gl>6k4diA+x;Q?8bWQ-WFsepkz z4zGnEFr2LtD~AtZZYkn-XQxzq(l#%Ot|%v!IovXx{2>}QpAFw*UwW{70r`uO!!*d* z#VeUz`~6-%PzD%pYhs3vsu$^`PgJk9glE_ve%;nxX z*UMPTrA>pShj_vUswhQwtJS-AP9r$S`{y&DiU2p)rqR*1Y>)oG z)kcEA6>zwE6$1P-$4$!?!)Jg`ccGzoaQ35Z2ZljW=iL4qTe`QCXSyVz8T;RfUbB`s zo{!+fyKC{eM5J_iVddA@u>7B7ZLj3M5p5YK(zu;dtGTwt^xbNXLkjVba1Mhsj;_AJ zhZ%5fTn~;1rZTS+fxabksQgj&yhh=IMWBE-ao9;sr0kH8$jzE;(swo98Fy9J*22T@ zqziU)$(I;=O)SYDY>XUfN&Gy0`3<-{{0l#o ze*EcwqepEujmMwvszSK)n7n??g?SGsR6pZZy+ZZ zAUI^%w6cf}P6|Iz!+l89QF9!II)7JV-kn%+8SdeQN8bH0WU}ric*NP{#Tkk_aMp^ds!*eYz|kmRhC>fY<)#v`a6wjC>37^!CEF;$xmSph%q*xA*HhPNsz{gbIc^Ku zu9V$sxY`{xmcJ5I!|iFQ5MUW539$jq`275`w>X!m=|(Lmq|sIa9@_c$oc#RZ`hbE< znV@>|3sW*NeAHCQ)u`4BQ-~c~kZ)Bgj2+`{QEbNkF*P(jjY?`zEzs9J>PAD!5^_t` z{BB&dW3{<835n zDiC+9hI?P^jd-P`2`36qL-tmNU;X$n=!rnW&7!-AF;e=%BvfKP93$vN3uHTs#-N*P z_t7o}y(*tN)t@0Xf#08gc0ETQ4l?V{{1s?&7h9=l5y)tWu`Bv>-BsQ^JUrcLcD$6q zWIuMVr~x*YE=80Yac#saH;lqvwMr-b>hX>3PY+rjf;dHVQegZ6UtTWj_YzL%#6Y{5 zP+my2dhIxl&M8Nu$ZF_@jG#6l5u?HfC%@0)TENn`19P{+2PS4bGQjGjOOcu}Q+JIV zvXVEBHuvsarO%STvbw6nQ)JZvE1UKv*2SZ?()0qz9&o(hQPr2YDItaL6BC5eE_3{jO#%a+5kjCGHt zDB069EryI)(x}W*COIDVs=b9*NjchHXHQJ6a)D#qP7ow0pA+;(-jH^3==3`$Zzj?iv}C5Nw~pO9F9Uq6x?o4N&+H;oj$o%3L@% zDE(Y#`x{ChceHA=p|N#!(3Pz?I*aGn$b((`7Sp0=h^64pX462C`F2o`-AFHMQJJ*t zl?4ge;84fM*%c0^1!o~H%Q!oJMXO&JXkIY51h-<}xpTLV!)v90PrbxEkd*s_jh;WD zxto)n!&l`lMtV)YQGM^!w4pE#hdUb^$0%LvEy2EZyt$>Nx@HHneB)_)pXW7k=jV3E z!bI*TES5i#YEjb2&kNdx))Uy(Q;K;THTugo1?kyE3oavZvk{O9(xnMSYis!T-g3dc zto!o3cIn!&nq24ba7L~qjl*#$gfhcO8jz9P0=WbhZb)6zAO;+YaNNg4Z{ED&bKb(k z3^2E{PxAz14(j|5Azse`QxqX1EwNC>6<>my7Pd8NZEO7ukog!`;g=EM7WaZx^)ax; zAi;r7={87nC7jYiOF(nUW_EA|fIZY9e8m(q_*zU%j?|Zr9~-w>U&7s;kE`MFpU@|~ zpcL*KlL8ykda*oZ21dqUdesSWwgzpDgcH8r?+sp&qooTEYrF*gn?sVn2-aq(&WHPR zEdHu|1Uvu~M&Vz+c*n=nfnKpskwz!T*Y~QW=;ZWvYO{V<5{b0*q5UnoNHsaRJBJ(N zi%L72G-}_Oxo!2k>i9X=An~_ayMbLCw4ZE26#amljaA&2gzg>)NSm(3sD*OmuoA?C ztv!3`LR+!x+ba}LpIWbv+=BlSq*n)WNyEN)G;&F|tHC=J?-y-U6xG5YO`4$vNxOXH zr>(r}eEj@>V6#jUU zdAkx+lBNYN^^hY+7a-2@&Xx6b1I0>v*I0S~nvKQGcG&qEJX*TB#dpDdJT}&D={988 zQLJy0*a%3+hro(!kcM;Zqe)Qh%EtKVa*aQ-oJrL#fu4a5>5){j_w1c3yANosZ$VhxT%AaiSU=u%t}z>seIu;}{0dka znih~RK_Q=DyXZR4#PW}2ve#kb_Aj2^U_${D(Yscuz%%uvDx*Y4f2(ZvQ9sJ6y{si$ zymLhpk{l2wS<$hI@j&FieLF+<#`cLXxouFb#?C{E##O3$jZc9$_KK^_zT+uX*wfte z{;Al@b+xNu1h66 z`wgUJd(v@by>6}_-hX+}mkSi@#tVQmY;(f=E)k+w{+1{c_Ufg$^qH7fT^W`<)~#x> zRnEli{r#`6r{CYBp9;!~zj@&3`0~~G0`RoK5BZ;iET{XcX4X*k>I@0R&`}$7tin~E za-9ZzSbO(#U%^QSJ@*x;aF2(oxUBrmhYNZjEkV83fa?80#tPl})kG}L3JLqYapkgr z|MGzFO{(<A#~a{CsJi=97q5qPma5q5-K3oh=$VdZR86hDk4B_vS6;>ed^EKou4 zEMjNdncIzeLhR$mk6=iW1dltjy1HB8v>3FvHf;Ae_1pEEpQjc&tT)E0MLQFQZ5(Xs zn=`0?f5M-JcT%-6e(yh?e;I1;LDV;#Uir}V+CZO*SS0Pc#Kdtp2wYOY6atWgh5LC5 zw0@zXrGKD#?sQ3@Rx85;zUm32wp=%^-@Fnz+tH#)slI<6eoqj;?aqC}`%03Oetu!| zzwk$5p>fp~jXO(p|JbbkAFmmsHB(4?G`hg)KOXL%|CseUCHKGnwSWG+*e_R4Zv11F z{6GJl@byrvH~&xm<@41EwEz6jjg_mvev7x?Qn@OG0zucdd^-1BcB8E~&R!J`D&}O9 zfxOakunLmb+TZd3=vorE-GadyqBWXHyqwjuA4-ax97f7$L5CA;@u-}qP8%B7WIT1* z7N%Bi0J;Kk5vJFC1uYXMLqb}kQ|mLxKei9qHum-Tgq*d>RXRGf zM$uT+e>z^^zFq_vtfSzdw1Y;;3Q%ijkBHQRz~QJEt5dj`s} zn(_FK5kZ;D1yB{_Z)^r(WN@AD*r8Nnj*cfjg#zwJA7C2X=0f;Gy+OdOW$A{l6~YAk zJGQX^$AcPnMbggR{*lhXJ$Da}_6rhW71Qmo`|Sz*lT$@kCXQn{^d2AYlrKvbE}UWh zEjMFA#|TEGOi&dQ^4sRsAH%GrbS>J8pd6###vY|>03z;0@Vgxrf}JO@*H0d^-jLA_ zpqOClJl!P7fSS~FFjMSc?c|-x!pPaCqkqr?Gix=tIZ(6*kCodICU~BoNb)#tyaDZ? zPv2{GMQPA08zJezAGe!nRrcSpw;gl zjmB%M8pzHpI#bp@wKr4rP6zFcCr75(#Y5hJREYhoDz;}bjm35D(Tazh=wfBNr$l4? zlcRzY)!hHpb%RGj{h-o#IURpu)zj4f7CdK)L509W@uw}uaMJw^_)`Q*NxyzQ1?)Zo z+mMP)e<~#uC9Cs>*^h5ZK|h}@+AN$Mf0l@6iH6G6r0;@?^StoW;Y8aN0Nwde)V9M3 zN`xCZURF=Vqv+4ZPN}LVkM)KoTDMJy4%`HG znA%`MBwMXIc$Yx<0q0wK92}hfADWs*!(b9xV>XV3fDkZJdQLhyBjBr1(SGLVg$I{q zQ_bn^`G|ptPrTos>tMVq|K1&i@IZU?#LZC@;5VIxY!^^}WmudhAGxjD&X1tCbzK5) zY6oiJ(*qLyhI9s#jY-&<7Wqh9azUMoi{M~Wu>Is#yzGy+%kU-!&-XEbkX=4mhs!~) zR*+DRRxuv{y$^~zWTQ`j*m*Tc!6?ST&OvuCvp!<`lv#5W%^|OV@=qxsYBd&v5%8`b z;`055X(wx7$^;$PI|?Y!ToZ3RPPOc*urLCI9VPZ2ueb)?GTyy=?Vzhc@%F!7wQbQT z`G%|xiXGONR0Zz{LNy7WSK-P}m<0>aUX}x8L_RQ{QS_QEzyLfDu;tSe!Ih0_`>-<^ z$EwllMLt0?s8LvIIf>DK7$QY7`e0lnCxP4HLhxwp8b!(gD06Yv)uxlWf}jKgrc(r{ zB_5~shEE2&@PDkJx-s)x{AzNgP~91Y2(P~}Am!2_TIZ4Hs{ny~y3f!quSoBORP6${ zi|aA9zEv)}-JmmMTZN3Iq~}p6sIaak^GcT& zcp_ekOnkE&5-`b`j5s~iQz>>OK?Dg})um{ADHS|ZM9PIiWYzUK9pptCSt`nyX0W5m&M|7Z9(5_`fj@o1B06lHLYI;$; zGgbcr1+Iho)%(QNYUkApT1DVmgC$?Tene0Io=!P8-~8AVg)V~_ugGLP4E1)~cP!db zQZZ_Pjeds1aR)vbd}djsDMg~eP|hfbaz6w51cQG{1$5C2@^Pr^ zAD*j*8d~`+uB`TO>9nHt5&{q1s9L#sjU4_J02KVP#I<14CkpZ>CT|+ zU+FHp+|X)L4zn1ffA5=;xtQJJ-3~I_dLdM+KC|-g?P-GJ_EV8|TQe&d?xWG97pB8| zHC~5hgQ7Dj3zUkP6Q3dGO^yalebapbT2Y|1QLGtE01VzVEnbOvig^M!&ep!Nb`?kS z%c}TxuRH%)#R`AGX7&7~fDrSLc^`Fo+Vsr!6Gl6ze*mP}+SyA1 zrRRQnv~z9Q9ifz#Y^b^dY{JgKa797VF1rEW{%P3O`%J-9lWkYK% zAuPNcnR;!iKR5eh=}!;Wu`&ZVad_@#OMDIr((9=3LL7Z{xS3eTDT8_CqPyZ6c&(kk zFgMqz@QTJ;a0c2QN`AB>?cLnHbOHvs5Acm#v4+wm(IhJAvfOSFH4BT9W}p3?WgP2?pqSc$Z(wR|?IpMYeN}uA5fk&Lds;8z(IlXo%m%#=P-{7_ zhFyWkAPX!vYB(8&F6>v1&=Ei;8J!Epw@+ww$Lh>G?Omp2Xr+&K5%s6Sw8^9SGE-pE z^9_*|RZHVpS$F2Lrk9q4x;7GR933C?oZuX8G{;nHk7#Khd!a!fhR!HU8UKpA+U0D7 zOP8jCfYHlit7UHUjsm%ho7;x@2XVJTK3uJ9XyDfz<+q=EfM8JP>}yHKotpY0iN(rq zJLlV3Bz*0r%tS3cRBCTwdWf>rW_yMLMeQAort_d7iITa_?#T$cHUCaKV>AnS)6d`# zr6&!T%W1Tlp#bH~I0d1{e>94|c)9)Hm&0wZGVXn`>OHXr^4(Xf!zI-+lOCbIr(Z;=@K2q4n5@liSyJrhW3y6Yy+9B6hdUtnsu`99*n!<>#!Kll@ga*_p*vNxZfGdr&=g?(zz!@GEW;`-y7xtPp z?iD`^&28@t+Q`mBar_P?fsBD|J$U-?zU1btHf=av1^RE6jrG=9%I~LP?QsYmaTk)^ z-QEZj(*AF44joD-14hCm-keDF8TstYSMRjo6+`2Lomt53nG)HtJ@?}ghy)3}^Jg=b zuDYhp*VR9H`BH>twc~YY%PLai_(|%nLeAN3m>`s0xK?Jjn6q=7x-*Z>Xau6WARx+y7(q;`sg?A_O-@$~- zWt;sK2LwcIX&~7^+ibnkPne@s*@;OZz9oBHaF15uk>+Y(NQhCVhQr`68I}oXrPFhxGgOOGtMqvuB3@nC;HB$Zw2Sc1@=? zt5)e>LnzWJGe5x7{Q(RZ#gkZA7Ch1iRTn5Y{zNel1IDSG4zqiN>i44O%#%xtd>S_< z(Cfy>JLWFRD=Tl`CQNH*YRuv^3+5qCMuFZxmE>wl7tW+{C56&bQ=fR8;LLzUTx(Is zr6p$n^R(IK;BMlk(U{ccE0L=gr<-wflba*eAs4kcL$O?d`GE24z;S0&lmA3@MfXf4 z4r)#dCHB2FG0=VHNpN@At2ks91Zp&DMa&4N@LVrtE`kLH6|uUi-#l#{NtJj&0^xTi zKd*7GF!%&>h=5CBq~wJ@8g5s*5Pd1KeRgaIQkOz_N8l5DQ>ZUJS-r~2U*+GONSqlb z<-)rimp^%v_6w7FHa8L4Ui;T-&&D*F@&+PcmXmgPi`YYHa&2A$y30pk1Yp#aWHT%B z;B#~i%09wdtI64{Eg!lbkOpWq|D5Z5hyVc{8VYD=k7Ef1E6e!m%iPnL4^Gkl1019E z5n^wIj*m9x9yxSL_(&?SNf@^4S7pso&T7Y`m>i1TfVTU@p{?AWCIZm17>%I>?^j|6 zqCwDd^+L;!zaG!xw3&X@jGKF&6J{NYphyHUU&fsx)UZ)?^){u};@qR@>qzrDK)TVt z48815KCtgN6Rr}2YQnH%#0#->Ax{M=vor~49=Vj|uG?w~eM(A5~95q2dv7arE4w`=DqU||nJ z?R*cWq2Pc46A4POhB;1-+J@nm0ax7I+zb*&p3BCqde#3DjMxOeanVDY41|>fv3Q$f zY4VF&?eV<#m6Zt$YP9$(Wy)=@fu}W%+Do8K*`hANS>%x#ogQNyigDM>0!g-E;J?8J zRP~k7s;^!w_UaQpg9HH8I3xm}AjiZNUrsGe36&=E#1*6RAZlO);jU4Ne{o^Ze!-Cb zQgm`Y%Svt8T^W!Q5uD5WlL~~kNN!4ihQy-uWH9$nfJlNtTyEQa|l3}8`e@45JE?M%LnTfO;Xgv^J$%2?L;Ft|qhm{p(W=L_t_z{7LrMz2( zp(nXkBuqCFK6Ac@;4oGA3W6(#balIn_|=}-W}eH<)zyYI!rE{)BOHY5;Yur@FesM? zFtDksRd?zxll5UABEEeaOX&BFi&iH%7ij(SI)D;WPkMn?1MqUg#>{QkRT|Y94+yw3 zBgMofQD$+Ix!j~p`WmWn`}$rQCzEAN7f|xdYP92xi80J2=#fUXw@B$4Np! zgvDI`83C27C}sy15ukL%;?d{e>laC_o?g^qF;+>|AU%EpC<&_40AiH>T-C7L@f-v8 zeCz&6(caqnli_YF|uiKI%T*PN)f5*k*pp!Xit!pvf!#?I1sy+48#-(AYsMic4cZ7!Uy=52xl&ek7s!@u`j-gX#a6#$Z5qnU3u3rGXgZx^emujB$WS_E zsd>Bhb4-!NzNBU9VW{`VmKu8#(Xfg*5v5u5DqY9@}W z_ZGSmN3Dl5X#xt;LI>{4d0z70eJ(rFEPHyi(Eb(2(h&@uY7?fX|70osxSokFZ8d?- z^(>^MUF%|WmV(N}+WuSSi#VM4EkQUz-5_%PW@B`m{Y-Haw;TX6JdzZvWH zUF9vwz5Biqc2kDaG-KM+H>h6RJ?AXg;W9He_NEN_?(jENbi%Y0rmGtJO$w(r$q)#Y zjUvST)_7z0q`*IsbOd72jDDUTZg0nls1Uss^AT;_y7AeJ&E|39=pJOQe8O+Pt+;u5 zR8sDpin(c-ffMCFev!cRqx#Wl@4Q)={c)VIt5DrdM6cAroA5O8`mQ6VpTgdEA0>9! zv<+&434|o^H?hdp*rXxIzIq^;Ds$PzdHL;`uWwbr$2Y?g+>Xm~6t^GVxsjaVDa>qR zDt(@WHQIVFGTx?d6LN2^5z=qWe@W*ANV!9`3kiI}+C#b@|oK=UV-c zqd?%Mm=Cl534O6&Wg}wC_Q3Pghu5Xqa*luRUN);HJ-*(-*emBH^2Bk+ZLdOI3q{@+i``1Mc1`mNio63dO7UcF z>YsDa&~Tk@gUB{=#lWKqUcyXZ4R~7qpI;GaFKyd8CTi@Ymy^$I_X>u9{f`K?o1Pi4 zD&)o)u;gq;jymaG2ve0M2;@4(^Oe_L+cfA(a?$*`UxQ(sXwRKxi**nYaWCPSi-@i| z0?OMwJa^~mnfsB=I5%$KU+FU)`bl18$yln8zuGZMdl>08uJOCK>18a9($inxTX39- z_i+6EG5!|VD8|))t8l+$`_(GO@I=X_OH;v06p1X+vha`d>swX#PJXTI6 zOxzsa@iA%FU?9@w|0;%7dua=L71wJJFlk-Z5<@L1U$OuO%|ph zOmtNG`-yxXUtYP_<%kEZeeLr8n-6H03?- zN~pYwpjIxyZjE9{oIcFjI73;2q_{_6FK_2yAd7n9JhPLBB+D$IeRZRZ6|W~lJwrz=tS>&B7|h$gMpeV-^pO5CgT=lkypp$zLJ_x7Zm zCGmZWT-PbxgD*JytYF9cmikq1T#y2J=WT^JpE_I$US@yU;Ev}qyYk`%I-;(Gq%soY zJ|C|0J2oSxD~OZBO(Y(le%~2HiV_|=5?-aJcXo`ms(cQCWI@r{zbwmcIoh?sauxr2>nz>TAO88PKmisy z0`cxveECz64gC@LXNoT#KvE__73YSL5 zZk3R5H{nxBC%&?NO)V!U2S9q@D{-ZnrF{8b3-wXseb0f!+OXy1Oat;ni|yLqbk=KS zH@|%octX3v2B|a%ly>L{Q`LSUiax>n!NWBcbkm#DPpGDXPdxydc>(f>)%>{w>CEnyEJ`I5BU*@ zaEs<|#-Wd$4;f!BC$E(oMRAg_l~mcsgaQtbp)mSl-xbU2#0Zmp1PCC34W2P*e@;o!floHOQ62Drt6u7_(nZA;Ay_}g z;@EDDsJrkH&3`-Z3Zefc@c(>dE_z`|pD)c&pwO|^j2y~bFBr(!seN%e zi1^N?JtCRx2Z+OCc=VQ*7U!AS&mT+r{1Dvnxs!f@JDzJk_{ho>$y3s@=@rVVoVNdc z>P9EC%Uw7g5Z=Fn2u#)wK@SL?K0n1hdPowKHKf7fx~7lt4wWVE&oWEP+ni3N%6F)= zuM^6O>ga)QEYe}O(uw@FghcC>8?8zTB97DIx)9GFgZY&p=dG>V5U*j2SqMDS+x`dY zx~CNm_jWVZIbdTr(@1G}RI*gtpiV>6`qm*XioW9GuV!(4pO}|xUYR@}*S$%j{x(eI z+j7&LkM?~L_pqMc!3t|^aVCCD;-|0mLw|7Y%RkTV2Tzkx$F-&fhDsd^MPlM1CS@^c zF)`s%Qgl50i`x)J{QJUOOh`B3JV_KK;t26Hd|fRrys-?7_pe@qtUf-Gkc~uLE`zF( zx(ayS`U%~V*4Ye)i>;x0>b$qyA;i?m17p(-jV(AtR+m#79DbLpJLl1=C2vWf zMGWRdT7VO#MB3ie6dqVNV(Ctk4Up=!r7J>*nJ%(P4x!`Z)WKk0E$FXB^8`Wz zkvm?HY<{hUp+4k$mtf&I#!20%%a^sd7G8zY?(Qs>?-NICfBnhCD>2vb+nH~}%KhEw z{`~Wxrh;W|YYo4;Y-09Rsk^i{APUmuS>5eGhsp8WW=&gnr+$*a^>Iz6lMe)sWA}nhxn%E zH(q4~xBvO8$LR}yz{<5Zxtg^!R~v7UMID$2BXm?NDQP3P>a&Kdn2$C+#g@V9@>L{l zWS+&TrL&8m?DY>&nFxV9LU*d$B70XTn0q%?lGGC^1I>ET)n4| zW$IsxdGIPLmyP7EL8N}Z%B;n$Tel*#`sPoW!k+|9G9X~->%I$`WC^$<8O*>3lRMidp%){_}!*3)jc-GPw>B+CMd^l%3dtC zgk!Ritjn~0!;mUZkdHALhJ>vYRm_~CZKa}0!(_(9gxslB{A~EleeNnEMZUS@hDn8c z0IG@?C_3*LWX|8b3% zqjE6q)?HoT_*>$^Wm#51gY8UbsBv#_uo$>^ya;Mpjrr~3YD$>hs9y-8%eQRcEGsX+ zx&IXk<&~jAks(Hs$d&AWMU?=ylRN+AxG;%64t>PPsAW*6V@f9AOD-UQ_W!Z>mQhu< zUDxnNloSyVDFG4b6qF7H1*DM{DUt4$1}RZOq`SKtNdW=r?v^e=Qu34=pa^Gg>>|+a+xP5wwibz)Kz$f8rP-AX`aQ8Dw zm=cSKtFyns+WHR$rd!A>8Y!4VX6biCGl&jZ;**H4UqAHsAA@w%53>K8=$AiTgM-DQ zEH3Wjx2EWSHn57e$otb>7en*l0sf;$+U1OkLNA{G8p^^5=VtJq{x;GVc@qH^&rrcQ z)}V~3%M9&lGvB3txFlG*`ZE~b%;6FTC;ZN%y%lBchK+w`h)3K^aKZSe6uhN| zV_i=N{=Q#7V^k`hcVuaA81c{Wc&`}|%R1(BpkdIn*7a2TKUF)(Z&R6V{tPO2M_1hT zw7dIE+@HZ{sK$44yY=lOIH%K~32Bb$GcrdEzd^hv^`DYOU*D<<~d!T2ZqVTkJqkm_Fbcy}`24(y|_154EgBzzS-Cw8w^CS7^ zdqlFI)03^aTEa72iq<1?m)rO7Kh1xU|E_#^r2STp>h9-IXyo3BQ$Sw%Aby6+AgZpFc`)slNJ-N|88=gfqH(^4`vS3T3}L%^Ka& zNci#N;kzz0U=^4YL*N9qx@;yCc)u3#Pr+%w`8p-If(G1teL*Ll@$D)ik9+?2CBkt> z@F{=<$kebcXhZMml@R1~{fxp%-S8!RYoPBtP%r1wyfyk(hLXBQE?)_XVKSk9s$0*NnibCsWTmAYoOTd%nOX#2$8 z>TnMU_UNwyQSsvhI|@LV5IUg-3`|U4C^L~C7wvHKdugTbppapoX7e)Bm;xk_mn74| zU3+5BPh}eFWWcdqnca0Mwo430ASJJ#I-thb^PqwSbbdGRF%Oe6y9> z@w#?R8-!ctjK>VG(%DU-RYeasl;ulAPV6>KQ|G+Y;;-?a#Yh03W?QQ(ir!S`tei1s z@1}J>RolOC88g`}?klS~JEU7Y)*Jc#4c8ICFF(r)HXmrvWO~j{&d4cP67pOK`GxT_WGpg;n9FM{bJ0I6}Y=l$~9 zdG4b7y+J32<|&8$I{KZ@ip6HFuYLR)#IG8iQ!F%@DyH0v_T*#P9>L@O!fiP#Ey$Ye zrp@x@$=LUcV`QdCDmlre) zN7M`(3#U>FQL}2*d;)xjzCICd?HwkAKzy1{DaMO_?2j1Y7*@};po_zI%JFw9EM>HV zor3VoU#(2}nvFC)dP_fJP;Cu)?`t;*momnw8^A2-_vcGFZBtbi`rg6hll1kM>x$Q9 z}}H0`XKAcvJ|syQoSdLLz-KLu>H``ic52EFiBy9egTWuhQ89*K$)D1^J4BB zjPn?Kf2Kfv=?{&EO!XAE|6XgCi}xzp;jDAtzYCGc>*cr7Y>jsOnHmS_edkNFQX1L- znpg|wPzi3Cm!VIgha6Zwy>_dHIQ_fPV-@=Bs<k#&(G+vqm&S(9e_d73Tt~w>m(q`I^gxIOCSDJvmu2XIf=h#|@RgG{HUbI>cBfqGy1FC;;uiV17t9P~ zGIw0<6_k$OO6Ix(RdoCOvy0(OQzTyYrrPQTMMxbU5(5=p?u>jkl54=u$@v0eLbk4! z%%<(f*0;=>m1uAWRAOe+Tnwe-_!M%I(bM%?C+#(g4d7p)mc{ZV zd?5L^I*iThJb2so0*nh8!&xu3{iXrJ^uFSLy=cp`GaYSl+Yr<^mkGR-ux1rvW&uHB zj^-BCUlcXajw)Ma)$OfoWgLQl(h{pIB@g=|3=}sO@m_E(0hgZ>VeE9!iePNj*3{%wV+~daE#W4~l=h zOJS2h76F0!fh<+-ahZfKD-9M^JIxNAjR;TED9taz9zuvg^uM8cW<>I;vvGse)kcNIu zg|d0R);Bd``G?5vzzzpapWd2b0M~T~KB$x8_TI#~@MN87T(&;QP9fgwLj)bsyjle` zi-)IIc>)a!LG6d5LTo4gJRNsDq|N;?$x)i|SjbUXfB8i}tP;KUo8n1YGYz7Jc4-}s z+GB>9f&Ce5ic#)QOL%UWj#@MW;D~~_HAI&tUM0&|)w8k3{`deDOdtI;EPeyfD!aDI z$-#Jie?wWJLQ+3EMp-1y@6g_)cCfPO?$2}6`=Ju^b!VQFd{_vTBDM58KFV1QD|6ga z0cit`NjCHPCa14dH(q63e02XCI9aL34MXlCemjh+R6H_mE0@Mi?!!_oob~ix6hHt5 z!==XKkvYf}#j5SU*nP52u^HG!b%)I$e%-0t1ojXTidoz~J6cCtaWK?5oG+1pOVop& z3qE@@Z1l4Z$!#r;nql;s@|Q4A1C`(5w{naD5QZe?fzE7C##f^vfCa+@i^DT0IpE2QI}~J zt-j@p?xNMNaiNUn%gDG|s}>rv1n7NNn66n44r4W>!f(~xQxd-?Tq>TWPT%Mn&^k|* z2HeUG>NF8zerMut#yBJ*EFPTDjHAk(uUU2D#@?zp7=jQU;lMcsdOQ>f%U}LDCu9Z@ zOifo#h|2A8Z|Kc|W(j<{kZompcJMg71y?g(+N1s+L%w}zNW&`>)3~%bgi^LkPqsml+``U5%Ydh(Ql2 z3jX|H#AfyTbwgyZJcvm%<8V*V7x7xq(%dijAX{ka(Qqtw>3fDe z`Okf28O8VCt=NOYBhqR}z95$bw8&n+S_A)lU&MppfeIfzkd&XqC83I5klyHQ;#2Ee z_`7=cU;kStWROoSimLGd+ItIL*Bw(ujE07W6_F>z=Wt#w=G6d~Fmy3>DJq zcAtihuBFL3u|Iki7A#~vK#z$6=7@l4%U*Ckt@LVtD2P)v9hRv5VXRy;bzA=j0j2go zxcli8@uPFf=u35!l2jgW1;vN*p%^en=t&KvnBl*gpT@_#c=JyPb2=RjIpW-yEeKpUzPsKRhN?aCEvC)+~8Lw6cj`=m)S%(XKsFFdJIb`}7k zU!;@8Zt6Ae=-gw6E$}%q{|6+`ceJ=6l!>CE!om6rHdH^i8Bhkc1{0>`zf4VP4n_=G zpNv;seUukhSAU(X+E+-gSaU~2L|A9j!4T4tAAsbKH#+7ucdwTjNE6VWD=q_HGG5~b z9A=2{U=q2q_J*YS=HvPHgO<%^h`owtjpRFu&#!CMy~m-X)JDE*N;~!W6CDh$d`-WN z70a<*8AEt$ZR_FpxjJ4S!C6@u0m|Q^&iN3{KREvByLWebSPRA%zKgUutd65B=AgpwE&;0`orJ~~Cz`7M|YrXN;9n`V%x^v)jg88fg zg7lwbPaz=B*=Or;nt@>1b3rYBp<{$4H1X&-(EllOu1l1@Tk+^ZX zr&SIw1D=1tqo%_`MWG9%#O#{9D1h>nf}Mbn=;E{8x73e@rMQ$64B#*o!dQK-R+al)y+i;q-rXPVxc;{&(Gjo)yt9AO zLlq+Dx1a5ZANB)Z=8EPatrR|f7>)Ixm-q^AQkV9LLYF%BZ+C>PQhm+e>lS`GnE!(A z<$h$sLqN_;w*=I;PlGh@H=VhVf4){%S5qdCN1)v#r79^jq*mXZI4w(l)FcMITUvW5X$ti5AJ@)9-X6VvbV0rrAq9X>CQU}c`zmRltv351MV zkX;-(CQgjKIEp)i7eRL(k#9NVak+w#tVspuJ3GMXV;Mtc>SM~Q)Bn+K|EivbhKAw7 zucbvevvw}}k0RmGH`nD;$DakxrF%d7`h=x|J(f3c7V2{uxqrMZdDrC8U=_(EKJ(1UBgF@) zlmQn;$l@+Goa@3!m_TL{cdo&Wj^v<^Ubhy!!rfQjn9x$sxoIZGaEL@TNSmLb81`yq z@A2K^w|=cpQI;#1bfT#V>f?L`0m0UK22e2>+ZGQZyJFgz7H@r=-N_eaHV%?&M%|4^jKGs#J z!BDu4tJ1>p?#3f!f1!-GwC*u{A)Y)aLrSU5N&>GzL+^XHcr@liH6`wDE& zy2w+>OxcJ;jnipP(x6_`!Z6OA6mi^|WJ-qt*qLs+OYh2qe`W(Q?duAo-4&?JcN$u9 z8aOc}&l<08)4CoZFIP)Tjzcgc_G{~y`{jeLAAjN3ba9ORTMK{;3nKR{#NIj{TCQm@ zmd3cz;IG>>K(PjB6o<0BJUfIY6uBo|*V}%$Ho<8TE|$=7&i657OU(_zLs|4J`wEaPI3I3dK{mE~ zbkrf=@X7_4am4!L3#hvkBzH#2m=I6^kd-_L-F1HRMj)6%_y*#yp_NB;tcucj-*EW@ zz(yz$RtJ9>phF1Tcv+^iX)>3~4~N7@lbMLBg^f;FkHl{wds z7fKA~{IeSRblxdpWJpCkZ@*<8F$iiwX4lM($Z4fzzfE)9JA)WFkxU1BU)>u(Qe^}( zJj=#68c#mW##f?liz1GaDKlw1#O`#<_wmqN9pf{Q$GKyiT>44sC;qD6Mqt=i!tQ>6?;T)h4J&=48=E%KH`H-9ULKCUPDaVdJ! zbu{D)Gcei9cc6{~%nI9gb-i`r0|FAzwC_n|5<&>=7l7~~3;8#_@p85rBoj~UX5IeD zfj~}18legPgGj{a0zKsI@vJv#&kyi0!GIJHlI7!y-*rA;`j6KWKYw(0hsh28FJx?C ziacF|Fc0^0VU;zP^)2)aj_Nzv|J018gOvgUl`=2KxS}DDTtff^6I5f*9I=N?{6M<# z0Tdd(t1c6~NbU_<(HOT4hw3o-?87THV8yca98-{!duMcwA`oa77erv{6~A)yJl6SW zi#IS3E5&k-q8W>5kI&Hz{pqA%WayCy#4_ItBa#;P^0_j~ZB@leGh?&4n!6RuCJ00% zPl1@7U0|nq#X6-#{oJgZ|DX8<>WWo)@u3}|jTp3l&bmj<&$cxtT?amC(xNJy ztRHS*N1=S_)iU9?4iq`vBi!_99Ls+b2=<&za&|~JV$&71<5X)v0ozLH$$L9L6Gy8E5|;ol27?yG?7Yz znD3oAlXQAzc%0~sNVhlX`>p9SX3s!p7vMISp*gr8dY~pI=Brfc>+rSfv)PUEgMT6> zG;wz)G+syar(2`iZS{*uK*HIS`-BWdqLB==77DrCh~)Q=^zyYgAD+({w@ym;EQWm9 z7dL!LP^tr?Fw7qT2*PEqhFR8`Da@x4^K0uwYP>-Ymy|0TTS^K$!wxcW03uKkNpzd9O zJX)8}bv1#^*BmJH+@3f<^qc4IYEud*GAU->`Ijd4z3|bqMX|#X3OQP+0_;$W!Y^Oy&iQN0^`zjV<`nn*P80Q?jYG06yV;^Y#|zD4G@qgFEVB8Q3h8R9 zRMwFduPp@;t7a>JX+Gt8?QakWkHhtpy>VzBeN~;w0a~-WY?_#Ia+ZPQoHqd+z%uTM zxgV1vIP*c=YwUTFcd`1N)8-Fy@VcS#e=u!B?MYET!%xZ?{$aC*hkoD2Nw9 zpTApdT)#7_lk?}V5_kQi7LoEBO-s}-toHIPb+Mi1e3h0#5PqzVXGNcjw_|WCOuAPN z3_NP~)^1ngw&eg#IYGl*VPTc;eMUDuz_MmT+^pv3AKfJV8#UNc7}#aJK6t-1@bd!( zUfv$R6i|KXwssy$7Dcft;}30{D>NonG;ijqSo#2M&%-B;cTIPhgp^e0sC!*fN;BJb zeb1h!H@@hg1_T!Ik=?3JWtoy7R72e7;ZfS=g5UdV@MO_s2xWfbiK_IKW8vVYCSQgB zMfpp{C{jg7(7xaxRZkVm8365O^7ksAoB+1wnK;AG$sh6qYdQ^W0H%2Kzh)x!&icf9eH}@Fd>Sqc}^Ii-SC6)$x&DSTs2N;r~(qtK%Rr? zMN(=6>n2l?PmD9^XkR8>fVPTCm32f)i~w();3!T1=GlOIpL@Bs0ytSc(mj{BNkXd` zJiA@V59*(^;vlXI)b;IE9m~A(@M^wT_hXdpq!zQ4oU-d?$0hH4S!dIZXCBL+;Oo zT~+e5`$%!fhFi&x&#ZXeZc+Q;s$htqam zH|hJ}n9f(LyglQBa~&~lSL@B1Fp1hP$ohPW3-jduC}??drmIv6ERRFv+>%lNmP4dJ z+lG9o2>>FAmkQ+XSZjA!6r>MJ6wh|4q%j6%$baNY@uo;^g|TjbE!E4xo|Timi|s)) z!oDJ@Ngk>W0|-#zsDRAEs<=v7!nW2;^{>mfp=%M(mN_D%uYSa<4?Tjs^)C>4=KZyg z(P`FelOFUFeL*{uEg}ExgdN%3>rQ*LJ^ShWWdCB#?81tILW{>^0SkFLDzrEw@gTs? zKnOZsV#~&;da6hq^W`oOa>l`d0Rblu?&RkfI=PoIR4G*Ap~UHHuR8Y&m9#~z>i0JQ$I>-2LVz|$Wbw!9n$gy*?QJ4fiJ=T?wtV>p zSM|St|E7RG-)J(ODsxJ%`R70-@`7PRGY)Ko^+e7k(_Ia3H2YzTq2y=e)$zP+X4n$q zjh)w4^9xL#J^bVi5QM;7As$FgqN}CB(&ECg#iizdJsG1QGKVjYnz?) z(-1>YV#(AwU!Wn_1xCyo$hdc&>dZ?ashhC2Ltj5{6XhP*v@w%5Q{TBhFz{V9qW|ZSkPs!^R-Em&_prnzQv$%Y5-En%S1vHSP z!$sclyf(i^&DSxUqc~S}LB_`L<>=g(2@5wwhLqb=;vo`81N3TK_JpXmvPc!n?^p)O%EWQ`SP!H&OLqb@ z`m85*#5d*|M8*T&*L;KAd1Rvj2MJpg74HJ@t!mwfAmZP?dpCGvB(FKQ@&AP%Xcpq5LV&Nej#NPu3k(?cQ)kz^v{qRb+n7KSk zcBW2Ik1ND<9fM|xP1753s-LRNcNhN#aPqkCl@~YX0bTOgaunmYBW1Ed&<62dqZcu! z2|eqZx@$Y_La=u~H3xcatPQH>Z9n-)7%+ceuN(~+YMP!u7ro|dd#8lSvtvr64gj$} zMzD8w@3Mxp_oMC=y#RIIrqoze&8sNBZSjK^4_xo7-~Rl+kMTf7%%)ZMDtcLMs=)&I z1K<1Fu%@zAT5oF2${`^!XoyL1oNMB7{z=kCdi~6Vk%s05lv5}OtUL6cLx!y1ubl1! zuA`%`j;*3nAzv45otYq)ROdqUfkrkDMMAaEESiyZrEppj12mL_f{EwzjAL#5>i9k;i=(xIS_43R5wM*iq@{4Vx;O& zaU$Qxnwb;^@izbTH3#_S~Gfdt&9{d(&hqVKN@|Ry;-0sz!I#45zji(X&tGrm$8IaBY z@(^vi&wNhpu)~|JfcnCj%WRTWU^o5Nr!c|;KR>_dx7?`Em_RVtn;16B&Sj#83+c2X z?`J&&Bv+ov!jFQeSDbn3=W!1GA_@<-2S{in?}%DSWEZ=M{bVayTRtR)VV3ffw7acR zx^_m=fd*ZT)vo0ATt@TSB39a<9;cNqSB>Tn1Q3&`F&H29zS0&_)epjfH}xx@YL6+> zr=H?bQnCr$$s=Q-OQOYZ1)(Pe%nEz)ZmDV@H?^84klZqhT`w~q2-2R4|ah^7IORKc~*};zFen$nn*T0veqWUEZfv3V^embl9&3$LS;hfeSg9I<1cZM zkW|9JA}oZCzOmO}Mk7moT9>`T^2HdLf4SHoaYxYb1!xmJF4do9^&NrkGooEqCNk^T z`QDl-L=57J_Xpz)5nc_@E{tEOoOR251nuCAt2blu}C}K1SBtL1DfVg&#-V*Ko#ywGXmKV4lJnVAf4yWADU&I zV?*5=NFuDfpvz9Xf=w&q;0eSmoDanoL19*asXxqDtDtBPuGKl5lrb7D$LoxY2)@_w z$KHn=0hUSf#CS%Q+;{*jHbagAVhFx1``P?~Gn&+-KDZMiE%h~GSgCU_cRDxxV;0`LX2=6_-kScp@loPq5Ra+A1u^ zB$xAfp2xfZbuQ1tJD{C^zfX%%>p*!sGD^DsoEC4O=+lMKTruVL@w)g~M0D&WCa#>N zZjQs#vr8{PEWrtd5VjDodwpma~Q&ChDUGBrT2J%e*tE{+cmwDg3*JL~H~ zz=9*IvV$0GWIT>J5?V5R8+FLm^;2bY8*r{npwAh+=?-2;qyyWt-7;1$pu%yr!h@&hR$K5 z|1R{IwLl^->KD?I?B%BW?wwDSrFXH@CMz88kk2a-&xb|!%eUTFK}Bty%VD*DYC`f) zkzD%J>-?|FQ|+w@M~tIew!3}vm&K*|zIRH9S6ScS{SG}lP!U!W)p~93QwUY%+e?x4 z<9g#EKgOw|ciuE6!}5Y@HYO0ByrK4iqr5(`T%O=w=@qusxnpj#x7ee_RAMf>+X&-U z=Ej>L$iazzY3=Ep8nVRPuXJ;;1D-z+@SL3JYX&4)2Y6{{0O>EXl%vAB1c{kdJg>Gc zNpkl?{MM$+O^!dvLTX1TjT5>hP?H5JoJ>mXCXPr#>EtNXG)B-6%o-)K(Ntozpd%k5 zZ(z}<1TVdNzKlSA`F<*d0dv%hz{Fv}&I@PKK!cu`_Cuzu5}OkbEGg2TVfNC3xbH)M z^9sA4t5|0}LCtoJHA@PyiD<~TPK~x!0IP9A7&}hLSQZplsRuACRy$I0PZzS>3Sh zKF|4&_p6P&WDhp@iK*Miu?T0@LPf!EcKY#g*f-~GKlVW>cXa}ish4`i@Qysy9{wUN zimxLJ)abfz3+V6h_)01xlff-+!|*my5h$j7bzV-i1R%jaVpyh%M5CLh8CM6 zil@a$X7@U}KYd0QsXD}#gq4s80aa`2rx@W5pbqAE!GzJrwIPHz-+e@Q1kzMCQSlJad~?JWM_JE=&u;m4|K zM@X~6;y4bJDXyZXUh~aCw~*)ILg?*I*@}(6lO9kX>93#Ae3{LYe25RK93Ov=A89(*i zxT*oihRBzq7{|{&5Drtfua3Pw7 z&j6q}UH}yVGqKY|zOdcD5DX$0yqTFv z_~+Mhp0pb!<*NdEux1y$d3wf%M85t?!^A3I`^|_cGj{{=kXmHgi+~x|jaY|?fy__G zK&UjSZlD-;;ZCUH-23D7J~g1-WdnVQ`$@0d{{CoJjUKs&0C^nYU{@5IKk%yxDRr3V z7pU_*wkU0ZaUYNs34DgbO?AC0sLTx#XDT#Ez0+AgDg$Q{5%@!BeUgS>`I$nb}az%a)d7fmH|-)%ZM< z8XGsVVh4^Phy#Ad0KK<`N6)q#^?)3Bp>&60PjMSs$my9I!|)*QMP3-fINcSgCK*%= z`O40j=M%IUiA~t`ZmLAB)*Tzt!H;Bx7Cep%rR>Wt26&%aqaT@i?S4O;`=BmKo%FRq zb|F#a#lxh;@N`Yl&fOGmB)gB)b-eq_bFejg1H>eL9#8N0Ce~-mcVsx~VY-rGzJ=-; zn*0%8g1PE#4$%-gF+;8khajR&a~Cu{*x*#l;V6)QRugo!{~g*c!_Pq(T3#6C8oOn{ zC-OU!9d6)Et^Eh@`hwkLVoJ)8KLpzgP}Jm&S%?f};t*y&XVc70-v9V? z{hI?-av_h82|u@v*Xa`>l3y;OF-8@2#BgSHs%wo*)E_6azcv5$S3y!LXw6ykmDJzY zRIA-FqT5`a)tq%3wBIjSr-l)#=uaH?{5rkaBzw6)72V zqIBTf5$&VUWOo`=i=Z}O3g=ef{iNm|{`$RIwY;O?CEqW{@1EcVm>UJh2b=}1F=a%5 zz~EY!>&mb%J&2{?^4-5{0Ebj4;KQ4LtfE)Tik=fO30S4~bM?k%jYtGG{9#yI}T9ZKw zv_HTRTf$aK(N52z{-bPFOkA7HOgASBJnw#pfMz!D=I-0io;4Bky%j*>X*=xbM1AB0 ziF2l-*}=3yWb=`6{KyqpWjU8(9Oei1zv#cK=TxJqZpkN}ECE6-68B@cV{z!7nq;`L zR=vBovMHDDXrM7^5rC=(od3vl-P-}|3o!dYaNgw?s}?Oy;u`A)Q$f;bsW5I%kk z`~kO;Fj%oNuw0l0swQXz&%T)&mSwJ8P&jtqXi(KVm9^0; zmtH@j6v$-{OXn*My-p+Lnm7Lrw@4-OuE?T~G~_(G`sz|SUa8Nm*Ds&hq`eqnc=cDK zrDL^kz%!QclaNR7-OEUO>5h=|aOi{j}upUR|V!)&$gT*d#Y@+9Ms)+$}4yN#>JG~MeKI8Q|{T5wIru*39-Vo zitA`vtIvi-!!{q%(d8+s8d3VG@6DKy^=D_J!~co9cO#P}tX=9dxdV*ZiW<(td2NZx zPWuk+HpW$OUeA2td!o{T-#UbI>Uw&R!^hGC%SOG}>f69!`RZa&Toq0vFE7c?uzj(r zm?Mp#Oy_Qy-TH7arSkzbD{JBcb^9aTK|7P-Y_S4vyqJT!e`^6;b5yIiEG*P_%F8M% zGo9@zb5)OZcdy(Z%s11(7|ZTRbN+x&&fj5j;RdPh!^8<_u_ z_|3dpm)=&a3CDl9<#GApbn?XWGs0}Ll)Q1sFvucH@W^YdFt5n%^d+{+uUnQpeC9E!IIY}ytIn?P?W-p$ zDk|YDij&ED;+y^!3E(cn1w#&hE#+{U(1p>Ag^PTg?wCIPF=!~cBII2%xW2nJT~g3= zV5y~*7)Z$<&pLPbfN=xnj-claJ)9aJXLmSYcc)+v2P(Pv>N^$8KTWT?`0XdA?zQ_0ka%sPZClz{VmMY zjx{P}U$XezW}{vg4|9L4c@^PaKK(rI_KT{yj_FI3Z3lg6>7k+S4|edKjxGF3=vR(L8nU?->S=?V zieBpdS|q^0!O?5c)=;lE5QI4n3$qtz(uupDJIqBzL^yBSbbX39Vq!5KvPq@9eDN_j zSiz8QIC5mV;dh=_U+G-q8W$skEv5W<^T#n7vvp1}0)L2JyHEPTLIe~3%Lv>9XrMP( zVk1B-JAxf}A??`6<=qOmotPAyaR&$IyV5ZU+s{;zUY1|1NI{cM^9SFqYS)w8XAT#X zjXT}5ZdX=+2KDRrxnN)^3aWoz$21zwmQ+I3+>eeN_NJy3v+42(!p6%cn4E0Qtn_iV zzJXiaVCMd)+-olGn&5ATK9AG`+)9_eEj5XXkKCUlZ5V-!o=IOa>fxh53@9i>B#%r4 z@IoEexpnCC+%-RDWi5Ep|GeZ983V_{5yLE;jj@5Q;iSkT{_3v*&zxUR=3fN+N*ii= z5WZv8cDz;VO7mr>VMnIH^#nOGYIeDE$u3ljVdb3^HcqW*6=j5R&=XQ|7y@Pf*!P>a zY{uDW+>;<#Q5}8#7xjFWC{_pK9cDeVTpkM?75M9;72bRg*jNmSG9J~quwC4lo?M!ZOM++C z!K5uaPx%>{8bi%ujMrty@a(U=Iu7lkjH^15t|l(YxJ`8IhE<`7JzGJPM8SAtg})4o zkojYX91YBrN|P<(g{2rq{T7sg(fpQ}$$@vfx0D`a-s8222j^vkq~Caw$A+$5Jp`gj zbQORyc>@BR(k~0@iOZI1N5~n{YIn-Z^=-JRs}EkB?V{3fn!R~b=Ztc&rjXBfF{RAk1)2x2s64^nm+o zSPx~yJ3T#bxd_RFwb_WEO_jl4qRVYg;5V;cW5pqMj5ejz&*_<$XOmKR_64y2xQ#gy za+jGn1G=o{e9ihdMT!^sS59}C--yLo@(peKH$2Y_zPu}<);3cBBAckkCw)qzo)57% zm^JrTrS*F#rA9m~#|m%IhDUB{J~8t7O}Maeyima>_25mGn{r zeXge9o%PXy6`h>Pk&tHQHCKGaO|QUGwGSt56>K#!#Z`S$>w`2WIej4qzb9}!JuZ2h zGlo&{+L+ZVIV$oqy{9>tvL+>^Cd=d3{5|jvI9HhZ7`wMOZ{da@!sjF=legnn=5^#| zsv_nfgTLf`L)ulKaTRsSY&`zu(s>Nen3tbvOhiEe_n=|wzz9`O(|&S%b%5gCa?JD9 zVDlJm7p(26il(VrW{{C*9Y!TRa%p=$S#j~HczEKTUC~7_gIp%h}Zff^eajzt%&O-{;tj>6CS z?q@E(efzF3D5!$3hNV8|?PJoQnjJbh{2(nQ!;x5F?&9|yMF`hFCv@w<7Q=~4US4AX z!NHH52kwxQrv&JuJYEx>Oz;8N5hH=RQpOTvnQR^q~LM=;&zq zNiHFBV?hU=i0DrCgoEAobcJd?@%D5|!HXRyq4@`bXE(1W4{j1dqeFBD_5^Z^D{O&b zD(AQ0-#D?qCCF_XHD=u2oF0GbV4&*FaPTxRNOzO9b#O@SsKr5!MDi${kqC1n+mJEb z)goBL6{vXgCQ)-Y_}-;(u5v;A@6#KJi#@ThiD6Kx*V%CzMzvKynPFdE6!k>EK!zk`sEnaqtcCrrx>7 zNF+Zw`E~^^d;R^Y?w=i%gI~E==uQ{3eS&g0C;52B6Dch~&hD?)F0sCW zjIN0LDnV_bA;PEMmkf*36Msq=yiF=See>$L_OkfI1-#)&%vP1uT55yHiVe2KWaIw6 znV1kuudp4Xc)~jeNcK?Ahnu@%K^xE>@nPy&6AXp#WG86+ZP`;58?t<(_ZgeL*qkcE z&*Sx>tgQ(b&&J~|Zf9@swJSSVE2=-*`ao^D@v#_m&}nBqW(Q6V0YRVBRFk}>Z(+5; ze!pRxMS>GOyu7JF=sC0=_z_bg0jo7jGQ;fK?U@RfqRDKx{(MZg!IuTMI(t5kdU@O; z(-c3ppE=}Yda%dp?H_Eg+dn`n-jr}CT!fZC;&j$?^H{w+n+`E%DL@wU8vH(JF1H46nGL*Xq>xys$qR~&dvS7;Axi8WRAFZL&Kuy{4-2TeCiK+?bln zA+lS?#KKCk9ZR(PJsHNi{w92Kax%B^`0wBApF2&>&1K*$MNOaj_Wn<*jkQ+Js~3kA zV@#3g;h{Egvg=WMJahW4T3>?;=Z9_&W!JEO=jG}(XnAeCKq!BVpO0{!v4zwzZEUFK z7NyEH2TjfRl8T<`@z%i%sa*ArDzll6h`ce5aY**JM+@%5jrs|rvV(dB5PcM4-)eX^ z1wV2h$G*Y{xm*2Mh2pzw_k?Vw=aW>PFKOPQN;@KgBbhIe#(%j<8)1ej!!)Vt&|AB$$F9h#XHI-iCYDP|T z#xUi%#jxd4ve#~k&gc>1ljb&LUgVG2l?t0)n5JJ2+`4IHRh%VHn|V-~UUcMCjtR5s z^oG|0x}$mLmiQ_w`##jk(A21xZgJmVyk8Z#WT#>LGA@$fVz+PVkc@j|>vE^@IGA+F z&_dfW=T#raN}Nd-g|NGb(y;f~gHpADS8WTC6 zkJGf6Bjpij1#;1kMcLBaUc)*KB;kH>aV3Vck>jB;NTCJ;=YMnz-K5}))unC&=XF!N z+8zxDL?>?^88cz@Bu_k48(h61r~ zj+J)@g*sd!KDa(3(dC=>peE)qN+0;_E9eq_pUHBk)R`_-++^8yafRi{2QB!WtWz>d z@qH~}bOGlAI?=I-Zl}Z6?_HvLtZE~3=&Zi`N^MPf^y{3!T{|%?`)VV|PdcR6F89dj zCmZ5%wzfZ&_o@D0`N^JwkML0^_LR}M6&^hbQLA(%LEfa25rr&0k>YoE%o7I1xeS_i8jva$>6!qq?d)A+)PdzKw%IviYBo_r z;5k~Lv7SJ=;$DT!K`dslJPW2ANUn=R*IOC9@aZ>93;DUf2U%=!CL_7XH%GLH2dOrC zN3w7_>b}bOik}XV%;v44`1vLllvP=*g3-LDO|~RY-fybh)@zel$SdL}c^6{?3*KVm z4%ag=cU$9cH8obFR|19?ePqKdHP9=V>mYB~E|bmG?+AvaVj%;tABXYI2$=*nzZ9u8 zk;#i?khsvFFTH%==0VX7f#A=+VkYbdTS?Gr11hwid&a@E`Y=`d+#%e`&fP=JwVK zRbl$*oxCs<%cjL1R2;unw4Mu6R+-P4+a*B!eo}qDJz1gk?vKyyE9=1!T4bJ)`JUp! z=$nkI>oo$p9-XsW%jXss%ZAR4ytb$4h$om|uD&5;<99j7f4hEvF>5^dl~zW0;ecca zQ=zo;s|&4dG{6w4rzmB$Lgkf}Dw_-Q^YVv>COI)IS<-O@s$+0kt{jhSB53joM%AzO zJqHc-^}?(%f@s_-A}PGfFWL|%`@G28_+7nf$d1Py~fQp$2kMHWDaz0t~jEEqdv)@M0lk|9; zI$?xRlI`qh6&rmc{dlSs*5>T>H?kZ(QXtIAfwdck1|hxEnA|nYi#4sR=({{F$UWH_ z|30@=FNl>)xNEh5UuAKF#7*10Qti9Zs5W2{A+H~E*5I;8ZD2~hP3m@IUH|nnrdsLx2au!P5d?QS7n)~(J{Jd$~NnF|xiIWp!(^2Vy2Hn|}G zomb1gUC7$2rlIlYY{UK>2CO5J%FPNL7j#Wc!CRjUg~ws*VQbx|w|b^spio>B)`|W< z?0t1ulYn7rq*9!o9eiA>az2udsS6cW`g?`cF%?} z=NsTQjpB{hgdBrmN*O3#PP{t6BNfWOh`P50)%Y1<54rTM5zi? z{WZL+t0zSn_c_A6x%BUpg2N-vo;f!IPSw+KQQ4hw-9iBG z`|Z>uYM|VN2~LFmn#1c)eUZNwCVt@e;Ph)k}KSQRu z0V7G(J^XAcHpzC2cs7nC+^q~2RMr()0mlP>r;0)tT5|64ALHN#B9XP72SfRpJE9Ic z^n_g2WyJeDCo-kg!I{Wgk3lQ+v$1DCtyYbZ)2 z0o9(9E?RPugPeZIXmbMJR9RjQ zvu=++s$C-B$v_#4%FD{a4LLztRl5|AcM)1(ZCGhsLcm?J46ylRWHXBA|KhJQ@+QG(fB{2a!W9s!AP!Him zi=^jOkQfBqtp-R9RzoT+XNy4Bzky&VdiB%#Ge zYh2aWPrvoc|Cp7{3ftPs^=Wbz%41 z&FQcnpOU`Js`FV`-?*ciVVTP^(Qx1tjK( z>aOzFgW{Q!+Ih^QqiKhWBGypKSx0-W2y;Nc2WB{50mWk&KeCPoP!FQwsV{NeWhx zw_;DMHy2zsm-c)L#?vy0n4#_ESVWN5h9Qn4-4pS(r6uh26;=>WH$f0sWmP54Pl``T zNwEgl<(6o`^b30~h|C-FLqd|Tug~H)St^V)D&6R)4hJPBMqH6aA(49Gx`vLpqj@`a zN6C|uGc~7K7*nEN^bGH^3#GTkj>B^U=rCh4ORYfA>|pr8vuBZmcgm~|A3|mRP;X4} z!O2axi|g+*NXVlE9e7~D6-*45k(3h?yb^x5~_wQQcBS-V?Hu_HR*eiPHmiSV$Zl&%NCjUI?(b=F{8!a7|I4}9P6wF#!U_ij zK$j+v@sDxS0&*4LxGHRJe0{Dw;Zi* z>7KRg_xyD>zeeX<;_{4vEo74J9+bx(kYY`_%y#n{JxYrmTq+7vdzg#hTJGC)k^=cC9t7*b6V|UCS05_=# z@{sF&WTcoeSHQm216>sJWNWLpdg&vEWjF<`ot$c0a!)uqmJ0d>Oy$>rVXT=YoCR{#e=7^+_Q#D);Hps~ZD z4!Vg=pFXol$E|Nivsxi!(!`+D|L2?o1{R)r{O*W@`5|eYuS@ElYahxpQ>VoTO0Q4Q zBnMJFODtJ^ru7TpMITEw-`bZ+Flg>)n8Vk_l$f?x^=;7?4T@Nu+X~~!k$YVYUr-+o z8VBI^ofa!(6IcO6tZbi&ftf5Y9R$LS5%1$h72aC;+u}`m}*zs zM_Gz&bi{m=jY#(q@XXOLmlKzX<$CP?EJy`Hy&5cg#GODP-<$-XoqZ$rB^Jv}Io#*& zdo9A+S?}qKL-d!pyT9X26$`kQZj|tPHZNJSj2Us`#%KGTyesESI3(sY*sY@Zkz}C^ z?9n``tT*pSUww*4TEz@1;T)>+W@VQ1vazy4+k(=sh5?ezP`pGjl4j*3EK4nJ)(q8s zHFiM}p>l|R3*BL7Siq5;GDPm))4^R2ZKCNFyGTt)uWCd|Vl;l*uH zuceZ=t7xSSU<|YYe%in~Lh9i&;yLqZ$O_%O0iEzhCw-Ri-SV|2Va)Qe1Dtm#@oX519#?IIeCd1 zKz(OgiyvCsp$MQf??cD%H(3MMsvx$|9E*AdlvvPGsRqzjFUGcmkog9_O-Os&d5yIOmc5u9MIBv+HWOQC-zwVpqPW3@b z6<_JBY?uLtb;GiM&}siQz|#cw4RG!6iPdI(_&T7S2|%~mfm-yEQ4GI3Yqp1{%9U~e zUwY~QpSLrTPP3m4o?Rjd^*b3?x!L?B9tU@+eq+^?=jG3G?T>)OJxrc@_1npsdxbK$ zW+`@Qk40N>D3Qf=<8F8>7T1lL_}pyvOtq2DT51-&;Z>yf?~Pd^4(*uLu2JPLDz(tjFJ^JQN-gah zt_ybj1f+Y(bwzc`w?F-tMo}=|)2qi!SHC`x+S2}5**`dBLQxlMB=LNQGZNbI7d`K= z4H@DANT49uhf+}g=M04gVO@JHtS}puZZGYPZpUq=4>?iKu2{tQ@t*zuc4g%R>WoG` zgbb-TuIRp&NJs4xH<)h_iZ!U%K2CQ8Zf5;#TCYu8uBrWc;O<8}7SknykgzstXdS_! zdEv35u(hG$KweznWJ<=OE4HK(N=-3<)oOU|P@r7h6JGE!FJhVlJRVp?k&w;Q-eHNM zV&>hVX%BUn=e=k7oeRNZu}$sdL?p zeK1(HXVICxfC9IsHH*Oegp+@L%j7XO6?f3E1di_P=%#B>E=JonF^ng7LW z*7F>ew7Q2d2UOlF`RcMjH*g@k&w5QxA7x$B5A>j)XMng2xU78Ak0PRO*G-z|Uk^nQ zUtAlAxu5SCa5)TKgVThkYd$>}bK(5?tAt(fzBN=&=V{bEi`d4O_oqq;MP50;9Bdj+ z>^t#rEH@_z_$NIj#l*_HJfslhvRJ$N@uE$St9$?Z0!Y=V;Pa%ZR1D^L&BTRXh%bax zw9zF9iob;EG9X?M8ri}FyXLl9;ZZ-4Q+!SxWx2DD*`%MB)bB)l!d!T0YW~xjmatbR zRt^pBm#@2=D$iivNKcA74s)wwqJa*U;>C2)rgLA{hChnti`t<=cSy!GDH#zY- zZnWFe%A|~>7wDTC88s|KU6|d}7V|P7@V3uKivJ0`YwlZt5dl^b& zxwmCvxZNY3o;HkJD9&Hsj4{`$2_CfS>2@9Is*P(CF>9>mQ{14DK|tFk?_j!*N86WT z^3QAz%oPQy6&hbI!DgAPP;KNc!PY=g^w*SiEE_Z`(6xAY?K*I9bN@_FxT|PDh&1l+ za+LDwn}T}AgQ4M}hFkwdIo7wnms~F^nZUPv|KjK@LHzL^O`r{npTFzyCH}HdgG-YpU!aoT;YHdTHzGKNF-bdJvm^7a z;|?ev0TyBNrZodQ+#5F*MO2@H=<>L6JJS)hJ>w+)hlubB4}8QG>A zHuqKty~LGwHKcQG;2Rzwg&U9Xv`Hb$Sol zF8HS97qx!QIe&BOuELKn?{%Ygv^JF&wk+G1vn3jh`Iu@)_fz#m(5-)h<XNG7>_dT;c-{Ln*5Ci0-FDV!sqq&)2XdBurk{{kdIc)heW@ zpis!)W52@{Wg}fs%*H9OOQhS?sAcR|vGpp=tve|SX(<)Oqv?(UN^{3`TGUV`;Q>(9 z6ugF4!D85uE%Q(=yYS@MhcNBFb0WBNYWgV{-pI(T)R5GhQCU!_V;T_s)X3Ev6~lQiBv z5D=aJ+NF;<9_uV;wc*ih3 zf+N|=@>6K26nH09dR3f}x$F4yAG0O2v3&8u>6w(9#Ojz1J==Sy zB?Sc^Gp>MzLG;1#2!*IebX*H$G)tCklW%3j#cu!w*U`}t$}BI4A@{du(MAV@PHz0y z^ES3yBry(NCLe%&$BlK?j%?dYrGZwz;-Jv|zO9cQ(*5qdfpUUp3ahSP9z zJG6Q}RO&toWiG+@+0%2}$SD0v_^t?KBP;Kp=_Tp^j9{asp|MntR$C{$RWw;;4MBj$Y{q4Ma>+8HGQ?#i=|s+s@Xn$^1<2a?URv3|Jirff$8&|kB?jN~Mm zUt?qDT>VQf@C9$cljiB|Ew8wAuVNHh@b$xNSZS=MPf)G2QFog^U^*wr11H4CE_^Jn zG^||Kj-Xq7UD0;?pS%d7`Xkb?!rl2Qb<0TAR>F{jxyDrQh36g%A#`nYfOeiBMS1z> zk}g?3Eu>4MOV8JQV6yl9*3Bo;n#2MOX%nt4O*fY($ZY5hYE3J5AfBb!DCFYrk#uPvfKmDO;@WZyzqXZlV zMtAUO$3~3yuPUl1ME6v|q54Mz56R90h8}uY>plyny1{YN;$Xce&z%?A5jVq8X41Pc z63ZHJwjx-oEQPJ=h$Cy17b6s$4)hLWY)=Qg@SJuDR^-yS1QGqLtZ{9N=ShNmE z8|;_*dD4AZ-xlw*$wP4qy)KCpRiv@kSpCmdL}-;&UnSh-Ct!gCuIK0qsO9*yqE#P* z5^)EuDF*q?dytX+avG#Pv?JP1IL%%m{p82U6}3lyn+*DbVO9*oKPz^jqNUDP;<-lc zu7hp)?R;WDBBQx29zmi`00Idd&Ll>)0tAYU7Bo+UoL|#j{C?kLJt04)>tuw|>Tbh(!kf15t_rQ>AiMT4HdR>hNJ=?dyw(~6IRn1BPbJJ^2;C%sph(?Be1 zE7R=i_?@@!yw6>{_S9 zxksC{T2#wiFpN?8YkfU^y6<`uOi-s6y!qx=;#o_Q;}cH{qcbz^k5U!(v1;=li@`t9v@)xU4UKX3T^h)@4z5cHqdw|f4+Om_eC zZ*S;4`oDkapFHWOumAhy|M=DRGW2^l*lVphd7>Pw4$~_u*3*DgRj-OV%=Nlpp5xIX zjKdX1qUu2mB%mIo%eJt85c0=H?vGG-I>`E%Y>B5!+*GNeA znB9qQ6wX1&0`})TNV-A&kv2tzR?1(h-IJzF?zkU4+#0-o{1?C-Hrqe%jb_LblEWyi zWuP1n4qQd<$i&gJukaI;g0_<%?ZL9@v~|KI$Hm4r2gJF;RH$p|vU?ZSXU_Fx@5rUvJ|%#{$4_5w z*Yy0IG^tg-ZIvbro%3O|(v&2sk4EUD!Fn%stbh{{T)54bvWC7gMs$z6bAF>he}81F zu4&^cVU#fFsQKIn6E57rBQn%J3xeJ|5Xy6}5@`C_GPgQVwR}B>#|qQ@`-bPi{yvB8 zr%|);YqTIS5fYb@Xk2JwU}(x}Y-9jf_*3LY=+I|!M21o?ekWA!@2fG0iJ)eB?In8l z$`vbnmk60f!epsYGpp)>yIp(BBSloXH5}B{=?-IWX+<_>jBIy?2SPG`Yqrc3#_(Eo zrE0PPb8=OC^fSH>bd)y~C*8N%qiImPe@JF9;3fJ>(h_}D+i_=2xzc{#U_%XbU`5ZD zxFA?ljyTSjYM%j3%S_?NOVv;`3wocr)ZA@!_GWfCi*6kpcz&!*Q_7)yMfCD1@3X&g zNVZ-fsH%*9B?ck5T*_`h=6SDjbkv<>R>V585ib?RHE1knYAA%fh(Y5?c3j&$fQPtw zo9m2R>kzD4d9)iJeHb zTJ9J$KLO*!(2OH26{GrMoAL@Fs`mEj^oKykadFaqsB{?BYf9;uI~02|nrgI61a1o6 z$^!v^Dt0$xPv{?}|D`#2`~oCz0PCy@EW!6Dq7fwig%vCDr6RAUtawAMjnaURFM_S8kO z#?_=s%?1OxwLU%Q4;HNxuU_L_*8%Ix8nPHIe7u;>HPsqt4b%tG*I$SDA7U)gshRbNf7WzIxF-whd-8|zj*EYSZYls^&C_J&jvVBaiyd{8L3+EL)Xhds0kqRPBV{E zfWAFn0FQ;!;3#+(32OQoX%*&81NP6k0<6m8+Dc9wF4JR#Eh& zf<+qxkeU(TDj&`opUaD~XyMK3%0H9? zOUjSD5m($1l(6}MN9A4|hXYUIF$`)?ruGb`zzX}YFtL*Q9r3gn=+Kz8v zMGmp5Z&D>5vulax`>?+g=Jy$mR%V!*Z2WR=oIoPNM`QpHL_s5aqfl?XHx5y}KXa5& z5~FnhutoP|uNlmf5xD*9zi#$q?`2?GgmgC-MScPqVo>R}eueR2Ic~1UusP#1bTFn& ze7WtqjH(B559urL|rTu}5whCPFB_`*t3Nu-N&exVFnW}XP1QAxfSwTxi17(MayIa$_!oWc|F21Au z!S6bC+Y~LYtvxlacvAX>*i^H2b9k=64)&FB|9}wHwtnL(A95juaw2BaU6acy%kZvF zk>f4xN;k>RZ;rF@3mafUd5k6PpFSBi01+SpY+yW^0f9e9UY-c}dxkYuvA2a~0?^rQ zweAk`p^gTvN8&O2ow&_AH*VZe+&dHaUa3gKVX2=C4)il+e6|b65Eg@Omh3F~P=s^; zT<9-QL}H-2Qma~GL+oxGJS2^8CrGnY11;fAVQ!Y~vWHUTq#C%55C9#{9cMWLf{#EV zJd&ts;|EAMyA43=k)xd-IzHr>+k+sY`751xO(i zE)W_5eg$(UkDk=gk59J#H57(}``}zsA&U!hntI2`)2#=i}&~7t9&EY&94|td}Yf}%d z+;l3MxK@^OKz61&&5+J&7wtiHTH>-D>?wpyyr9LG;mDMfms72pNA7xQGNN=IYCG=w z1@oyU+jO7S>oFZ&5W-nmJZDvNbVC4ddJei=Xi~Ui<40;9C)+#$)^WJv^xS;g_%vw7JidUeaMIv?i6 z9On=ee4|@0byHaQH8>#@juJt7wVg8Qlk!QAB?97;$8?5d1!#LGN9@!!@)>Pe$G zo$kR~#I6ZE2DppJ`q$SN2yi%MYGo#MScn+!vVs7^W?`EFOhN!Ko_rAiyu1UWIS}Wf zeNf^PwV&QBo^Ugft04pQT)wYM24m4Y#Ug+(K(2oG<`(TEcmVKwIIaqEeU-zC*SEyN z5M2N$XBc!z$jAT;a~z%{jvIdBcQE!L&Tj`Vd+y8IB@bO@TdK=je0P*OzG3wwd7vDLatd{h-qPy1 ziiH1CZ`dm7>D~0qQQ@zm;>n1~WSCnXK4~OvYM93whwhobjxBbnqP)7jM>~I&qns8x zcc_2}D%pO^b$jI=qRBO)#}(hZ_#82Z#$V>);TbM>@#QpXgG%%`;2vxBR6Wp`O_NQn zEfnp`G0^H}(F3&+5y^@`(?%RdVH zspcpl4U|zf{pQIMP83pR4>KzHu+E(hJx#K%D0v;cARr98PoD}&Z^MQ_3 zpzaif)Sm#*N{?FnsIMutX<9y0G{yW94qOU!I^A>y9c~zA_!1-qKu$o(6k;eH^K$Ae z>imD%qK-B;X?n-42#^UV;%58Gsz%p9sDD0a@N!=kPV`;EEd~bYs~=7z!GrB{DBSs8 zR7nqK7;5i;(AyA+DT#8D48I$YK3z2aym1x!aUBmOqO0?DwE-D}Oafm6)Ncfxlxc5< zOiz}wpP^6N()dx6!X1y!M^;gPY}x-(Av%ACwBf`_((%>t27>gc@KQ~-;zuL;TdZGg zHE42XDgF0lwXa~Amc6DzygjH_NkrS!F>du5`mX26Wm%FNw=SE zrWLute9tI8_;nk&ANZ|mGSQZeJHeL*U+IyMknCa)RW_)YlCKv zQG?T~7d%WizgeLV6x`hb!#cB#J%Msy(?vG{2aMAxDlANrU0yc9I~bLMFdu+2DPj{- zb=!DNg*KN6CNGHi2#Ij!*9`f3e?MGVP%;*Mn@pgHYy~QxAWWp?GJBJo%K~^%5y5N4 zWvN7a=Yo2R!{X3kTah_BZjgeRP3;Q;Xy`YvlG1>pbQ{X!hV&sgHuOg+wPz7HM-akR zsUr7(29Mhto^i_FL~+a+QLzwrrR@GJeZe zzi|5FoUC-@S-5UBoFNR4<>rmw_n@-m zP)>s$fA>HMf`9}ap^MEzVrpw|A-Y@LUI7=yu&jL<`ow@Y>MX?9yb)xP^?|*XmXz#B zHmM*aiw(WK_7S=C+-lcvb2TSklcA96$=1%()^!qzwtsWh+`_`f`U|99I&2Rfy`MJe zTSCq8jetFufa_`-!UI(Y3GJLCewSPso8LNQH3mu+pTKL=V55Tn8MS|s_oEi#8Ywhh z9P&K-YAc#cWj+%Vk)QPt9VbvanS8m$dF^%({_vU}h?h;De^G&Aq{oh9LFPULiP?W{ zNv&la?0T;zw~doivOPoBYjnN_K4IkFnNwl12m2O(32dsIeTN$s=-Fnh>*hKvZ6rpZ z_%NCb>k;?c2w-!)B|*9ncQ`;+k#%dLee)nOpp(381fF98@QMk~@6;5wY-XqA&C1`3 zrfayvp^(`H_buZgOqMdpgeEOzZ{BQAC)`5px8v_zZjKQx$x`0fjM8o(c|LGzvWSu@ zC&{4oe+$FIV3&{N(WiM#a_Cp(8f4$6jUID)Fnj&5Jav_9ttpJra2K^a5;)edgeSNQ zd+G+BOX$3^j+^zQzP3O}9w0SS(cPQ=bq@B96d1Y)aqGvI*Tj46$hC=+2seLd@ls7{hYx zr?UoGD;nJHJ$;Ugqkj}G$xx{D^wpTG9}n<8b#E==B=KG*fE#d_TaUv`h@px0#$$UlGc>dbN8_81W>EP5FLf3p4=M`o-u(=@g z6~qYy2Fc78rRdn7**wZPKIU( z6XYc@P`<~RU7%ql81bPXj~eE=eVa>>dLjzCyh%dfdjG!K7o-VAhB7H%g8Y1V zc-r11(+AL|UJ)dc%eSM6S3e(45F$IO5$BJr490HyG=Wv!!_)`;f9 zQsia+-@s1g%wFh*Y!wXhImF%DJ8>=D9?Qe>g(v3>Wi~{vAinyvV0qPQkR^=7`9y%q z5j}V^F>(gm^$*lUQKw{Ar0VZ=uaCF)dRLnl^k;YlhXZH2?DNC;mTN-AzS!`#=@t!c z1g!DA=*&?_Q*T4@aRwY@Oe!lpm7{<7>U+Ug52OK&7}?SU6sf@UpZiD4fljNhat>ep zQX3kYcGcT0fkq|pkx;5rh&bL))Up~zQ^zhgkZh1-yLA>;bT~8%3E$ibd7%6E%JxYB z!Mxkm<&}@#4prw2HR%GfXQeOAg1$_>(3}oBkh>TPdF;PU@Ste|fSxE4x)4Z&-?g+K zft8cJJgTnp%(>~39=Ik>`s`3+OFRcHZKtghRX?P^wpxoY3z7!Qh&#A6KFx@+B z*|EhTPL8b2ge$&ZxJ>EjV=1yp2PH7D&6y#hKoDAei6?9-zWetxJZo@<(m;w(>XeMkcV@;l;-;Dv z-@G>4R?!EzOX;pInSg-6wQCER>Rl0+Fw+370s_>Qh3(54Qnz(mo5Z9ajC^^aojjzR zxnGH-PO`|pu@@iQ{tFf!H2zPoDuR23F&7LaK#Y*3 zU?0X)z`8#}buV1e!w7K|@-c3=>?kd4Z7nH+EkCKh|LU?~&&-5P;6j-kdciLV;SV92%7YIGO(yRV(O*R>Q@b~AgZ1o01 zcn!vtirgAuAYpIuwVz<&)V_1~?%P-0c;##jb$1lFy}N73_wD*;N-Oi{^YTa9!2Suy z{JqLWfHx3yiPCA7SK1x}35?o3L$FbUK7lz>z<;a`C6#AINd3@g3F04JM*Grv7tUIr zLnJVUL4I2TKGrOylO=8%gTK;GUpeGf!zz86$IbH+tyuHY#HPRl`(H3z$vG>F_8i~r zRU%$Qt4v$rIOXZWkpeqH>P9VXwBExKvn1TrN!&f!)i`R_xaxw^bHObm;>Hu_NAY)Y zoJx60^6o+c0f9@;!vYp-c=*)ng8!GSOi1ltlivVEqMnjt;qJ8kae}jwUYf+}R z!wA_aLriZR^ueCc0E5Q+kI3it1K*!w)XO|BAcU$s(+z)1$bzi7XV&csvzFx-LGV|A zzlccU`D;gQeS-q%f#Wc*f-oN`^<`4cpIu~v2>(=41<`b|nRHGhMz0?vzy1p8*K|tV z!XC0e1i5X=HLwKMu{cyZz9PmYxW9u}e~OLGDO&`iYPbGyr2|t4k<+8d`NohZ&~L^M zYz#-)K^6-Da9Wi=#3PkrDN-6zz@^;x$SIj?z~1X=F-k0WdcXM@v=ktM;m{PbA^K6Sw4fvx#gslay8bF6B7L+lT{fZ6I%q8(kT#hzZ6_$E zfSX1v443rH@IwakVtNUcnNSqJTS?cD?rg)xZMT>hH&TkibMsh!4oL z39@c5Mcm}!Apifi6Nkwy9iGtkxURmQ_|;*N z(=-uBpXap(-6AvUc`a2-+uXf0xr;Y~QaV5DN<4kE^y!vStJ2-4c{A6=_-rv@Ouh!{ zzHbfs3KldLSj`+gJeynl0^)=W4I@&g#{)Iig{C;MJ02qIcn{&_w!IL@Y7N@rwFMj( zdOyFqRq3%S;f>L6M97qQ0}Xdsi1-{gJc5WIC^g`+2*yc9o-cFju0d?4&gN zaiqed$8Baqn{gj~eY<=uG$n)G+%cx}n{k!azk@Hc?Pwc$JuU|OgY?0eS=|0sXu)Ep zqS3_cY^GJ3XMTJ8X=I*3(M8TSi6!mnyk5KDjrH$zbE_Qc&QK7<6Wd^v;^TOd+E=BbTW_=Z|E*y-|(cvkdUi zUaPvDIpW)vtur#{XrO~@;MY(58X5FBRK&A0%9xH}U!r_}bBAfB|D-nB?P*{*W9Bu! zLX0`jym7mY|ABch8FgVe&T9*+vN~2bEG!(XlxJ?jg11No!$U@`SU}dZ-;bK+$CEu} z<2swwMXq{1fc!brC|Wqouwi;*_Br7#ZfA;>Z7HLWYnTc6Rw|y&8ULf^+*zO-47m4GYTZ%F!b4E2!9$3jX5{umx(@p{ODMo z52eUl*JoM`2E)`*__T(#>qlEUy?VfbyK4rXiH#m91n+W7RGK}_xF)8|iAQ=zuR2RL zKX?L7qzVYMCiF3p!0mc27q-2eZpG87x(Er)4-r_}h6lz?S>?zycS2^&QiwQY7-II&cXe_c3BTH|@$*x+L4 z#$`&8)$ErToEFCL1F=2`^Rq0f$SR!~q-4209$jb%lyamE=B_&2KB;TE)6~VC_ zzZ?JY64T8_N#2bryzl-ln{er2V z4`bZTl3lh$qD#hSXM}`=ddfR4a75*Nb1G#H4OW88%$*0B!Kj?|sp;0Sl+l{>R^t(5 zLzf)3Wk?`qbhiK761P*{m6#FNefzt=-q-q}gF~5AWl;U4B}qw1xaG{QkNzl&(DcSG zf9{oWolLT|u#{>Scl$|+@*_vRCd%4$*-FfA!8hK4F;l!cp6ar~0}s4u7&2hRW;nHx z_auJP&r+;Po9oW{d}JrL%gM=Y-T}9?^VxP%!d>c}KwkwDF4m$79Pr>t-k*c^!i7d# zJmErTa5YTRqP7h`diaOqEHV#YlXwaAl{4YWZYyUgJuER*QG~|=;i4{M{B|akcF1|p z{7lWht@AzKAZPDArOAWscpS#2J9<$hp@h{m!ws$(ze^fdW8I-PwHPOjo9pcbC3JU^ zi=xj^m7-^Fp7P@oGnKyIx5O4bd>NHDdVJZ0^GAh5l%|?LkesPNx;=W-W(H(Ya0<+k z%|@1lk|>nBx_w&x^p~ac^(YfPz37e4(_wd|o2Olsr&ss!YFGDBia3Ej zNz=NzItH$dYCV0c?3ayWGRO69+jDa$SPY``GBS+0Ejrb_h&N>%3`dK{S{>pCkurt7 z^Ex_Fle4oyV@Psa{BmS@g1n=$WD{s(Zwp=+7;KKy)?^I#6-H z?7u4BYwqSnf>T~Mln&Oyn)5K-95c=0xOD`;k8v1@^Ot|}i^v)l9HAi#1n%(Lmsk|k z2q!HZ9ZEAnZ<=5ae*d0#_m_2|Q~VzGU4?5lCf(Ot+_B^E&GiXAx}8;xN;6Y%JL>m*8ca8uSW^TG1NWz5Nd5} zeBnF3I@3Dt@z*c;$EzRc9ovP!{Er_LXJ4cL;|~ys2gFYj|N8!fzy3sYZszpgUib3B z|9`vxm+zfiTJfO#*VXpo!ApO8aw`d9qPlz^5|1Y1v-L?PM_sWD$Vm_U}giS6hfuAoq8udQdEysn(ms{UZXYM4S-Rv#Hy4}F88FVe8mM$H75k+%uiHUb^ z7u*V^lbqVqN=jKAM5zim;aO_jNiJSo6Wx^D}EYrPE7XB#>Q^%Yh?mJ_^C`uq1eO7O!qm$guC+pt|?oY>|( zew?~bSHRJ%4ePN6ZwqX3rbO6BWYJ^SFec6V$+oyq%`!a$4sjhF9g|93-@2q8GoG1c z)LyYsV8ZQ89n@f!W_q}W@SdL(y<*{zRe!mQE)*NYtaoY*x$W zG7$}N%Ru^dr8FvDqD1OgRc{u;V5-H9J=ztK6pJCpro-p20ur_x?mJQPn%>pL+BRCc z!r_;zR-)qJu{Q~6%<V*0+o<`iK%ZU!SkTU+xLocwevmYd<}IdRNEE(6YQO-^R>(5 zv-`~D!Wb{%;4yWU`0?n(BP zQ;!``o$oDU0MWpkQP2G3)#Xgxwsw)j{p>Vp%K4q%Hu|c?-?gu!`Q}MnTwF{*{L>UW zfF!ry{~@xw8?#Jp37SG3xPpq+>IAn2zq0pqViRJy4BklH%NNw#EEXu2l(?ORyvr?Hr|=TE{_pCxVe$s z5hyAWy@xj@e={*iZa3YU`pBC`e#h2e<4Nr3_~zn}2FlP2nk(NX z>;x*RY*@Y7l-yZ!72z$x7E})DY#mVt{jSQi8W;l=fJX}rTcXqU!cy=gWOHpIWwTZ_ z_){lODgz3joQzb4B-r6&pN$6XQ75#M_^!k1@~&9}YfrACB=x9s-RzdrG{ujo>GjZZ zMP6*ahqF=tuEJ6{izd${){XZcudrpMCmre7^p$x`&=w^;o;q7;&zJNg=vLeZhN8W45 zOl_(#wum*nibj0bYq7xDDhj*X;)D`leb4I79-2ud53rC2i`ZqhMkHxphK_PusWbh+ z-chI0Fs=Lu+8+SKsTF(FCJ?rymk$}!?b}KYbKOe0ls!Gw16_=A*F6g-rIxX)uM_;_ z;8|w%9VV^|WPz+XsV^{LTTC({w>#*Tm;*o(293c_fxLy5b0yuI-YN_pts5_b8YeU? zb-HrZ?6UN|SuXo>f9bzjR~L23bts4P^SR&@#>rDvO0QCmQ44%#)po_a?0kG~p~?m0 zh@)kf3NE%-r=7LE5OsN~bx&MZ*6G?cdFc1&&S{~LBy%c8+S9V@)x!k(isiCkS?Gsw362n(#!>*zM&B(1wR_VBzna?}CGukqBUpi_x*JIb9;I>KoS7Fn>Qim+;kY0iDD7nZT7mH_|sv!+o z54{?$u?jfM`GEr{6->`Q7y;CJTBYM`XjY*XiZU}0N!lLt^|}wplBs4^L|aEJMk*XR z-VBvlWglE{5+2&f7g3EHiMOPK*znhIplTFp+Q|v4kXL|bdDYV0|q8?32 z3H$N|1A9912pI`|MQd`Z#N7Iab zamigo|KsX1x$puUQ3n8wXyTT)GoTx^w4Q|Z<(P`8z* znqMlMz|L4Z8gg{231Yq}&Ta2v9~GzR`)FP>y{%}0t!V^}@KX1k;CTy)rQ&a3;d%^6 zZxB}4(+4x(otK%9zG`&lF8}$f1S~>&4YkB$)oNe$I%z8jb>hoFfn6XmDb4RM)MCN> zHGLhH?bL{u#|Xj3@Ucj=8AO|p-KDfhS0lwTa;)lJ#L%dhLd6~KX>?VaR4cSdPZOr# zm(VO*vM%2z;0_x+cY*f9S5z{S^3&Y-bYRY}ZMk4>;A;VF)k|t;cH@<2;tK1A zvStvdGd-*tQATHt652w>Wk%d;c7Mki%u9+lN-hp&^oh~F?0031>F%Yr7;<>FHd>zs zh?`matI)mo9EAr*-2i z#Sk@6;0sv-LnBgJ_HftEXP%fOK@ofKcmu!yvIyP`UD@#lGAC!9s-oNpBx?UUO*WOh zJS8_W3B<=^)1G+rH+bzY)!9jpG{jZWQi?dfjTXeGtSWrgEQ zIR+MYxAtb@hpmXOmG$bkT z;YK#tx>L=TeHe?ZL`$tZ6q0R{p01}6qG?n7h$fNGQ5=q!(}8|Fhac6ajS1h6%qYZ` zx~JQm8xqa9#2l$RRJz!0g;8Z-WYloqCGG9hovsS=Ufab{&GlzygYR%+JVb1y5`70g z>k@^FbPel{c1)RhAMEK+CLR>;{)j!_q~1p`VVjBlV#ujOABy(Z62P8Qi&-Yeh=h6 z=zVhPlV>`MtqimDyw_L_Lh;iR4DS4TIS|%{P&&oWUOas&HZQfJ9(PhWyJVh6qVOQY z>2O6T!g3V7ZCYt_bQtgqp`oPA+a@i8{u))5$uL#o1{+)c6JF9_uEm%r(eWoSy(|PI ztMO*;&`Nr5-cSaF7~Gz72H1Avv#4xUYqmbMudi*9w|5#a`T3Zs?r(SH*O$mwsW_na zJ5MvJ6u*D;h|PE^$A#Z!ECsnqk&7l>twS`>W616I9;og$zR9{Uydf-#sXH~Pgu&S6Z?6omDQ9ywXI{i%c z3ab{^0Zn^NI){96(`aChX7h4{pN8JbsA)FqU zkO$QV+xl^Ucbny7J>0nsD(@jOtv`!#*;^mJ46L1E87i^ZlMz>Nv|8q3VEUEwm`JR< zXzPJ^?|Lqr@Y&{3Vh*<$HELK7qzS9iZ+V&lFbLDFn{Bm-UuSkZX2c}#-ohmdW$2g> z4gS;tDQ7mPQ7d?iJPF?c5It_2&Wp#1iA`pH9mp80SF6VIZH>4X+Nyki-qyP8&^;d5 zrwr+7spZgT+Nr}Ns9wyvBR^0I*?t*u%-f{nAEJ$k$Gvzt!R=3d=naM_^FP2}7b8rX z-Hp$Ku+LV9Rni@$NojemHxf}c4s1;G-1=Fj@KhJ@+Bg~pwFjPii+wo*>khZspV8XS zCm&xoynTvMI#B;t(-sYEH6+df;n+fwt>;f(dsTdMbB3aJ5y*qPVR3 zh4(f#Hm8I} z2-~?y*~|efiPA9~H{?r~i-prY)yup4Rc%3Ev|-rLTL0=bc@;W)t|#kfSC=BJ((Y@#}<=NV0G=P^c&4v)kJ4%+H|YXpThz?dpqZPNVaA zVKr>kR&Ct+4QC{6SKhZ|+`B-hPV!zk)7D7zSkXX^FrL^9v}wUPTSWQQ!zwVhK>@N@ zvg5~0VfO^5d<4X?pkOhrfR&fC+2gdfkC4Yne!`^#_HJNs8qdK-x zM|dotpnysML5g(gs1!r*y-1N>q)Q1nHbg-rH0et3NbjH`ARwI(dPF)Q)PxdB_R90V z@80kD{MkSDkNxB0IA(@9NbcOZ?rW`Ut#h60T(4=jRAr9tP8i?RD~L{)(|)g?JD)dF z?l502D!u?I#Id7SG$CswRP4LVnjp2(6wVNbvn^Wge-bZu%$0wWsn8OMiz(6ycS$nk zouXz%&-%6mGqdH^BxDAlx;gktbE@1OV^m;Rdrk95bKk?k8z@N4$To|JXdYuDG&QTj zV0DH8OPO;M zmwU`Hhh5&y(bi@%tv=_XQtTef;&WBd3F(B$u8uJEzc}F z88HI~(HAkB88p;wHpUXD#^2)umAx<)(%BT6J`bJ*h7LxlVcC_S9&HY_#DS&i)91z! zRiy=aST%(TizyotVO$kNE|k6Nfuev*JNNL4RcnyN(H-%2k^L6@V9vtJGZYob%;Sm8 zLi=@B7o4yRhP4$1N$tyLK8tzb2kMFpd!Rew*Q1)~nVWi4L#Jj1rnOs(5YdbU_Z?<< zRuI_+L9|)m!V4YOxh@ZeC&7_yR91hj3JWi46!?&+gpdiQKyac1!l1Jck?%Wq{JHdSuBTU2sH2A{<-3LX<3W zyb-Ad$wcUqEVaW1u;N5H8OD7(5rzU5!X4cr7oK23@Ru)hLe@ie)I$>N5}fw2tQ5iJ zW42u=pX9j2vkbnSe{Nn8+dE$#u*qO$NOI8C$+bQi27Tg=Sm%Lv>g17Q)wLtB^G-od zewg4pcUm!7xCd$Bd4$si1G76ZfGS|Km8pikk|TKPlz1Vv$WtG)Yb+;WMPH^)qCNKJ)Tg9hEn%1Ag?!`n3XSqUe3)Vsom39nV6ZW$O0=A(}ai&MNdzQ@{CzcktOtvE=F3a%LlNzz1 zhrYuNm;Y>)53$j@-{C<91iT?pz!Xgqy;Y6tWRjqW#8B#f`cIkZlng#Rwmt`tNq-q^ zCX_hQsul-B&;C14q@(v9{&Ss4=tCt;3n{+qOD(&&*6;rfA<~6M+piojbu!(;ocp}4 zWRJYHt=4_N+y_skC(Y@3g`WmcgKs{L@bV5j9K<90E1mkJ#Y56d>>z52N!B-1||P$a%a;#1h7-*GaZbKJ)X06?)BX1%#T zblbwp{}$CAAh>P8gPx&L9nlBbH_C+jlsApQpQ$3;@muS|(E&M&`=)Nm^F{d1TjKQ@ z)uoNd5+{Cs{+9b`P$cDuSL1LT%x9GTA&&0!)28?=N|zyksGR2ZYpr#09{a)rv$J0b z_>X4o{J~hYdyY+*gCAwQGPHdU!aUNV)P1-Vk{}%cXwjvht(DQHWhoW*Nb(k8@{uXh zXeYS*ZYxb>zZ#Rl{WT&2OU(cS&8p-! zf=sf{To%PcXs$-E>SmU)y5R9#uO!LmVpnH>`?(6sdxmpU%;Ol5d zA;-;t{hDo`ogF3(6O&)Nub3pZsGrv2MwEFxw5?j_#=6k$y`c3Ta+TC!kDvjVzO|&# z&SAaFd``{wEWNiOwR#v+5QId#jK7YCv!|2d_7Q^Uh+IEBkQ>%eyxVROG{>$0H-JB| z-+A}=qo6Y1hKyYOQt50aanEV#*yB}=ce~BsA?V!Pxis`wx(`d%nG~p-IBUCCo|(lq zHzLvEb!)FpIZ{=-nOVNW!+_m4|MN>z4w*Zla_^zgl8@RgCVRh%i-$qq!cPSr0C6#o zup~YN2iU{TZ78|oayIWCsxqHf^q|?dqjUzA1*@+8k{5QI)xiMZgBA+>rT;p#ZuZeQ z0Ibw#a-Y~?x&P^BtWNj9`$x6MWO(~<{#zV7%t$1mny>oc$8`RY6ZzQpz#FK2pq}s? z_1s4WUj<%L<={)$G8uk!1LP?cBh0i)BDEwH%91y~`LRV4P+PMZF>qZ)Slo}5N z^i>mt^mKH}Ag|7u;y6H(c6V6*x+UHEIozM&PJ>8yxs%IL{P0^xKjtHlW{g#Pv|%d~ z<3;_A&bNd;@?CWINxsv!zB85t(H^lWE0)US>Hm0ysMbn@PKTC6#PFPRvBC5T%Lj<} z904~osyt9nqlk;yYX*yJ`%~>_&9*}S?fW07Cl}v&G_EkkNA)rGEmZ!1dk=Iv8)cx!{8p9I6i}M0Q2roMhy8 zs6$X;%sh-oXV^p7*`ZGs086q5k)e=wPGtB6?hi#-YC;E6ZtDY{H;Z^O2m70>S*G!K z15L98$VS}gHiRKJdz{LkPe)Xn_N;Lw9ZFD7tiJTN`BR<8?*(@Yjq24(ZMyZJkxA#m zmZQ@@f4+K#QBn(yDywm>jp>$71F+Z*loLZLyrM$*IbkGAi_VGWH)3i@u!@ZvwXO|L zqIY;wP%SP4+INqTw+5aZNNMZFOb_H5s>;8iS6kn$jMhZE;2NCwoD+V@qoK=UWU`_& zUb?_Fvs()u^Cp=f+BeyqAUJNoQ7!x9b6RU?V_vJw{3#aL97g>RVACjjMOvE+B zp|4LovG4}$G6x7QVv0-(gz+LHVXKBE-{KFG$~OsDmL)uF_-d^jtVCMv$DZ^38$Lp9 zC&x>Ue>a$2+?v>L+KSwL?@iBhpenOZ%u9A0{=v)U4}|}67gC>fMU=~U4I7fnphw#A z=b*C$u_ekAKEbzs0$i*4Ls=_f7|}7dnYpebmnSEK@O`unjvOen_Zc(SYiRUysZg-_*YbHCF?ew z-aeV6Q{iNv1neA0u8~6MjTPzJr5AgfAHNs#U5^3_=A;Jifh`y6u{&vU zX*1MNSUvc!M?(g1Zh4VCzg5W<$@CLBsc1v-3QvL_o6(8S_1XYq?a?0Jvz1Ujl(6x! zLM`*In)BS^zSxuCSO^^R{teWbR6WuJLE;ER{r1x-25D$yO13nXy=&u<*bvtJzV8z- zMof0Pbles&W=9b-yA0ZB)4-d9BX4H_nlUqbn-zNeN$B%Hp}C&$P27^A|0NI>MpA)D zwH2>egfqo43!dGWOA^2>!jAwx-51^8MWx4@1x#45XtD~qZ?(V z0g8-RCr=~Y#@`=pbNC+!Z?Q=;MO6p-5rv=4BrdckjY{M5hMi*CtV{4))RIpNYBQ(h zE#)pC;yu7jvIoeEeN@z@^x+%fkIKLnqT8 zEK;U}WEXHBw)PADaESSBU3NN3U>i7?sUUw)<^TYdwYQ`!_g+$t#5r~^CEmP^CYOa0 zx)HoB(|~Y5Hp-k-{Z8Z96`Cl-8Rh|fI<6>ncNuC70Fz&dzdBr%&=oGYk0J#H!yo(C z6U_j=bPEd-$X0*d_Q}r^pXhYlz}Vz1VrRO%Xk~185aYLVM@ld3varsS!kNhNAkRII zI}HK81hdB2ZsE4LTlTL3ZkPe8&9mdg3ge3XBGVRJiux78t<0uOlVJfyX{Qe_!>?pP z)GK~IU@+q-nlt2WNHoItVaY_SQR~O|zpNfPQ`DHU{y?pKGI;iyM{8CkxyBb?@wG@H z!}vpy^%?LVwFwGulRp5ux!B5LBfh7(Q?#}r@c{~nm;QbZ*~UoS!&)ll;otQ~G@rf# zoK9+PGNA9H?)`kQ+z}h5S>coQMFzGz0{^EWSP<*qcSag1AJh)~m7;Iz>WqsEL)3dx zRCZT_625*_wi&Ki*7l5wP{F=_K%DLE5UI&1=q|+yb2Yp(`S-)N>HsF38 z=6YMqYf&Y4v(|=i9L`R5uqH;y?4sV=Za~|S`9YC)95jgC-JaH@7MpT)+>RYRnoH$K z_C}r&dL+x|wJ>5_I>+7P(JfM%ATGcOV!r5fG6~OKt+r40DhGVT%Ct?~9dEMN2+=k* zp=N?gC)BaH;6Pg(%*inl&btYdenU1Zp=KMnJI=T*;_@}t`^<&Hz?B@pkd)4I7_!LP zbdm2ABs;oXbb6n-F~>)(@m`79AjXxV(>X2=#%5(@QNc8r2HN-WUa)SRfhMNFxWlF9 z{j`bFzm^Ot-%fo{rKP16b{NnAU1FEezr1}${oM#-j#N?@6soC-ZI@|~gwu`Ckm|_# zpBVj7`^m5AELX7wl>R^0N#Ng(lM3#PgEtt2tx1~SDW3g7Hqt%kNgVl+v=s>yo?Os* z$~7x^&HLhoJzmf8$u<;$9Ck`l2nr*po{Y%rMP{Y7AC)dmR*LP+g?RHvwku7D6cjd$uQ8Dp365x!eL{pLwX-g}y{3 zK&D23YzdQB0Q9u!IUiXFKJ^~#4ct4l+?W>;f$nRxVER7qw6*-=G+p0jqjwveHN0kZ z=`gq_*Sm9(%d{q{$u@!5Aai2%r(3zSTe)gmlF0i~+j|H@d^XURZgMY`fZ#(mbz1-_ znOf3^F}2jKm~*ffTXI7`pq85Fe1)8p5U)vXWIU96ff3mX+MQ1e&^! zHq)f?bMz>`RmW3vzE*r~7DNPdgF$<2r4qaFKG5vBi%DEx;Fn27gWbmOu$n-E8yoo8-Uj{O=c%c>uK$9;bowtv_AgK;P7;YmeR zBGo06Z>&mlwn;rpCv8;cd2Q@32CKUcm)c?}69Kxo&i8p|5=0#5-yO7+Ko3ssRdXoc zQ0WH%Kc+ot`rD{%TNG>`6C2q&Lf8nzeEhifjE$K`R}0XEa&UU!-1M5E!aqJzu9Jf< zs;jH(BT5Oz!$T61mY#A&=%Vqe9L%b`cXx|n@kxS4`AR69;K zQuK}gb?>z*GdnQrVP>!k*ScS*i`=-D_X@G&kJSK2M|L7x-N!(4o>uC644j9d_5$eG)i6fAtG z1duo(i?RC;yAlIs3aM3;3)eIf2mTCw-T|is-TCur`G%!jl6zftm~1=8cVpE@McXQl zzbb^yrRM7MY1I6yyV$8$DoXA+e+Me$4Z-{ZB58|tCZP8CcY|Mk+TO^P{jx{pTy(w{!@BGcS8VbiMvULz7m`}Pzdkn$MiJVGLNkQL z$sAk}OZmzECCPcEx!j{Dn%mF>#2oqoP^L1aX^x;o_p3XrXpCgA*V|-qaAGOEBPc@w zFbEeOdSU>2j_p2wm|T~+^dTaReZF-^@SN0xMA)7ul5o8eu0FRI|Jd83nSbVjLLil6 zcq%V%{k*qD()&=%p>*r7<>=TLp^{jt)3ZnM^k?HcU;ju&+SInd{T!mtH< z<*CB26L@0Gg#Q-Ll>hwt!6>!l1}jg!oVc*kpoFnV=MMN>4fl;%Rcb0jMblH88;8TJ z>wyhUt?gPnYs8T;N7H)QfoKcde^Hm)hsVrg`ONtllhA&v#}95g^?w3t`+y7M7nt!C zYrU_!YcrBAXGn~Uq^H)4B?|{R3M;6!8IPUUB!+6aHOrA=t4gS2SyzsS%j|O@$$pFJ zI-PGVA)z2wo-EnX%Y9HOSwHgT$p8>!sSX?j!xo{fpmTrHHjPzOSWxBg=cXrtWfJp> zyRP6X=V1~h)FlqY{dvDV2E7&hB7}1AEp@3CUe!3eG7PSUF0aizkXp6C=jGsX-O^ri znT^H2kbpC!hBTiAhdGc9`sdCo;v=>>f2P3-ExanG1~X7eRClGK2Q6AY8H$%fOCdWe zaGPq30u)l$6p}WPnCkx6`A}juE!KHk8%+{q`(Yry)8QIwc-@(ru9aAfkeA$nLbJ@` zJ@_1HZr?v!kaLPyjyl-$c_^-OW74e-xUkTFqJze_evUg>dXC>t0fL34!KzSsQV0^!M3W@(Bu%Uw9`V<8Rf3mU zff1cEc(iNR=EAUji;2ksB#Hlq(ie$pCxY?m(*SZpB9}oex)-~LMf}V&t&J*GkN~Kh zwBF>N59&Cnc&zLE`pnId>Rs1Ph%68}clP~Sgk3xuQygJ<3^tp8(D9>Y+HsoE3a2At zxq4oSZWI^Laf<>}1U@XQ<3Z^6%ltLW4?8nc#z&ReX&oP}Bpo*EI<_aC)Qhzi;Ow$Q zou`dN#z{&=vHH`S*1BnbnQPL`*I=Hx-};X^B;&V z?zBfgf>{k;w|$^dD{Xw}vg|W*3oRU^sRJI zZvCNuE?2)Yh6ujlsOdEtA_q1r%A{2^J) ze*gZ`ez{d8;Kf4wqlWEEGY>^ySAf$aJ1>NbdoMj_94Lyl6w8Qe+!_#wQ;C<@y-b)W z)faZu(~sdsVl6;1W8l+d%5eQ4IBgQXUrMvxXVjO9?@g8aksPSZ?44cXtkaF)8BA+7 z2f^PLv3XDDK0H&^&Hy%-R7p z7Pj46)CYhZToJZ-S7a^4e(%HKU%D7bfMM1ccKjm)W7vq*}0EX$O(%<2LfzSDZrsIDPVDbdjqVvhQI3K;g*O`G|Wv_9!|0;9F<81-4u{# z#Z4j6C2qEss_aYGcFwCMIYcrOMlLBYA#DH_)su_Xx>@d_CQ$BFHo6zVBK}~rS|QyQv{pCU5UfWC_k_MLen5T z{NZ4%MAfx^Cmylz`R{u*msmasxctcS{&ExIPHJPEY29OFrKJ_!1Df@1wZ0iB zSMVVjq5M^gle%o&V-GB_$R9$1m9OdATThTP31amSzsD3A@F2<78s@P!}qiYF6ye!zzhYdB2^(U*+D@TF+Eyb$YPC zgx?F*0}WIVgAan39wAVO8g(8e2CO~P3s&dV0c8zb)qhg zeRLwvan8(9qcIr(?i-N8Hu9Ml0EfYm`}8Ssm(X=rtjNw;wZn)1MyKoXB#0$0mq5c2 zwd6^qj{p2w8uACq5t}=?s!$uSBS3YAMil=y`o@4T~J0`a@3KL19{1*3& z9B#KC7^iM0<)6IBYbLAY8^2Pkq?LKNhIQmu+M}#mHsKSUuTds;VU?d${+zO zdE(7YQb?_{Qenjx#E*(=NLFbk>)8Ekx3?1~2xIrCwDwzeRf7k`h_<&HfDoHXIW==jhYUs3PAL#G|cC=@l}g>=`TL3~>Sv z-ES*9I3P%Wp+V zo-q)6tsf^!v3=ORT%bQ%DQH%U>lTJ`qrh>_0D({H=s1FNt61K7?A=-JI5s4`a$-V8 zl%;C|9n<-|Jgk)`DPDLjDk}>qR^r=sZ%|H`x#W9#t>A9v+XcP+;T&df$DlfSdP6}g z;JicoW5H-;=j$r^f`sDbAiLihQGVWu#B^v^d)Vk^swA(kwkQ2WmWNocm_e8Z+z?P0A;EHIGA)fH6Te)H=WH`*j+5n4n3@$K5emNx35QXDZN(}NTmB-hOrY9$_ zsfVkSJf6@S{9y(@IOle$p&R`hZa24*&UR`=oz{5caL2;e-y71lVuY75^hX?Dt9LjG zAlYeY9c7EMvIL+a|13aCpslIN`rDY_ub9&esDfjq2Kfumq$H&f9*I$H_t?W# z1mave`uh>3!|At6n;8cji;wRZH9h4KKq{>A760C^_5IziDN|K;dHeXp{KKH=CXx86d&n_Nw&MQ!t!7SMX@6IfMBy7l@#9$1e=b_EyntaT z(TJPg_wl#ZAMJ?9tYAq*n>9K(Sa=&tKkeu)oK%DWK71+L3`XllMe`=*Hd4!E?{v&< zM~$MhKOND_H0$LZtN+pB_pgv=o;+(O{R$2@qUG6X@#4&D`1nw##^uJw4h9spzxQzM z;8VkCh7IRc`1xfz;_4Hu<>}2ZT1q+Xrs`#T`uPM6cg^qibRYlv=k*Vb@%h}f z?B^31WS!Cd?N5is9RELVQ;h4g%A$Y6cEA@&YGhaJ`0ewaoCxN;qp_6q&OkZ!p*>sY zAE<)Eb?n2jy+*55w}&kQqc>UpcfS?&-S>msD(21JOy4NP)(oL-?ljt;n+FR?dk38h z-1Lr*i;zA~gQh4Jrdx#?<^p@aE!0(3r7NEti+MhsUMxTGJ z*45zD%1~aZSMYQFTjSpS(XD&m-?JsuBrLrgYs6~_l$Mru|L95$y8|Gf0*H+&!wo$LHwI#bgGST*YTOgdaEB@kzV&;wWTWbh& zWDRqGe&w>{eYab`T|(AxCK978h7wSI&CrXju{OVX4#n1H{g-gSvim3Im-6?~CAMoi zgFl$p*F7Wi-gvzJ1G;km@pHvc&N}KY^YewxdX4dh%Tfk~wY7Pt=138Vi5HS4@aa)B ziwUW6=B#a7y^VJ&mv3%+zXG9C-5V+4byDM6^k@EYF=&IO89(iteOljz^SXc%)oF{? zRvsv?s~VQLmIRN2`)fHNCWfSKx=t4$A&1tvEra|Ihx1s#zdBFDj0M@(IeN|S68*y% z4@Utuf2WCQ4ziLOWS{~_0c4HWTmzzwBO$g<^8W9}B-=7gm|;)JPe!MY`m9{uspv&E zw6XMw4u>?feEI_Fh1XU6E-`Z=+hc}VhgoQT`v#K85}UVbMARkbob3CNL_36e*7V#C zJ72G;&G!fWY3d&C0-Q^lseEZWzi+d&4bN@_^3L@5Gne}r9_b^Ed9+I9dak&cl&vx(tB@*tNLUEKRS9IKTVu3 zwbs&!O3%K4V*l-utJ80^Ji7{11mtO#6S&)0da(=wO!+W=d1qRraxsmT8$zwuvh+q4omh`nCeM&@QcIfzvAD^VaaNzEGXOX7pt zV?~Qb%6H|QjVjB0?yDz8a;V!kx9g%2=H}-0FqYo??Vtbr=&Pjn)_y|oT!|FwswSeP z%Uny&p{%4^H2eKs$ErTIX=g3~znuKZ@Vsz9!5uWtI88yAN%HZ1V3qZMzH?8vQq4K~ zhNdK4TBpHvR#r@bKObSZRvj%ghc*1q4bGRt)QHiR3Y)5Jt<5W|5owHK?kcY* zMhlE>bwRZ0eBk^1oc>H@w1~@CI>A^p7Y3=h#em9e&qz7thU9e8W4jVBAEp?eJbw$9Sx2GH&;WEvQ%B0*jlpZe4x)Jlu zq`_T&W0vPu=FO-eakV}?R24fno9q3z`sGtsGL&NnDoi<8KkB0y2ZD5;oj`rOb}v{N zE$*}Ufn9YX5$Q5R0I$qp*XH zpg#)NuNDF~!Raq(Weik%oH(=X{waosVjN7vGWhjaP&Q1xwplT(b}wgF zi?>vfnVC~e{jHP#Gb>Hxym9t}J18;|e|sZKEx|>^***@Z6ES&GMK6MQ0EzE|;nKelzc-Ly4OFw3jL1yqbrO*0W2AdXh3p?&KkqW7 zvSH?8`E>sX$Q|gf38FOcqt^Cv9>+>~&VK^6UPqM^1Nk3;m=(u!o{lafNy29VgpX?6 zrd}%T?B;1@yasB7ej@3`OX-1JjAQ5mFdB0mFkChrAp2!{=Z8_|akZ>iM(u9m z_g=hd@eDcF+==#ytZ}8dH#0(e;UE}_cTn6 z+(@oOnOcGBs`j=vB?atM5!qrvlk%@3LgyX;J`Y!js_unMQQHkXxcsESYauq!{&Rd-ZJTZKJ?3 z6JT>-r#bt}yzt&u2T^V32Ug3E+oWK#RxXOeqvMzIXc1!V6&2fsVI>6mt>(};8ON3% zDZrqXKlcwM5741_Ip?%;sIPrN&~{+@SvWU)s#0H0e->t&u;sOGy~lcdRC%SF+=2u| zbgET7TNhv9w|(o!V)x@(H`dYxFN)Kxga-GSTtjqGWo4y+ zpFbbe@49G%eKozG!{hT}SVZ;LESp1pMP0@;rYdn*@C#1N_XhI~2lmoza!n;ZJ2j-3 zBZVDDZ;0-+S|t((UQOP^wVCe`_ke($%8!ELA(IrnoeK1QPdM#} z;sQ*y+BcnFoSLCtrnEaUU5`Z+%B)S8YV8wwmA_>98c*n{ zPQvbNT>KSUQv0x@qUyB=J($RnS7C*#Fns$TL}}NEFuw{ z*RS8r(<|Vg-6fNA9irzD85GoSsmaf569SX0(NF~{c-Zqz_$Z<(VCk#_)187R@izV4 zQoEtUo^saDRi)>eFXH1>iwtY^2&1UfdN9F*{oR&5p9vRkeeC=_j`|hjf3Ei-#pr7a zL@Bpl)+I5Gu!*_k(E<|_W;Xp@yu3NMzeKt1%@6U9ow_oO-vmnflO#%$+csqKoiDV%*f>$A}a=ZQL9I7}+JDpp@T z%A26vUilH%nHfu|*E)PyIBdZ@aEIs17WPy&Clt)BY6BAl^@C}cM9hM=k}7AWr>#}8 zJaI;r_}{Gd(7WVj8RFvkbj#*-oBkBiLKZ$;VJ<8*bf6L!hIK3w)g#pK<*k=?=TV;A zL8rsm#%4o(ya++a_23WHWC2wve-hH0dwF@;rXT2*{b2B3q{VXUq7F2ax#LtR5K}R3 zV*cbYZ@9}O?%fOe?&ks;gM(`s>vwAS>)mG@O0njyL!X_*Gj>I0OD&D-9_R3yHst?o zRk-#Ww(-sv>(@^s)}FN@|Q*Ziy`DFK+<8|omLRXyN%nndRPJ=m)pg}|2l%alM4U~YDn7<$V}DP{ft33Y z2A-z!gWgr0L+{=_)#Te|E-rCDV!ER^C-0zP#ut$wnub}Qnsqa)eKdJDb@UptOHFMy zWoHPVrWmGClsw*9A$aveCi}rHHSk{|#)BAPm%75jLchGV1h-kyfP#kRZCF8&p3M|% z?9>~tndMKCMkz!@M9|Cp<|3}9JvwzdT!_ufB9hauH~U5;^ecR2W%XR{<3VbPH3sCI zx8VBo^yz*~9?aSrKUGKUcWzQ(?^qk)mj&2xm?~=NrywDKlo063k3@bfDG!PK{=bFm; zxy^4sL~2d$4M(>%>#C`#xqH9u3R6*gn@$i^?msLlDoPb!gR-y6;4av0WK>za4lgfn zdxB_q=b$a}?G-U}os)*fJ0MkkfPVV~wjHHDMV7#K>0arcxR$!#j*vsW0@kT~+{PuI z)#M=lTU~pgYXKWZl<+UAn$-XLk!_iQ6ZhwB7~g%_HW^OMmQb>|VUyf%S@mZ>1o`Wu znRVSMa15@Hh5Q}Ex33Ipo5fZ-|LbbhUl}6v>W@5`GN^ZmyLU*BP0L1@v##)Gy;=js(tS`DH7agQrcaR>a|U4U=baDzlW#EByM!`#x9}Nr$pzM}uMQphR0O4Z`-7*=RQ`vRDE7Gzw|0LH(xRfmaT(Ff%TULccIh2> zdzLL664xw3%>tQp6{%HdA|~wn%b>cdYDi1~4{byGX)U3Vt~4yVd3y3d)P9#>%k1E@Lw#RU?ql6I^$Q(_*LB4Mrr*=Bh{25761U!?QNps~ z?i)6rK!kVnMk@#yvAMeP`3FaTeE#xfuH#m>7s2lx%%#cV>Xu5IWob|sIDg1mBM-Zm zMs3Aijj*bDw1%dt_piKLvIOoX*{#J1s50iK>3MsBRYmMOT|P6pHqDOs!~R-YIran% z^T&FBT00;?g9_qXck-;pLf^qA%}pen!}JH`IwxqE2SH^4KtoRTWfSzzzWV1k4?tWQ6Pb%W5a^p1>f-^545nUV6VXDH;$ zOp=~*9Tc++F^{>Nc8~5GK81;!G-npZBGUe5Tq7Bb*ZWi7tR3uKp!@Nzn1Apw#4yal zEVr17ncrOPm6e*&zdnu|i--~M_wN{PHvF5C+|!xx1(NPMfR2VIEDpDM6K185S{2;P z?rz>Ok&%%R;qMabjw%pUpZ@%5ERG`QL!Y*-?%%sc&-}PFQ{Tg!ooh&V|I>oI&(FMg zF4+TBKQ?4CGqX*&mdPqsi~6|HQ4;!U)Yb`J-c9@m5dJN!ZshB!-so-BN*eJO_M84! zZF6M&(`T;GeGkI05^ee+-(NlK94?)sV`StC3X<^;eyZ~?M#kKC?@mzTopn2XAW#5^ zq+6KS06~U2m*RVOnf<*y>e`{FXJ&Hz_!=L~y-HTux_8%ecasT;u8fT>dD!7lx4Fx5 zI!qID3Q&*3`~Ggp$m?C5k8}VX(Kj%7FJRl1IH^F>_I=dlriFzC<9_F3s~YG$XDE4V zm|4~cHm2iSd}R^NM5umINWHJkOl0X@Ya((VeJo z$!Fyi6zqF?B0ymz3VQOQZ3n6}?@1^|i`z-CE%nXZJVkptHeB8N_&hT6)vG^E{e?yf z^78TwQ|Awk1ebY_D_Hpvv#%|Tg^rl+WBM^|}+#{Ig!`YeVwuf zV56NvZEK*TnmB3=O%fWI*-NT0U{$85ZB^km_ z+m}Ez<*Px3%lM%@OVyhf`ONx4QvxFpJG;9J^*)TlVyOcj(A4X-G&XvFHagw4k)beN zIGGB!kea^Px9k;LH7H?TV!)kp0U`idz~XpmDPU0tCO`nAc7K*TjccNb-DFj9&+Tlg zsEdQ!a8o{|vv>QXHXD*f*x%e#yt3Rw4!JQp=Bp5FmY~-e&6h$zpV2PO4`K4zpiRiW zA8}XYjfAjDvbc7??T;8lz1E8Snah2+!nH(c4?WNjfX;g8W<7F($Zxj0AAXFyrkPI| ztw`mMKMLi5g~$q1ueH91JKNUSaP3w$@@<;Pwsbvb@r9nrG<13css>-sQj{fM)#eVb zVr|n$zx-Rpdmh>kS}VZQDm&wbzkY9*-G-bZsq@nx+v?ix*) zF<7M&i6w*_)L#a9z%d1hhff&CKxH;19$vgmE^CG-7T3yMs)9~;QOxiF~Ahw1fS5sIm; zO>i0eOE1!<03L3oT`t@@!hb)<^u%zfPh+pGLGjmq#;x)1a;|p3e7nC=hr4_28Z81@ z8Wf+em62RxZ-R_K5A~N0wcaHd3G3Ya;D^RRTa=7~AurOLh;nzmp|0+nHE_FiqK+Zo z?R=&kEOa|sj2d*9v7oja+-Hf=2rvAEepYv)Zd~61*>@I^C&QOk1@N@=il_n5#06%( zmbY`_g9hZ-Bir)diadT`z7x%D5q>N3At^qn%xe@Rb)Zcx%(03^1f>p+tRDb&su>;_ zmFcY1j~YN|!g%XZ)q!DSn}Onrndy}SasU;0tidQc^i4Zse6Nv5uz-lt(bIQz&Lc0J zJ^K;FSnQi#@}SduS%b5Ih~xd1iv&=GSqgOJsa(8iBnP;Y77Pw3d)NVTkEP~lof2y| z(lTb)%;FDDy;M1Vuf^36cFA^O5P;#RAN*j3c2!f!6Zrxzw#>g<8WdPW&HMXj+S4DK zwh`0=wr{DhD!j#nL}rEgx(WxHx&p_RO_6LJnf8jaUf=)YLsM5W8BNNRm;lEu}aT8D}b zD9MkuU&<*lNo*F4NZ0&}&KQQ05#<}rxXc^!8SB^L)8}gyxX0rX2T<`BU=*>)!ScZ5 zc_1hc{{j+Qj9v$Qr_jdS{2M_Tl|9YK!0ndYZf`^*rTBCHr1WlVwY!IpHuz@th5d>> zHD+^jOZ->^DptgGm=~FA%<oJ=)5h|w0YxC0@xn;;uCZmGgY-P^S^QlSZaaCGN%W|<0kkZB==F|S*Z za2M*Knu&Sfe$%z{sGvmYj_ukz`?0#UdS~*m47+1%$OQVeWC?-S5dG#TS4z8e5kPXF z@6)w?-FyShsWG$ic0n!xtfaoGluRe~Yi$^O+8hfFB@h=%6-KZ7Z#s$8KMsW9?ySAK zuX&I7Z7vqAw7h*Zbhh59Io`R_3kB}S_pc!(ob-4(>$IO%S@ zml>C=*qtv93KPh9T%4+a8iMi;^unVdyLh1}H@}%wTjMcT=to?nrZ;f~R>b#iHQ?iz zM#{bCYuZ15VGT{U;S}eOMBvgx0Be2ncN45Qa&df483l@WAPnx%`dte$1eY7JHQ*c~;rBt?z5Vb!>9Z^r~uJU+$;4Iz*# zs^Au2vRLSb?r=#)ff7+wEyxn;xPDtZeM{^tNNU9VLi+IsZo||Qw5#ju10VQg)CW}` zSJ;3*aNjkKxzJ2XLc+8DP|h>rvK)*D`r;(sAaO(;?o2PmQ$T!u zG>}|;oOa2vZlVI^Q(ax1)X)txH<=A-%35!zs#W0FM4V=&mY2l*`9Nz&41wtuB zoF@1TOB!`Vx-oWhaiZW^vvod`g!kp$QmR>)sjC(kqtY$q-`q!2#c#n#(ii5kVqkpK zrEvaim=M6&u=yHcPYxZnxp?wdBxCDNl)VfCo*GQ54#r(sD9A@T^YV82H7u64c>cY& zqeb|tqqQ@;%3s@5fh-+#AnFO$Pr&%7siH?8pXO>b5P+9s3V{MgRC;_&AD zgr=EU@+q2z4E0fO48V`SP_Ap1@-s6t_A2`MtDd>72_}Hx@++)^YH}gS{EvvGa&*5u zV>~e1&)ZU6KhfcZX>h(dMdEANQyTSI(%N!i8mKo8_Uttr%vI%>xuOZIIrdk2 z3|QD=Pfk|)JXtnN@uXPo){_2;wE5y>nqs3=NdCCD;tk^~s*u=XRyLShh_vT}%B+Mo z&z@WV%-yyHkxQOx-mG`%pPT4`Kz`1edPZ#u+>%S^cF?rl2WpGZ3EI2b!g|Klo;$DU zc?@0lE=u%1fZV%f?|sC9Wsh0-&0DKgy)>I!Tm3M~`O1OYN;rr88KyB@J}P8d%;(^# z+qEAZ9oi|RMf7)xKIZ-Dg?mev_v`BK$XiKwgANedwRIY?^O(wzP&wwUTYD73L$#k(!Tu zJdttg%o)rtwxG*|mqXZdLHh*S(u$XF-n{YKT1*X0+3LAmgw==W>k>*3gp9OT47{>Z z0uOXyIIYg(s;QWIXdw|gUVAdzP!-6z7IUxqg1>*iafU%e336*zq{DD(Tzk}8={X-l zuRhEWs<3^WbDfJzX)5TwL(KGOxrYQMmoDk^#VY~I1=0)YF#g~Y_R%HTlM8Wh2glFs zjlEBnwyFST^8HCtXMvcjq*c7n4kDy{H;$GWwQvRM= zeVKQ4SSv*aB)JOaN_ak)QQ`EKD zgR&&6JwRnqlB$#odafA_`@we8ukO&Km_(T{_>O9i-Xxg~EDGaEkPnRn{d@=WDk3cw zvElg9tlE3hOo#1RIrlBmo}eKJVHE`3Njpy zCKXlRUN_s{vZJ`5(_O(|b}cupQmQA1hpKli!lNCd*xNfmPqjIgQ>zrurU4Aqu3W!Y zn)DZDier(Q45Q%ra;LmEmq!9H={82@FB6{cVOB|ocDaIsFwDye=1xTDf%iZvfEzmk z$8QEKfT!H#cZaOiN0Fmg|It zXNOpqzq)5hc)UX6SoAUgn`1fK(%3>FGGy-gU_+}SQ+y1B4{uSQO7PaM1BhLq){FbX zJ6(A8A!BUJ?O$-nNmf%{3LB1sM6Cf9!X3lX^9uC>cN<)VrNH2}8nAO3&%D5}XeKV8 zE4V4y;2D~)l^cOx{mia~B3pE`8BF6IaU*7m?uVWpBiu;H`g zieWFA_gff@%cSS?9C|DfE^dTdbReY9p#0-K?yNnwLZ#-yP1t4Bf%dz8%Orsd!Tw}Q zVaL|Xuw<|!3tvElOe&mAL;?bKUdwY^39*|Y*FUEND(aUXI@bC~)>9uzsaK&28_Eh6 zi%oZoEJC{aPv`1ngTcF0qE-9;9&ked4LuY9KS|$ob}IvTMA_!%JQF!M*6N8Q4B@6k1h#Z-`uS1?ZumN&}+nhvKa>>c>IF= zMSyJxg5B$m0{q?b-0tFH2FZ94384nuT+^T&-E1sLKj{|t zoUa5$HJC2MUD;UZp05C#(B~QMIJKwKNoH!TN(lNzf9+ruxon;X?anur<)txM%n99j zv}=rm-BExP5C?txp2X3~0j189vtVus?`E^J@J^g9oJ|-DA)#4`X1zM-)C$<|+ovd{ z8b2H>&i#@!KEi1&T?6v9gNw`fm^7lBCc3G)Id-;f0Y$Jd3cdbdo5;z(a$p%2I^pVZ z5=*F7W6fyNn>1d>rdMF>egmv$QApTmaS>=OBOFSeV>-FIPJFo?&I%Od=P#H!QVWf| z?uj{_WUtEI&|H9>Vsnh6Bbsss$VItxfoF+@(9@<5{*FofHyF#ggwh^FmqY(mSOTBG zOFir!=+~2WIUKV9>L3+xqW;_Qgxp!T(gy|I@cEwPMzS6KIv}65Z_hUAfjqIT*e4p$ z%+%1Xjt+5v;MGB%eS(D*olU=+5)``gjm{1XR;~MRAjtSx*dPT1=4CwZWoUCm9aal} zGpXhq9{ZwW<;!nHgnAW!@PA^y78(S`W*fltDj3+}P8Id#fPbGlMqNfLO1=30#8D05 z2A4OF6xQbsRNOs1w}vvP1so1zz@%}Z*Ts7KAVbIkJm@6f5m4-*97N<2Il)SV zLj}2x-l%{7q@=@BA141q7KxCW>2L3q$ywad&OJb8=*4JFaNGk zP=mpo5#FqT4y`~?i5C@Zy>OD0afC5TvRfJZN=^Xzl^p2ykDTOV0PY=ykWn8zH+s3N zc60jr1!tN11!lK(eF;0K%vv8n2sg?5m+9~C-`n5cureg%?wEH0B?fA~A3vmuAPT|4 zo~K*sC&@I@@}h2%?j>^1P~U%d*H&7;#WW1L+!ylW$4|hg>+0$rJJ)l1H0Tl+8OsbR zJF;YV)bk4o=>mdEUGE{NhJbsLTT<9db6~f!zbFPO3I4H;WB|dyJaw+t>&E6Sv2>0t(YK0VPBRcO{d5s@|N>37Zi2RJO zh0CXbIPM~$Ibmz{fo$Y0T5`2F<^1=Ugq0X43$;_a$!{1LV3Z1siH}G`yZnVvvtHpu z^(r^>+xM*<~9d@+E->Q0$FjV>lr% z8MF8If4KRIrC0A*jxpBQ=*O<}^RUk1PE@+gGBR2_V0TE_@+T?I4~)E6HwNNbHCTTl zJ>WdQeA)EaotDA$8Hhd?tN_zO%1k=BG1E;`H>BuTYZ|S7jO<&Zg%re9WxcViC1H0g zTx-6fKEbysXYn)zJ9(5_?YVctIIL@Ro@#hIO5A;hIIVFzsfttrG^ge4T0 zQ3nPF%F4{%gIEv4D_rX1<6Q7`I?^T(dY?bX(8(v3mIoR!X&3*12h#_Qf?EqH#~O=N zj*_Vc*4u$uI}%=A&C3*^AhlfhBEoakG!{p)v(Ytpui}bC$9t}C^Th0XQ#5_#a_!Td z?Ue#95%RVl@|9T5hY{y$E zqO{_o1iQZ)`$}CFZDN}m{;0y`>r6;6b`b7)Ju4U*TAkaboZe5TZ zVL3Lm1d&v^y!pK~1T?IH>+pHc&L)7Q5_d*(<>5--F4^gcATp^!E)uZY(?Aq>62g-T zrs%H(WYdXEGa*1V^c`E2T&{jVd%^(lf7qo*IgqHJ9G7k8TU1DStRsP!3yLyTD-tQv z(DxbUt2Y2WE6{G7{9mp!dmWMuhPy4t58G+xEgH=Bd~Obq1_B;$hw}SYKyJ;E5zVP3 zg=K)4WL5F4UA@aa6v*E;j&8rvN(0MP-nF~KSxW8SYm^WV@Zg!0gl+>|L2Cqn{!ADF zJ68)cW%~A^Z(%k-7M0*bIf|rsB8IyrZe(xWp|!R4?O6mm7@;pil_x@(1@CUXJPtZ$ zEEQq;O;LMKx{yfua_eVvm5wJe+LT6lY%9Op6>aP=v7ukc^Vg)C5C6 zm!JqU$+Fwv(BLSV-K9)3k;+SB~3M?6*bk8PU75{b?fz;h3=XI zFs|KvNtw#;IlxB;4C_h>Hz$;rc@1Ru+29G4vQdw4*0aEHepjQlF~Gy%RXt+WtW%{| zNL9DrM=6{NLEs14v1;JV6}w=EP@j##1MkT3Y>K;fy=BP(X&58Bi1n#YQ+H{1!QEf| zn(z}pAesFiEdXfTk?>>#-z7u=AnBrMn$K*P-4LYd07ar~zqPAOn=8t|?oH4rW6GB! z_H9;&>1R@R2Kf710rNNQX4mF{6cMYG5TFex0zBNtNkCblW6qOW)GaYoC+Tgp*QY9cxdAB)gv(`0 zc`Pb327|&HTC6&6K>M8v#))aACA`31lYyAeP5GZ=hA-HV8%=J@QolIh#7hzQUPvV!}GYuDKqC`|_Q4eBEpfT6 zOOg9J_q}yHq2<0=n12|Li!D@|(cVQgdJxObIPIzv%UWX`0{Nqk)Y3^6RbH-*dZsg` zLFPVd;}AO4meZ?I?RCLK&QFm44I_f+svbN)kCXBETbbKt8RWft-|(>YWH-{(n`2*twWSx#2Kib5Od1V}MT=P9 zhT=5v$&Tb2m8I?Jqf47zp`E$alzYQV88^2yEy zjmfd}quY^iJZN&PCsexn_)au~^A7pbRZoKuZCrFK-*ZF?7NuTU**{Lbe_&uMLd z%Lhfsj1E!VELT^M{Vw~bZqw0KqWk+()h(~2vU9T|SY~oS2ScsjS@ub=l#3t}88SXB z<%W&NREm?YfM-0D}% zSSNRek`#hxIn8o9w)vnANEz1Hb@B4#DHN+3;FfcWKp-MjE^liUcd8_p%9|^{wzJ>j?QnWwHi_`M5KR=p~~i9UQ4A$_(WA2%s25$E4NST2Su-26$wCOKv@Zt z5d^5_)72T}NQZ2E7{VQVUJZOi=9w+od>z|XkSh{uJkRcMano6)$~A>!jt~U31U<&V z;ofqq`U`Z+YYH&)kr-ki5Ov$AWYcdb20oLPtp>8=c~FfIXcdqMaf%?vHn=c-^tVll z)GM5Q4X%OFiKT<5@nG+UmHUr#A|N|ZDN+z1#@{9a)@ma`FY?~{wi*L9!7qKU3|GI3 zJZHfh83L3pJ#-K_f>`-USJ&FkPh6vigl%+5;#Z$ug)pK~5_+b0s?u0*0KquWCJCZ0 z_tMtauU+^=Zn{8rG!|;{LN)Va#Y^u2e=NcQk{N+Qvi!5b7?W=Pufx@TNN9tAWglPvjZJPxKqs)g9le#`a+*2slfjL$7H|Zli}P1E1cU33exP zZLF5i*i1Kw={5RNnBD%~dXKVZQZLrc0{V76P=w&`LDnZhFRDz!3vzHx3TW2exUvxx zGE-lkJh?ENXK|gIy{!9G0P?T)HJdR>sI*ak#j|#TRiAALZJymza(}&%oy$Ruy}^Ei#CXby+ZGBa*lq@A7-b$txlH5h30wh!!VF zKsfzS;YkBR1<;ZnkIG>_29zTzvC=ibfipq@XvjIN?TOk;p`0^Ez^D5Y%9eJ%fcft( z5s^}i`Jp;Ym1@UvfhrSYN~9g^B;fLRH);EC(o#o=W%mevRQ5u0D`1!eF-swYP&|(@aH;UDkC1y^5zF*&zyFX zE=JiwaUIBK^Tg`%!!80=26SxFGBfK^3Ky~Eg@f5*f=5c1(H`*NvZsWN{er%?#@_He zPe17fT#E0TAz#~BCiqe2k-$>Ka^h|+UuzUPUca2D9%ji2@;?c$k4(x1xG)=MqJ);? zNxsMPQ_rQfHMDiRPB^Y^0p{d1HIPr|&=C!#OwFdZ)*MC9Pv;7!s3TXV ztf%RXws@L;-$-?X*2gNmsPSn@WY4&;rTjp34HxaKb(P34~56G2A(NaC3Vmk zSosz)8rhJ8V7JjlT*d98Jy!>bAAdpjY4m(gqSF(b9+h3DOtye7iu<&YGW2sb5de=r zYtMX5f>@0e!bHA+epV4+rwJgzj4yzJP$_7`EZaoS%6zzDa7~2*kVwLFjI}deg>Vx- z<;hjMYMt0o(y0cSg``Un+iIX<;+U8sL=C>yvyp7;OCLT4d)`iQ@-O@J1zl{(jHStHrIeCg% z^VP;hn3-eZIO1=4hwE%ZI2llwef=hhQUE&WhfJ5Akn(Ib+65$g*G`m+d(v}nrWDNQ zS!{96sv}alO=b_4>BA-u*DlI%>9{vT87*F9|E;Firt01J9h-8;q%;ZS zCZN9)0r1iC%b5uu-&m%&c<>EU8b^%xR6v!1X{Y)ml!S|Ipyul83PlZ>B8&iG|9fvt z1vCeKUvf$Ma>1nz0ofc{6@j8?4_@RJLh|%Yq4UB%p}L?8YzIp=Kj8WxCU#Vm zP8{VKEa?SiflB8*+?YkXN$AsZGoaH^9E`)n$?C7gnM#*HoSFqulinCkK?1OH>*vBD zNK)LlJ{uhZ4s5p5m(Y5z4$G<@bs$e&ej9uSgt|cHL0^}4e!Mw7eSWo+)0=c;{%~Rn zr70B;i68gF)xmsIbHFblaWV>Q*`> zz#34}OEFXiPf1EGM$NQzBbsXp4DP5TR)sHZh3@!}V73%#-U}ggEO7uvF(@@3$TG~* zz;{=sQesM{(e_)%BR!zJF}>QHIeFzhm08lkx%f9oW%FbjtqKbVJg1Xwu2|I!Fa9d; zHz4K9R}9s;(r~zxboKsCI4S}G6eSW{5GWQVu-4k`;`6!AZa6vLdu_M)0ev}T5Xdep z{=^$FE)6qmMkMoitEbQ)0F9mK;`9BxkYXNNGg!dX@o-r>805V|@2)gc@`SikB(V3b zHc7S_)HuMzbpHiU_qK4Q`U?s`@HVIbbymXodsJ$jG&3NHD6W(!gFgtZ9PXlT?7)%} z3kVzW$BG9PJrGm$v8ABIIw%@gXAQj5B%IFKnVCzj0ePLLzM$S7E+9I(5z&uN=k<+L zFVQ#K*ug|K06GyM_z`EBY2y(S=XA*4@#G@Bvc67lP1rWF_7LclpA!AFhNj7f9R-&7 zFk@DTdv`?E&J%R~U@g|HmjH4M0wftKEKTn*0Av9cr^T+z|C0Xgdq?Fx0sVPU5A3O> zj)eiOYpHk#8)h!v;gSwM-?Rrk4qibY6gnHw6Ah`QzCuYLCNn%!1Ojtf@_H=fJBj1S*CEP_vP|+J212=(!rKMj=HJydoz*Pj-DzD#V<3CA0f4q8yz=I5T5#(N zQzd)2FJoljJ*HQN84QntgRP*D+M?2(BrAF*o*HB5q@9Z%;Ht`#@vs%&FccstS&mF8 z$`Gl9ZX$PY+WV60p|)vGgTff;qP|L(ECiP#6Nlvq5XVQwE_f^^ZUi1Q@(F^zL4W>f zz^|`&o8Ms*3E>3=1hm(tj{RxcVny*EsKk#$!J9nVwoQFKVp$g&uckSQH$-3Uyz}H?S$Jh!D4-app z6vkK>Ud|K9)4_*y$`cS>m}Y0`&BpnacNUKhe86}$=*9s_>sA;|algmsOH~z#VKsIm z5s@w=mh3wJ1~TEb>$}?A)8n0+aQHyhee78SFM$ig1Mi3mVqmU|qf?tBIT0yktyro{ z-0GrYN#B``_!%g&7MZk;$!^e6dgxyKnaRcQ_bw2Mh97mto&8#Pc0F7LdnHVKBE=&N z)Bx>&ySaYG#nGK!9UK@_c_g+)+I%u6yMFEXb! zwnsljo&i^F>1T(s>Bn264{k1x-+lOS-*P8auCh`Ktrza1T59UBvosO!U& z)KO>_4K1zF*6AH4-4bwp{kC@=Y0b4yDI!n0gzyeT%VwT$@d}clK+ot0>`y;=t@W^K z`ErQ(g^3$<5o<`TNVV-SXXJeXH|p1_SRU~LOLkvCByjzsvmTtmJkRcPIQD%6KQXT{ z6w!=J9mtG(PyjaU>c4+o@%~TS^!_0e78aJ1*Y(RFi&3PbgdQ=~v`qZrpFZN~I!t$G zXKVuW;+2=Pz)Y+)nfHBSlWH-dPX3M5+4`-Z$H{t+KZ(4Q)So-oyAZXaQH+HBA7`3m z<;n}sKTLYCg@9K;SmV~;&_7jYA&B-%Cq8_AIx9qb(Cu;?od%CIl;VU?`>j=*f04(< zCJxG;ypLeICGD_f-Z`iU&+_tYzwfyeXw@M`=e`7TF*jBmLc--Us{O!`ie`8~+ zeMtWso4I@n%gMshVZpbHDxY6oBUzRP^z>3VOb+=}i`P4D_BN^r6NI50XEp>Zx&boq zRi&}85{%lI7}dUGgI9{`p(OkdZFG2%*c$EBaLDOg$K0bIE?c#~AXgLj6>UdIk)`b`U;b0r#lc!14es z9%)}P7dcF=@K4zM8KuzQ&oC|BgkNe_JWnpafB*h4^emOmZFg>3MXB}^E8CcqwJsR} zM)3;v6tC?}_$Trih7?Jnq$KXbOw+JJv@dY)Kzo@zMxW&cwE>k9vvqAk&66uH&Yp6g zW^E!t52C}>UM#fp+Zzl5cCBuAbW9x2K%f}O@NQK1L%`e)WPXty>@z%t1wr^sjAdk= zlp^ZFq# z`X4^8=&%S_Uod>Ux|_zDZ*X3T!DM7C-~;O@CI=Dqo|Kbi2#KAUhLcs?`;@Ko%?#Ic zVXHA-;J-{YBMlz1==IOnI-Wf0J4nym=O@PM6TUqs_r7vQj*yd+e{;u*TiUJ zu`+cIM^DifjuWw-gjqbG6v1Oj>hVw*>!g{rf9 zk6r4G(&6weqw6`-ZN3r=baHX%tm9~3P-|harp3$7$yvO;3EWTK91Ob~H63U_WwkQ2 zU{sa0ovBn=$jElD>Le0zepUPD1u1C=IAxBN2dRx`4o7R`s%84d_dGBS12dxSlKtQ{g`Uc*CgfV&oA?yr%sNx;1J%A zEA1>Mj(#a3tKpqagvwK#ufjk1UV(?Dh0d4+-%~UY>(tA>N zqB=FVxS+Q;f#*OZI6@fMEdcyT}g z&gN3zG#1)Os+9G7by70qqquixl*x$u*S+sbes&LtKKbTvk*)NMlin9=+Z<Lx#!D!dZgSlZ%P=6_ecayiITW&zLW7=KPM%{;^Hb$c*QYN zTJ-c48=Htq`Wwj1$FWj1a#K@NDOuU}*?1rZyu9w;UYwx;SJFU?uMuOnroo0F*>NLZ>g07x zPKxLtOz0!9-7%ynk(`|$E7n3UUuDU=YaF+!!Z1_P82I^#Q7NN%8tY#6py;(3ds_py zY@N?L@?-wfApeBJYN7^-ik(l7Z{7m{^qFE14cHpUBnWzv^mxRr2@ry;QEfGPzert* zkP^B#9jH-;`0No^u%I`L6+(FFl**5$sil=+kWR5a)WUrR1B`p`75@wHwFHkR3Ee2n z&%J^}+w{^ruX5!{9+xItUeMCfIbN{usS(_A-EcC#XI4LMGuM~&0hyd`Prr%@4WHS= zL57rG5~D9|HQoZ+lZjsSuyJ>LXJ>)eBJ|hXXDGhucZ2R<4p|;V0@E0Cf+M-^vk7=Ejbu>TtiP~XeR8heKZ9K zPrdQ|gpa{o@#dx<@n|;1j6TdKq&e>DE4MBOo;UFp-V z{`FOr;Vt&pjHf?af(&oxHvH}YWtZlzJ&@MOpy*nvTZ0CMK?onWl(G%%r*mj2KJ9V~ z!24o!L<0g=dxJ@$tJg%ChR%W-z0i_yOTN*cUtlh0V0|nD$Mwz*^?&#Zi#Jf zCclN(V*<2*N0h9}VDOYHPZsB;ev_NO*`R?Va(LK4Df7D^l%m|62bfE@hiRc1GDjL- zPd)cLSciLW=u$Cf%IZCHvM$xm!2>(-23U2`-hug#Hzt)sLyGXW2MAKR20ZJeKael} z{^-EBIJlow!}PL*hfKiHPlXQck1FgSUnh@_H#a#k5f!v~>~srw7kO!E(eZ-5Z+-J{ zz9aWN-Jx2KW?|_YZqZ}@`eFUDe^vmd^SYvSM(v(o>NNqu+WJfm_2u#Hw<}8DZPkx= zqMk^Z?l35h2J zxnR&Tcxkueq2s(=ER%ik*hr4hPcE~y^3$26MI|!u%D>v^OuT}!owVfwt$#q!z(;Z( z>lwC$_7bh%MB_yoi){x<0HGL*vs)t?;+We(4l};HXOw@1ODSSJx<)?d4igc6W7G5S zDv6pnz%~y<3PAHr?LtKF*xR_f-8j74c!Nf>XTM=RvO41~z4?vfU&B^i zQP8I+5_WuSxsSccYdw?8=@&@%ZwnQdFAdL!z7l~bS!*;iGNNqw&vd)twf8!XL(3ID1vy-A0uqj-COkf32DGWE&yo?MK3&HJiOms~53t-N z``nYKoba@&cdBrdT!Zt$9$xS!XH9pc7ybO6(H4FPw+ybTivDE{f*Z|Q zOLX3VLl>Az>#5d}3w5=yvkSD<6YOb@{ zLAKqJ$71ePv=Q`?t7|>SxZV9GW{=j!%=lO20RyN$8<&4=_pkRi0)AG{u{$5X^8R}I zrzI7f{{#t&py;Tmhwv59p{9ODb^(ySzmKvStv%qj~d;2^8t&08W*n8{wrlccv zM%fx`_46HG3!PBaXFhyIzy1rD6dYdVb9W%>Wn57z?`?vr!*2@#yZf`sJn|Fj6Wz&l zT&g@)^25-lkTnmy)(_w@fTe_%z0K_4f}X29P?%^iG&1^HkrlYq*Zn{f=E{hg#@mM% zs`)I31KhBAy}Kxe@mhoJLc$v43S{{5(h|TmMf?1xr>^VMdOpq%L8g8${1YdcP5qXX zCm)NQ{el8?m1ySLK2-AgRL>n?*WQ6|yzgmFytxU<0MA~ zyeq`UMp3&r_d-Ng!5xx8X_ROu($E*V2giEJhnK(&sr;aT0Nlbxla^m>6ZKk?{5C%( zrQW5rcYNyW`vm=+hdD>61pG;odM!oC0Gnh;G6Q?IM3z3oyTkqB6#sDOY>J-1xO>!i zgXF{r`e7Y|^LYF#vxc30*U9FDUs%}TPnnZV8UMnc3yQ-dv^=&l*ic>F?=SY*4W>v| z4i-HZy`G&vrWEz*aUL9ojNHq#Nha{K%GLJ)fO~(Rq13rzucKGP?+6^1RJc}mV^f<| zxRBjT@!*%rZj`=1Z>hKr8vp1_U1jOe=eSqZ)JP0cD4SSG)V+m>$7;yl(wy8}Mfh2D zs%msFP!l4r{pPJIy{^xt%LTQ0oYAq)Nio6?35Yq*Pj?z$?aAY_%vIUOrXu{qcfZumN*X%4rB&Gi$)|ew&pX4}T;BIpOv`tBWhhcv zsD4>^wx~(B_4^~wN;-=duJg<@Qc~u}8`+!gU|oqK!(7PM*jW4?&sa6{1Q5BHh&+vb z*Yy#yJ=5p0UsLsLzdrvL7!gcp0Qeon{9kC_ms2wR1tu=ow-`moK0opr6sN3S7qqdi z#ENmv8%P;+9^4T;s~1rMMA0}??21V5Gm}9Qz0EH~%Pd<5-_&#>F^Vo^9(5)`32wfZ z{@dgyVArFCa`ev4=~6>WkP>K7|RF=3?!S2dhiJ$;X<$3X{SOtTD{((?v z1jknJaSpHfbS5K`<~6t;R+DzEe*V36TVjF7l8bHVu_9uKOEJB*SD^M^3NO+qDy|eh z+no**1l33EE6QS}SOSjG(vqhOKqBCF{jtH2b?}HQ9ndC>YG z&fBlZAFvk<@gEE$r|9Ya_llZ8Km3Tu+0=O~zOUDgf$neEJE14Dhtz3ieu87SU5C$D z?0m1It?fR@7AX#zj+NJntSqPs8hl%RNJJHq9rF>gyxji%I))bY&tg@d$VjEfPo9d~ zOEI*yBdA|538#s859l(kZ!#fz!&oLJCZ3dOF(`cr{4Nulx#{Nj5}W7wUSv{IVVvLm zGls)wG4~9H;?>qjRrK(yLVd1(h%4GZ_VfF&zpMA~HQe`4a_xJ!8|`aMom2tthZ|m} z*ExSYxqTfsclBS=27`gTj!ZoQmS38$?!`=!%5MxeV|_{y3K=Sgy4_rsEHp+?@_r~N z@Ar!kdOy^jRj0iu1y1@x%za9cN|go)aZJLJSXMXY_91uWmBqK;n%s}55(rQqCme8$^%-T<^T@&49NwM<(tWgX8gg85v*&0H74+k*yH=wW)Ks^v4kbQ`|Ai3j*CDeSEv)YmQA+=xdzrAzQuKfCWiU%;95n9c zdkv}x2i(1`X1i>BX~u9)4XO+)RJ*|e4|s7c*Gre{A*#46UH5N18)>JpDg>z-w~1fZ z*!Xpg?N$27m5NG^zTr1Nv7b>uM1qe_j`Ln3v3_R;{| zo^;p&a;~y`;;iCl;0Xuakr65f|Ce_Ij5}04d6?8ywbQFHol4k@y90|CdzChgtwC+E zfz#LD&*8pAs~0SOFbRt!ZKBGdFD|<3YahW9{F^i`d=~&%>E=|VgEXN-3(-?&G9#*1zJy13?#g7tNC_FMXy{c|sYcy<9X~g29 z7Ro6jFW&(uB>VG!n9Zag4=Q4%hCq49_IV+(itu4T3;ibe+zn&*I6Ac^mID(`g2ugQA3*vWMUd@1M4b7Q z@D>~bA{MaE-2cc6*sx%v)8P!4+Q`O+Y+h!YU{MYXX{dm#v`@IPw6s(Kir6rpJ78K| z*U<1e$%!w7FZ?j<)mWlrLUMBZc!$1+v6ava9Fm0KC9hRKz zWw(4ekj(bKr?{Tf*Ln@6@VvqHpD`c_`H^Et&4S*>V?EcTR{-cy^6~TMH%U&|zZF<3 z(ne^4$~57}_@}=k+$14ssYB$;39X3?n3zG@cRUC2t=&X|porJX!&<>@Am0E}EF@8tO5YkBebe!0 zOen7ULar{V_Z72nMBQE5C2&@W(7xjB(6^ta_sy#1h4_sp9Dd&3KPt5Rs(_DyOD+bx zZGXx3c4~Gu12o+{@Ym(>Rfv*H#){b+wwaK7x@u+_AJc{0FUj=o)&u)>piH`t515dc zgPc9>28m3$Nxn`_PSqBpeuARl|3LfFolr^B9@$i|mP%U;6uzXQn*ADRqrHt(|6-Zx zCyKSP5eL+Zi%LSHCt&I6_N6Dgfb(vU6Ox_umH%NuZ-{QDoY}~nq5Y#U+#SAwR-2dJw*3fu8hy7X>SKPRqw*ouYpo~t1&X-oRx!JWW;Uqz zaW8Fte@*@wA=^6uI8Q9qIBzBtSG)WeM@^Rj=`>d#DCzLlRudO!)IWapEBzPG%MQ3g zuoS_X6OLU{Tnu_R_KVQAHh94?!||@(_k}sl=8MhXiZQhb6JU}m>UW9a7*HqS z3%@_=i#I;L>{Jpur4UGgGfqF z%rb0s9;B>v3J0ub;oIvG0-q#AlUmuHBEiVi&qEKnK8@J3?*TGljez|s5%Vi-d%0=^ z8I>j?aoK#~OQx1hs)V6-L&khDMD(VkhKe8^_7T!uIi7ec3cbYx8YIcZJ-LdK!&ymt zsr)FxoFo3R0P9r7bYTmk~X zjY#@`H=_9Xand2MK=z+J<{lt@z1MSz=Hv099bSOHD?;-&RM2(7Ci~4tc=dQhc^|JV z8Cf>u3KR#b@Vmuj`c!zA47~e^6Q15MboxMAPL*vk$>SnFi~7fpXFg7ibDJd?n@-!y z5GGgGPGi!KMC>Tuud-2TJ~-bMqwKL0+&0h-(Zbw()*Wr84eJ{E5jkioPwE)ZA{m~7 zx+eCgbK<)mA*S*xPqbKi71C+wZeMPHCx2Vc?%}%kn)hWFE^Q}O=Z}yOF8c2e(fxk` znl|U`h+f>7O_P`eQdq>&yM7rqJLdqn3c!a60X8D`DuvzPFRrAGkx}@mjgC=!t_|83 z6|;f%-rg60FJIiXn9eMiLzw!zy07m$yw6V!^*;r{4b^UcL7>eS1KyZd8{FdI?O| zdM!;O(p#fugX12PRc0ed{`K;I3H+=d*gHY(pw0L!lu;qc*odv9ahU0YgoxMqN95T7 zY<#x1Ra-Q$Y#r6=1QZ1R6E6g;fPKh9r>yFJCm+wzZ0Ecut}4^mH^1sK6|_2Ze{6U& zmL$MrGQKa!vNavDq^~>%xSsqJuh}ipZFv^!Tf}gtucBmV?pJ_>DYo9*n3wRF= zlz1Oj5ls$j+vvM#onf2ZHzftgRD6~$t%^=u4kK;@j*ceM2c@NK_AV}86-EO<-hAb%U&zxM?D z@BNlYn7~n;6s<(d7o$~|mgi-!Ik6k=0lcpi(QnjSmK&9TLVgtGhWaqcHC^<*hJ6I`dw zTD&f_H-xAd8KqVA!Z>`W<%h*7XfNLXs949wnf~O%ee=lbKk^74oNF{gBgT`Ii<`!! z%8Lsw%!t_Hvn{I>vqY%KOj#i2=n@vLZ@PO#xyI&G+wE4G_kWC z0%Cx`_%isy)WPVS3uU^5qi8fEB6APtBqdiChb6)r_^+*6KxU1_F2 z>4Lt}Cgsh%oJ`@f!P+-AH=uHKBUQpqX8P!n3Y{&k3nf3Rm>-HC%wa zH+R<3{9P6pku7lw+``rCp4~@-?ujV6^{aM2xj@>z5^&#SDb2)!QWl4Ftm9|vP2HVdotyYVbJtG+O1r(oIpb=f zRO!)NoZmjKi6gZ2%Rp8HM0F7|dkWIht&?_#&HM*QGT%LT-ZB5d0p?WI8Jb2OH>Rvc zQv4c_L4AU&{EdXr$LjNDH~FkgN&oHaU~EbQ!mb~RDixW8(Purz!H4A)n>5(nu&bxc zsTkMSiQhxwOC6D*c154mI&~^u5wkJM*#p;tieU1VYpvgK@mh-r#6hTt=dQ6=WEJL! z>Z~PtTA#;754S(W;88rA!E*S{&QA5IV#j@moM$*$jh}qitm}2j@hy-FJr1SOgoGlb zNULKdrG4IfO3lca4dU43{ps8yJSf4vDFXNAtIKr7`Yh+0 zlS9z4Xz1YxN;j3y^sgYh!nQG^f7JOIqy~CaY8Wq)7Ayi1gzZ~1Seqv(1K&8G^NkhG zVz*0v`jaC&`EW8d^~k9UDDa|-=463tA(vHv9OSNo>8bK1T?vC18+uNsEETM_TSE)GxMV(Gd#LaY2B%f_>7^Mw&E{EbV$!1 z;ga&$v?B)%R^ag|DWO5pX2z|VtD5EJ^@h-fidE?spP|9G&5|t@9kE5cs!UX4RN&UA z9+v(|Et@S@%UHlWxP9;lhq&MSD4}d*pX2)3AXv*>`S6j5dI8aAr7|su5!JkWaX1Dq zK{-XT7U+&YZW3nIt07UqXHXwVh0#bw*SxiO?TrXl+d7CM{1Bu7WKBGFYNag3<1LQJ zrSUVN;H@k0^6dR;^V8J+J-H~;s3m}U?OvOFHPSgU4Q}VC7-*ydI-+tiGp%sS%kLdt z9jZsA3a-1C7(0TeUlc;ZHEX;|+OD1)5?rA@=IL73LAG~+yJ@4%jU2cTc%eaP<`&18 zv!2J~VE+%p4*p>lC}3jXFw1_4x7KryggtTFYIZ&>fAcuW_BIB3vpUzE+%{yfe${hu zD%$>Bv~g*oC=l=J><WJFX6D~?xkr+EGXkqyPI z6M+M=--~3iRtA4xa`ID3h8zfJKvEXFQJXuXe(?wc{G0?X-gk@5dvI~X+`Id`b9vHY zt=GB;BCDC?gOqyUla>~u{;C(?Zp{kIW(JFYe>7o{x#p}9QP+ks0%Cv4cm8S~lV1Ae z{KxY=WdTWVVUvm5_15zY=7>`cYX5ow?}pC!2ATGX0kTWh`|XjXtdP~KQM|n3h6dWu z0Sf{}O$C1c>2I`@fI9oVUdk%$-6CBzI6n69;NSkSP0?y=G!1_mwl$A!h(G%uPFHME z`cIbXHh+D95#flu{{2y{9NgssCwweOCC=;67obyek2HCEee?=)5w9LMIZCZ8L1!!H}^+2wP3AB@M2fE>)e3yggMcB1anpbEx>iyEP3 zY-D00vE_JvXKERO!QjVq{T5}hc5|fK;drKt)y8W+*#9B#ExfAky8Y3Oh$0~%Ehz}n z(jYBJmx82pBOomyB_JIlt%QJpbSNd=9U=k((%s#0=YHPz{oQ-c8Rz#8+%X*E89oww zfA?B*&H1S%y7O#yr7LE9A+vkrdfJ-@VN{)@+&C12se1{OlslAbd|kvkLUJvvFj z!6!`du>EBo_FqZ^-@n6p{x0!3$l}+J#A!<7u4sBt4BQgpE`YUswJzM@<{AG`U+%x&7BJz7GCV*75QYU5@-##QHFlbW8fC4!$>-)nQ%s$YZDi`8~7xo#u=pkuUiR!`jdO4HNRKw7c!=MCa$-aiScz9VAOhWjz9iQfS$5e0$e+qqF-t%u}53ItyeB8;=|BsKx|_YdtWOX**LQbe->;;Wg05%0Wq9d*s1IY?+3c9UY(-#Fnt@vi% zA93k@INR5sQXO=)amlAzdwP06cAj;Lc{x%dL00?a8D87RL!#bK=wmA&>g0gkq*MJG zKh1Cp7e-l#oAR5gJ|NV+H5^j?im95}Y$|bFZWHqXR+{{R7VVDx0d`X%j7qyov&KdwV zbv~9O%siG)t#|-AE;6&Qu&{fr+ijljM4K;9IwHWh7y)~o1}Flg(7HGZzgRVRCWF5C zy-R6V(i39Mc#6wv$3YE>{ zi5wM5F{E4=Kwi3Q4f~dL*Y3T=S#$5xcMS^-m9CEXJEN6FaOVzwiP?ftW5nyY;{3cH z4W(hZ&v)9IpWO2Oj}{<}wjBl09+BDx65pq_+Jpqm>esiXyj%WO<6QUjt+RMq#Jkv| z%W|9wdH}HBWK0vUBp6kPg@?C-T(W8p#>QKxOoG)DBwQ~U%xfxa&ZaD$*56(_;P;yn ztY|K*zna;tu)Q)|ANM8!A_Gl|2g%X}v=z+jqEL)gEE44^rwD|;sMuNfs!Z~z%Nu8KFZTtE2^QddT6FyG2+@Unb>rz*q(+!@8ScR zv@l-fkDL}_R9NIRx=x?!?HJYbwQs^S+31>=tMfY(kgD&Nf0M>h++qJZEkls4_nwsf zQTj1#lL&G_#;2=?>p#^7DqQzoKfZ|;_}Ord_p8nyvIU`TYBmu{mo4F^KO~ZH^4zfz z6}D4z{xX1DEq}?plj;7uD~WR!Sghmk%gC4Uo>@bQMQ^!ic4X{c+i1@<4GrSs{-iKj zuWyxC1v<5lH*4V$ASsJvp-z}pj7JAhlCqHuo5f(h@K~A6Eofi-YcW9)bW~Z+0)yDb zp4Rt=@Kcb3&DQ!)D{3L3kc=+d$>Q&&EzN<-`*-P8rc7eb`Hn2Zz;O=Sy<8C!$YR|Y zTg@fi=sG&?^<*)|HoosX*Yn%7;^qQH3_0{Ue%Dwv!3_HdX9cO*TfO`0$&Te1I*Po8 z;}YtPaDQ04&+|^n$jNu_-M^3Z#zY9rsf@-b&C4Fg1kTL9p!(xPhb`R;+D0CbFtc!cW?L;FUsde6t!moUNLFD7)w%?b0W-<2Vp2Ph2*6w&) zyNy%DS1c}09obG%!%uhJ+dPaXeKYw1BkziTcvG-i$My1@4%$$bN*KE|HMK*sZ}0+W ztm%9wpa~>g&<2nQzvcwxQ=0W3&SGGF;J7jk;pBMjWH!e-d_j(R@)W;iF#40xxIyPH z^M}_lSDOQ|?~quyzKNIKGYfxI6wPJU+kRO)ZfM1fJ#Le0Q)Yg|#t*ogMiKZ4T7DX5 zKdpUfYVxgI{P_^^d9^YLhxvMfA;Z&#R@_cPgD}gA($Xf7jsMJ^!Y%AwhiSSHr51#+ ztG{!nLEoL8*-la)#cM$ud5N*>$E3N6rDe4I+6e0u+cPaE<$bEOTk(gSp|`((wAZ)IG&ggbueqaTC== zn;~S1q?i)4<#Q8N^2Y^GR|N#7 zZJyd?F?_^t3x5LRB}U49Ds|)3H0MGiLlz_sA|6mDU}Tewou|Rplwj|rlZ|`#Pzkpy zED{zU3uXc)W@t}eOts6}{pIDi`w>B+K9KN$ZfR*Sh=P=c;e($g`GsrC8(3-5z!O^p z)cLrcSVJRZ;GhLV((aOr$|+gg!p$#aHdv&*af1CFb0GdtynA|^a)|iey|jt@bE+oK zvt$tnr>$Wv!%^Uq6eE6BJdaq3lb^C2>Y&ams zvT^fg*pI#WPOjt!iXjHN8qROkNO`{M-&9T!YA>umx+cR10rZF0`Z}H%FoBS}v$NCv zlj{Q1H|*6BJd%R4m%kM<;~7+~}pI$copYDk+{f-*AeG+dQ7du-;{ zcf%}-Z-AG@RAbhIq%VQjv}R(7L^XxGalG1tK8=r!P0zqzvqDL6AN)(F`)8q@g6)wM z5#aJ67f33c2nF*SAZ_+4N*3j55~mqwRLN*pjt)*8Cg*Nz!+#Ype?c#@I+7O-Ml&V_ z%x?FK%Vz1#1S%9URoI4s+B|vo7d9}2rOoQ>*WNTWiCav_|Rm7&VEVsu(<$69`z2F^32FVR`bcdb%I9Dt&jVxAf}p)z$9e(?9`~FUrh4P^e8m~5YCdW zZj;-+(NIFiU&luv@X)MgLO_Q$f0_NY7scmFL6qD2Dc`TFgMz)NOw-V;YZ6m(lZ4aj z`8ww5Y;*0m10i*cudubX)m-J&9BGmH9U|#)zyrw}u{nNJIP-G}?^vW5mmp6;F|Jd-H#Y=3nfEf7hD zCt_7`CGeRGfL48YMK_oI-!;pqv4#}+Gk{LCJJO@pi1R=$$QPW-hEt6{Qh%w53|;@% zK&c4?5R0b45sNBD!3(p)yL{_K;7Od}gfNdAtihxi`wv>g`MQUlfK3G*Msiix{#4I5pBMnPwT|G*!k#I5Allf@_zhXfdp!6&8b{OoMgQD&xut&M8eYd za7!Zqs|T~jt(Ke+7uS_?3cdXG<59V_PR>)Aoo$8)P=B|tYk6TzbuuZhezsnJ8j$Y31e@dB z{Iqk!(fwdOg!C7E(}a#d@{pSRCkS zAq6`7MVJ4)Q=t&^A8b$#46Y^az6ZUs-;K(V3O zyWA`b-E5OC-En&*y{QhStFgoCA04u!NEd@d_3%VhhJ;A$v+Ia*(<0fa-H2>MUurMD65ZCdJcH}lHVZ~f@g2xHx1S(AZFvBXyNRFtj?Zi5|YW-FQOXHBAquphJ% zkV-nerTd9M%50#bPnzgYYgruY$J_%!=hZ9_-+Q!2wltk^p*^!RS=njd8r?f0ieW5p z6`6-|;qcs+3rs?fH=SYQf43dM_{3M}lb3f$X@S(~4*FD)a9F?BaT@|f3em%TX;9Sv zc2B9BcNT$?I$C4@u1P=xP886)s~b)=s7$rXQ4TL9SX(6f3z4RjQOe?j?ZvX$F?&zlPmsFO&-n-N-TugUa&11|d;sB5ltHVIQiO6COkgOWmgG zN#25?-q!C+T9#IsnzMnha&L4yrIk8s+t(9#dM90#U1SbTZ#+&H311*9fKYm_j~l-O?F=8nQQZ3V-4zAoW= z%jUGQo(bjDIgcAGyM4Jhh(Xgmu)}ol1fdNs)ICN$Gumq-w6pIkVzE-#&B7o$#q&|D zYt>ZV0G|?DlAteRbbFdre8gA%A|hbM-ys+MNW{VNmHESjPbC~BAXiD4O?nb0@<|N| zmme=@cxbMOp3HYdp~6;t5_nj!pjQNgm6ZnCXXBeEBL_LkL)m??u|fq81)q5SNya^G zT{l;e`}l(|J2P|Ywpa8L|VN7g1Qb;+rLtCNOhokB%L6~2o4qcp!;ahJJ_OagVw zT&trr&!&Y|oIXhCfG}&abU|B+$_3?de4?P|PF`IBsFI{=RZ1=-xybw?@Uwj3I{8q#V9?DY16Jooy#18sdY zKJ30;c5<8c7Vx+PxR??te$KDJmTIVLKw_ z)CGgo-9S!kZ=AWzmsCi@jpPYJsuY?Ly{G9)7mE|O*C}3%bg4C1i34Je6oJAk1Vo)^FcRoMFB5|Cru46LzZR?#dvXc{>0 zIx$anG4{^HIQ3MHio7$BY*SNVu8 zu~!uPNZ)dK7h3-V>6-w>#_=)7o$~TKFto0j1TkmTh#18@T#8~e_-Q?q|BMiU3!G;* z?3A^NEjzo8JV#2W#^(z&`Cp<3VuA6WgNCTM^t*p}%MCOg-S4|8z5nz&{{qj)c*C$& zZSnv&4GKE;!J!hp2gv;GlijA)R;?KOaGtD$L!?yZIG79J!;x_*zN9qkuEx`9+Y*vb zFKU4*uUjed(?#&vP1WBUUkCADqB0|$1o>~iWM$FN%%a}G$DdhV{#-VP<{7yMySNkw zB=Ukth2F1hnZgNO-DE?{9Jlwc)Yr7S3^I`lWlw6WXos`5NA&%s_qNWv9Pc;}d|%f* zuptdn6ERvAJwcLn=KcE9Oa1pjgNl5WX+KNZitnD4ruY3uHYFQw=S+X8>)(e`6C zf;fKfid@=KMY(ezzJoJgrxpchhimUQO`Bk#Ma>Q}kOismhYuf~rMq%SJa~tj2&oIe z&IEjVVR%Of-Iv|1&im@^X}C6u%+x!t*=0TL4$~*F1KISe3hhR`Z#;XJI`d2XrNtZg zr=P^PxOw*J(A7QQ3iv4a2N1F{VC0Ls-=0p7UH@B42raJ3yL4>8si`S zM8AFOoyH^O=ojyK0=}o#+mXgHziC#ddFHNv79m_&T)wxcAaUVdb`T}x%Z~9i8Q0%3 z8VV8ocp7i72L)kfw>C})NZ(CQKaKtAk3=|c;b)^FFbG+Eys!RbMb6{N9slm`8$C$9 zE(pQ0I~VOZ@AMjO%>~4!71_V?yN8Y)9DLG6dU9>$9#>F)bLoOriRaQQgcuB59AGts zXNntoe0<$$c?cCqX#_%^xc~9Nsv1@jlP@*;#!Mi20WeggC!Dhjd3*`$e3;N-!W)vD zn*6(f@favY%~ES@7ia_q=UmmW>|B~%zNA{qeW7%tN78XDz$1XqvmIy>9b)9N?f zcip2866EFe>wv-qI8^i=f4yh--53_FriL7&W^fvC92fmW4DtzVoS9ea(MsdNL-glx zn3*LEqYyRUDw)=AA)174pio($hC zb&x*F%LmsDPhoMVyG-3f=1m|PYzH;Jzg#h%etvN`>Cqb$t_xx$8O0pWDh30U!`2yC z%ktE1=lepV{W$$3OwA`wm3=8bm9Mv~@~k*lg5^@PW?-s;kp>G*>n<+6Jgmma8)$Qo zlX7fz%)bfpZMV|Mdh`<4lT{v<^A~grdcym?;CFmPtB>IK z*#Cl}+8hV8lwCVOL6xp6xhSdkjf^THmWLywEY@am?UatWO%Z<+M=W~!k#HZGk4t075#em>G{?y`k; zO=e0f39h|H%?`m09n6%+=o1!}Cu5+4_h*g7#awi%IB$*Slkl05=+$}j_M$!1uZjTh z4OQldoP>fRdW8?!KW!zCt??vZPg7>nIBdH_U1@WMVIPCg$@KJGqi7QBO>4tOr`Eo> zp>PQ(1R7AaE&i;9AMCrwnfXnrqik1i!ESZmZF3^SzxqE9_i^j)g5BD%?&d^HO%SQT zhK)8~yI+Ge|Lb#ZpMAw3i7UrTBM>FFv^;6N!9@LcZ@aRj`QW3HFZ=y}o+sm~x~838 zp*1O*%N>?ZU_azh7t^JS-cDQr;nXS_t^R#-pxT_zLB!nP>-r#v*~Np#h?i>2bN?h< ztd(bE_`OwqLW04$Pp9x9l1j9bXE#~I`C3hFHyO30e?m`!$Ssg`wq=* zwmTPugYDqAh84mTLcn+(OgPxd_n{ml+jYbfgIrTAc(#=wpqrNa0oawG`9%Z9j%Irl zQ><{-3?SWQz%$(T=t{Z0u`lsKE-vPzfOVHI|0ak7v-&HFi^V|UYhY?B`>6yyni>KK z2${YxZ+zmlG?*ST$;vmk1Oz#fjBo3+&YwYWycVWKw;NSO9u^|vqhO4Fjh@CGPV15*iTko2<(8YDA3{ZWX*2Pxtbea-Kf7(^XL z`cGXL9UC(`i{s(4qt$?xj zgGjUt!?eajLE{ncJL^b$w2;sQ?9m{IFQA4QOX5K=JFb~%w94R6?ITv!i{YUmZV2kQ z$4Ez-hPRTOVQvqwk_@f`Qb-w~IKBhYLO2%FzkVVE{XYle0?A|KcD$Y@2qW4Yya3mO zRcv2Bqy!U1TKZ-TgC17v#NVgG-?%422-GjA19YmrFe532(GbsbX2W;&Ob<@IkPn8s zl-|5gui+D4BVv%)4uhBt&a8hbsn^Ll-CgLy+JKMS0hui%$OOZkHI2;~{1bme(<|RR zgH(XNfzJEre&QScP@e==kX{h-v&meqyvl`!>D^_aq+uo@PD54e}96e<*K#~KW%AKArf{K94xqJcez)oWNi!_)3$AgA|9d8IZJwrLV%?&v;r2>#` z(R^e(W%$Z4q7n5B33b3W{O5OzKY*YbDR5>osWSvZO{9f#6`*tnVbGd;!0)(t&85zv zRUEo>GIq)TzAg=u-luJOx3qY)!tq(T2dU5vot-~@7*ETPQ(D8IT2Mp;3W6J8@7S7d zGJdsL`_=tN@a6FG{`^UU_>mh*c#pp>LMBa6kSh+N;}ahaL~0mM6I_g~i@FlL#i4Rs zax_!sF?c!pw9ey^(?u=nZE}GSkkf{dE(PYrD}9)uyT=3uGvmLftO&%?xzh4PPBK*T ze-#Ka(Bn!0^bL87Scq*3(K|p-aNFhjuqBVr4b03XZJIZ?*(9v;O+s6Bv$N;FzdL4@ z^DKqrtd+>Y!NIGntjyW9qw5GCW4*cU8|kdT`?iAO0mvp+A#@LaHeCU6@E|Rlm|7am z&Ef*TKjnQc2158!^NPj7jngSTof;=X1k&IG@@q1<2$<`+isTZI+K^Xwt5CQ89SAYg zy#8u;M7K{4bkaCM&>0#BhkjH{43?FZ)o)Sud+T8b7YuQ zA|5RjTcX?0)ymxGg`B9Hh;tY>@iIJ+-;PKSvd4m)k(V7`IPaPFku&Iyp&A;_xbE?i zAO>1HLU6E5c_>cpXl;UV%9P~K3gYD?J$HM1*&mZ}_sYHzoEiG>WCQ#-Top6i~#&sGn zUTA5H(2gQ&>g?QH6zeBK7FNrms4PRoklvFAys?zQV1CzTs~V^q{AJVZjeV zpHLBcb?$yQ4qjsJ-vgXcLPv*ub`Br%7i>6cTi2rHTVzipA2%m{Z-i7Vos zR1`SF&9-=@;J9i8HyKh6f@oNE{#0yn$%2~Q#a{&!YO`-V-IDWP*Io*p)rS%%l_GT@8N4B_j|xk+aC~ns4Ut-VJ|$ z3?D6ZCO)c18mimA2ZMUBtxxv~*|dwfdk_9l<1*WdlMLIj1`RB~o7}2eJv0#DjU zivST50s%OQ@$&mig_JV@f54}63xN#p0`#K|l|)IVgV$s&(>oPFEI=e7+lIeAESza9c1 zF5bNVqmlpKJru}hyNN8sGewQw*AO*bZbm@#Y8Km(A`BquPm|sD2Et%(I9apIo%SdU zZ1U{j>(taD_4dapF*WnF1KGV!y*(LX0O)#cJQPxscmavcClBm(tU#-fsAbH ziCKm^YdjjXGjYxShD1O_BaqM2i|W^Hv@;)0XymMiL#4TXw9_5`?g6plS||w!$P9N| zIF^Sp`G7jIUm4^Paz7_96_#HUW(^Sk>wt}cF;jB^c1vD4zv`Hnp{s8$!-mgTZON~i zbvg`kH}FuXR@7c8kpC46CxTin35-m*C6T;wb%`HYQ-n$Fj#B&PfFa=N1V z(fB$g(RSaG+o79MPa>C~`D`-R)ZT3f@{;y{D^`e*)K{ireer{#Hf4>o5aXoE+(VoO zTsw+~@edE?J<`kgh0JB^yv~#ct*=g5&GGmD{Q09<))tTcuyvx+jW|{GO@qsY90|#? zG2AsW@N1+w;aT&S+38XR`@g9+Qzbanhu2FYB&F&ezg*P_qu5Z2=uP0ogH((gk=c1a zFNV_i9OiY}2+dh#>y5(7MeY53VXgmsH zZ>f*^TJ-)tmeb}~;3z9`Kb5qbBbU;qY$sK_@^$>Ehwsm#eCpncfTBe!D2GYU#LUcS zD1kBP>WXtVCr2Lw&t%C(-0#?oSI+**CU_#*jzHw9m#GoN4s-DG(#u!hOsztI5+sJ% zDg+cy(D{b?=ULe3YRa3N`qTc5%?O&7;K0v%0o%MO<+dn|)U{r;~ z0NPb+rWJKbtwUyPW`n!4WwqOrt6mbz#8pH?6Wl?J)OkHK5Z520ddfh6@lHJL|NJNB zN}xV-zy*HTXzha$+VvP&V~z>W_Y=ibMspn|#HqIaRgPJfbm3QOaA{`XA4lS-iwFqL z)Bepg`oj|kVes>VS^}@LkXc{C{k_w$Fs#b*zP;xs{eEPe%?p9&G4Z}FP3c05Js&ZO zVkZ$k4F%ODJPj332h(jRg)v&^Eh!N`Fvb||No|QMMV-#i&l?-(R(VI!tRtf^Ck zZb=+>qxV2@C%YJF%G5Hh8X=a_o3GH@7)yT8mBjw){>$gtdV3fl+;0(k!tr>vQyz7A zi~Y&Ly48N$_jqp`_BV69+$XqhefantM(G2A(3cl?f}f05x{<*HK|vIkm$s~`$xnat z!f(=-ng(lWxMq(1HeFbA$?-9GJo;V*Kl zxv7;oEjt^WeY%*BV$tOD;(CJzTzs%dwcB zkSG?z$Jd-aPf!yQ^kj+6v!gBnGK&}w8~s$27>QA*y5b$J!RbX)1bAmoG8!CmpM(FVJ zH!VGV9Qw@qMxLsn6v{4~$O@?o!SI9-4z2ir7x~nBI&)i%p{r)~OPb7+c?5;~opl7a zzRYn*W4|d<_X&WRM+h;(7i6#m-&R$TUaL4Z+B~Oo-QMQVlYHXaztlWpPDgk`#Qx&i z>)GRA14P5}vu22bmHCowZm?*rj9g|DC-O5})puDx^0Cgx5Rt?B@o8VrK_C5rdF`=) zyvH>Jko(Qz{g2+wo?O-UWxi+DyznL~wIS2U*DfLX@#Dw9$VmIj^d54*?jIa*ILTaz zD_Q=0uzT>L)N^tFp5_a!*_Cfg+XpxX2Yi^q=2m}yWpK*HaR(d;JnTuX@DF;ENHev_ zrpRu7IMgJkS2Eo@?gAmWMAvE_Og|Nl2j2oR78G3{+A}G zaqkycSAzp*7J0B zG6sc2ytN87`?{t>w%L5+T8AgmWt~;=q%D_ai0;QoEjT1#z9=;o4;j( zqGIbje0ljFiim}k`E#6~@al*Q+xk4A+hvUh1t_H6)zyiZ^(SFDI&vYzh%0VS?>O0? zbYY{v6BqK{xpT1A*{2K-8eUc+Z?qy~lR}~p5v-&%DQtK?BnZS0m$fjqR}?!tbJFm4 z0KiVyqTAqA=ZRFwd^0H6+Tw1v*D=hR@S;+dO5~ZK%_^FB; z`~)ncQOx_?i+j(iR3s6I$o6P~)ZG(I_e%~E#Pnc32k&W-nmYu?S#P@vg+Cz^Ps4@I zO>#01hBqQ83K*?(aP5Qo_KSKsGk4hgZKZU3WhwN99P9(qP`t_t2{GQmZ%I;cdb##! zX?|XefxuyR=j~I5>(teH-A!Gk*Ya7IWhjU%YTMe{T8E?c{BAh^{QOuqXHHA&&%iHc z6i-iKg--%?V!z%`Eu{rDS-Vs=OiU=`ZroXljEcGk;)VeRFE$%`HCzlwM9`2|Ii397 z=GM$x{!Qfb^LDCNRb76t#9|np`9?eBG3k8&OA{6JUH7Em0hEvJ13gAQ#c28nbwORD z%HrtfnZ@1WwLhHa3yJO#d3K4b396I9XNhbhB}*fSoFRL-ea!rFONnAUO||{?yBN-c z&aH&!L^@+{;KedL6BpdL_4Ig)ZvIa?94z?-nWEZ+d-Jj+ul`c;lwO^BpC1Ra{oSkCnyPgUwhq1e zRA6H|I;I{MqAaAup!$OwmYdFd*%1;{RL|$R7K)S3me=ApqG?*nKf+|UR%Ja=Ljm*) z8X}B}@0!HTC1Fv;wfhYP*lm)6kN-!Bl1!YES|%fo_c_6gM@8%eU?2h`k{W)mRdihL zW~O{q{~foEL-h!+DT$nf^sW(<%i;Sy?)9v$M2FXebah>ebZ_J1<0oN=1ag_P(J%?z z5G#xy`*@p&z1Ta|L(w%m%d0giBijy!xt0g_uR$$iF$4l3P2z?fz3aun8Zl_+{ieBy zcQ!oG^pd-hvmUyApV?)e3 zKl+ySbzdJNy+(%SHYQ@c;&jgQIo53|;adpK+GHWOy8+;afQ$V;#M}Z-9rUrEEu#aT zFeLYArdP_v>NGA?AN|z);en0#9Gi#P7C{=}edQUB8W=H?+OFJLno~x;{`2cI&oFWk zlD4+4c%|@&OP`E(<+(;bZ_S18THo62s0481;)qlZpvA2jbZu2g;KmpIb^Z8c?!lwO z=^5i;M+z9GcNS?Q>o2{0jNw~PLgR7K2T>4x&PfAbWF@f32K5X1wUS;VG|OF6#BIZS ziocmF#W8=7RlEo>e&D-vyrWvwlZc=5sy4nm;6 zciI??axSQxh=(a9{L%_pIzc5m1LB1*bs8mQZ=tq^Q9i;VWbPtH$fR#N_B|{q+2Map zLlQ~(?nC)xUm?@#&};wbjOMG_$sAt8vrS!s+ms>^^;^RC51x{bKtu9W?_KAi%T|Ux zr29On^O7IaqpqM>nH@$+7ATjfD$P2}Q>l3(*;OBQ)iP$-&p4Uq)o!|K1h`3yv%yN)~ z-bK?;n~UokyWyaM$<-+uVmpZsKceiV+`H&l(buolp8cv5I6XQ;z0G6AplJ1YR3R5B z^B@;;B8ME)C(F_7h^mdkZ{P4CLeuXf#$exkV{>qf^zw4blN!6kxhKfw~U zbGY#aQRTKW)`V7jwH$DIkfi0=1=?W(_gk^14}$l;^-~ECz4RbCp$0nV3K+M&=fuqBh`l6rS-24RA?ehM3k4tBDNE_ z6gPzv4Q*_gj59~Xs|-b3+GgfEzae|b6Xd+}@_7aF+JT?oI(o;e=GBFV@7%8c!H$C- z&1C$|?2c>Tq0RHl1SUa2GCteCt$+6Jxk4bjC6JA|K{v2h)AgrPzP{2>%&eS$MldCB zp)Il{dVW(nBKg|;HAQ`OZ-Co$!A^7+@2W09?EP(#DfBY(m+2B`!*HVlv#U^RlNg*} z?P>jX=TF$-qyIK`O2qmR?~P(9&X7N{dFiPNt@OI!O*a-1qn1HV=R#Nz&5BIDgDf-l%@YTjc1qn@_DgL?WYHo5hVSTJlzIX!YzF)67V zYv*}E9X0%=qm$}@*T^PyGNzVTcE8qv$=~?`CNvK@rAFul2C`jnpx-InmvnHKx?$F< z#SlAr?EeI6=PZnNc2vAiyXI89fJ#$4m$c!mLV%+WuvR zAdJ9`UG0%n(Iz7LiyV+@5PNx(1MQjKeZzoWyv1q#wu>Ip?s$yrE1EUdgjOfA95WAT zaW6TqfiX!ca`ROJk0Ym2s)%ym$k$iWgN&D=W(!?N*aF&V1};T_6zn%W(0Pvw9<$zj zQ?-I4U`OzYv-wUpFiJLN=jaO5M%SVPRDf8PK%q zI=W})FO1U;qrgnHSFA!Kf@^~+T7;2cf}=U>!dv|52i-Tm#h&dViA%HickrC18GLV( z$7(HAc7&d%E7i)u$I(|G84~v+PHVH?^D5$2w3%$#<7YoPpm_xWL41kHPn}pHPRrdS zHOc#T47cheVETz1szN%6z~{qH;Xw&c%jlr1m7Ry@8Hv8r{>`wvf|9FMoO9aM?u_6H zqT4$Kv0lDb1xkF8PQ0543==f8QwC=dwWHr0F>}@OngsMoOffo=vGmtABEbsz!MHoF zC;nrQ#*lPy>e@`kgBgxDOsD&sInR62f&ign(f*-gCU^#LQOdhov4O@663$90=tZ)f zW^0PalRxt0HNWxP+=0mEX3P2AsLzTpqyWea=-Bq_l1>H0@5`43t7m-C@No7Q~d+Z45oZW^L0Y% zCEytZF4ZK;DEEKU7x8$1nL2AV|3|jxJRdfb$Xbnok%|BT5{RH+XwO zS<$iTCXhWGN%~F5bhsC%#QqqUED*X8_Rrq7JxL<(>9bCe8|~o`5@`279#)iIE&hbUGWU{zrcCO5rgrSg}JaStAVw3 znD*^M6@2=vEP5D4l)P5mJ@yaA#p!=J2zQRk*FG18yO|Fye3`4=vbX zoJHPehr(c9?D=>MyXtZCje}{O_TYmn<(sMPuY+$bGpSj3aG5lDl!wq8(lIXY(sUO7 zeLPC#MAC3o8}Zxz`g_3@j#sl-j5{I8x@tM!lLe`Khi$57Cf?yX^mKMUUe&XmtZ5F@ zax?Pnie-|!)d_8;(as08;{)#^%Ma@l6!+34vH zr%IPAytRZZx3t?jBh0dkt}OI6?*W+Y=@bAsGbmL4DM@5`%D1Zku^d@7Et`Eq}sE3m_hdk!JqheQCI;g2Uo|PT$)v5 z(w3){-xFi*;eIhLZ>Ndt&`=+DhQ5wQAciooeS(e!vqjiUUJcDQL+7{QXw` zo`x3XW-GKC0S7uuow$+q!AGZxDm405%<{;$w`vBw0TzV_<-;a@dv|ZPHvNwgvM2`4 zZ3Uc?P9HWJGNjWI_$`SBua}B$hr&q!th8qTQ=Pc`XP=?{Hg2SO2uN<#ic0M4p`Q2$ z<ze^mocRzd zH}`9pKg~8Zg@vrWUsQ}q0U6R^JtlV;h_!iBTKZ6sL~+WQW5z)!HwfAv4*Oke_+*AX zYt-H6HvgWz{3`+Tse#V^&Hswt!{1aUj%|cawPX0eBU$xux?*EA^zWP72n2++2Lfur z9U*#ddi~ggmSsOF{PxB;E)Mz8CZy^WmCa{fLT_R5Ym5+vXooqBHJ_qBl_QZG7ahDVQp zn>LT&-jx*2+RrFelRWTCds2ANAT5ce8@tYH?{+9r(f#gQn>Yf#qVCSdiY=xlCI%@> zoa!D{8V@Dc)C*hotNakNS>XyI>%=crhi9hE{2otcTrbVrFQ`UI13@Ct|d zM+Lkr*WiwF8yz^B@Ah17Id34v;p4bIn8XiJI}SLV4=3pMSN{4rdjgajhu#2Nl;~lC z1U>OP@q3%1$2T#Fi+sf1N8nuhLwWq%&`*E!PK3gAAyc3Ls8PeFa z(JFwdm-Ly_CR%$C;srzMa~i-8FSFI~wldO7jMP$&3mh^-wzcaJFwuN4hKM4Fi$U8V zDT65&ssjBIPcNqP^bbARUFa9q*K>__#Bn%-nFtmklS*}aDuK`NZm}~lBtFvcQQ8PC z-Nd1aUhsQ6;ZSdMa*gv5D}0?w2cc`hKK+r1{c65W{~Da5aDs5VSo*qAa>31UDAXfw zrY=#XHPg3~tNo@Q+0w6_LckGxn_B7A4>io5L}5arh2GAR2g*(Cj(yjlq*isaQ3-}8 z{@SadwX9YMenJC>m#=E}9{o5mYl0u;-wDkb2Zt|bU+F>@kp;A6%@%G60*ZiEzTq@~ z>iWoHuZ+lIpzzu45}`8ZjX}I$*-F&nZ=uOrAFWFL{wq=UhN}+B8K7OC zp&>!S++u}6)}!xHIGdqiML*fQ`)6yi41eu>@*+^{gv;pIz{!3M@#0h0z|WtLKZ^M@ zH0bhs?P4LOq0fd}v)IPU?PEWQ`~xnHQ+LPrfsLjh*rhWeK@*OCv6d&Cu|x zdf-ESm6^F}Qiyk>Iq+xZwycJx3ACya>w70s+uG#_z*awJWT3*Bbo7j4Tc?;D`c%%= zNQK>;*Z`FOXaTGqv_81s1eGD{=sCy7G1-&M|CCDPgOGONv%b|sNM$vsMA#~ji-p9B z>vXMvkX*aEGUPhk`XkpS0;h}CEJy#zH%(8Wk@JHi)Hv!cpv-y_c?e^f7TjI?0bYcZ z(V4QrPy79$@%c?Zo2wt4ZAXRf#M2wAP>;|X#hJqohFe;2`G@k~-l3BNm~VFd1UFx6 z?Iv|a?dT619ANUALZlf8jNsBJm2w3DSX->NVCu0Rt4a3w?hLbHQvGpujBbp6$gelI zw7z6{Np2@%nt1nExa6?UzV=?XaKUn+>RBC$XX)N+cq4Eubb7GDNJk(<;gPa`fk5Ka z3aJ7qqlqgkr2O`)SiH7>8fB|bfOpBMv;F&V!D6VGk`YHaRk%I9m06aGpwfoVilyVp zFMI#;M{hRoxD{QOS*n0N3doOv{IpW0-siGMO4B>8nw18(K?;mX?IPs5)F-SyRboDM zPbIqx!2k2nsC@oP*AcpawVkg*oSdA+PJix}_5-DGqN4oW$@wiL@&Q!@lHewxep6^H zrN`9RrU!5Q`Y!rEq21XI+qs__WY)X-fk2a%(pSQ64j3s#GZE!EV7_xlgeferpRcKq z;*(~yB~pnXA9s`uW1+`0V=d5SzWU~mkMhZb9YCGo`vrjMtGlrpxvf?1FR3v=Q%dLV zF6;6jaF}^`H>Ax&WYMk1pw`2Cms{bF zJ}WQK=F3AR6uhSekFV-#5%VHbpHZb{6W}Eptj^o#)BVK8#^!K1#>Ju>jVDZn*L$B* zi`!-pcWs#E0saHT)7ELz;efLnENXk8=A3QU}k?J{M-5f`Gw0bZ(g^6wy}Ery@H zv9!TzjD3Eo^~;yOYRp6>Lg>QYjRhK<^f~%{UTz8$SHyTS^LLTbP41Fh!juP~zou;T9CxvF0CrWhF0L zjTlj$UYzzN^x~#W)Lq0gc~^)5v^`pE&m578PTwxH)GrQq8GUJ*taJ+Q+c2k=3D{$tF3FnR&PU?O1#sVB=F9m9Rmp3ooIo@5DP zasFEs!{bz1S|PQj4yIf=UF8T-sBsB6;m}-q_U?x8xfd)!T`D4U;as&e;W~TJ6El&HAVNu7k{k}U#%YKVpQcik-k=3zwgXY zX!D_c5W^?)Zm(@2cLLsDz?f3m)AT2s zNBywAkk_3~6Y1aCgg8dmy+aD-6u9%Fbc_@V-9YUNbDGub4w7%dL1G%7;c-z;&BeuB z@2wRwyQ?QoIjkPHJXJv)LGi~AexgZ0B0TE0aEg1si_T68&3<3S7hRg_#wRC-v%Yon z^aL=2MOP@^)ch_fX_M!&7>hpB##;@F*PFL#nw|qa*g1E)R zgBTybyHp~MEfI&7_An4fr*@6$>&{n}KHcMJ(>zvPAsnE2scmxMqd*@2Tbqc?@{a;` zmVTCl|3kt-AZPE7;i>io`hC0CuRpjI!Zyh#-rm^>iBC%va7&t47#uINX%&cX&u(4^Xy$Jgl`E{YJ0wweXEkvPs&QskjsZ0R zv>LndYsuX9+<9TOo=18!7iJ2n_xCE{Jq2L*?qw0dBM`WnYgeAQV79evYsD0vcNfXg zZdI4_$+rQnpWP$D8plA0GV(y**cejm^1}eGG+H_g=O^-`!-uud#RBGkzA?r#p2*~R=hS#a zGmY=LMvJ>Oi))w>2ULp9u+OS*>IL}?!Y=*UtFLdExpk(9yWD^%4JLl;&SjC3u%Ef% zvQQA32QKcqCh}XcjW=CAyd>z@tL?fao^bD;sqzy4;NakQ|C0(iAB=}^xH|Zym8-E#I-j)*eYSb2%ZxX3Y|KGb3Dk}MoiWPaP1yMT z|FQ8oI61W!(VZspv$SP3+IowqEcz0a4le|+BQr{na8*4CYTeBC@;J8M4jX;+@Yd&@ zXBehph8ANZpP!XVFD8(s$A_RMhsxi%Gka^`2ONj>qwZZbB@`o4XU?CyE<<)OM%>C0 z3}{E$cW6Yv!a{rU1h253B+3gqPu4G15|ll4$;D3r+9H&A?a+WJry$qP_8T_|2Ib2ts-XoWRg z24wu*X=5qx-|q#CC5PUr?1DLk&PhYJRn(OGFeDIZp2P+Sc3_%75S_w|8z8)NrW99U zehf;0mA>e8)nW`RbkRo>ppHZPskuHleG_toW66tQzE8&9vRIvKXa4`#wgJd(TOISJ zd0&Z}8i{}6tbf~yWCGVU+zs;AjI8e!qoLygu|&j1gi1Ni%SplFF_P5?8^6m$A@A5J zyFHQ3Amhhl5Zu#+^Yn`&YrKn)JRd**?x|CH-c6b2rdgC+S0tCzUPb_6WMuU1*^p+E zZ%(j{dEIX|tzxdTR@b&b^|)^I^L$!$bkOeL~% z*t7s@+j8J%df9peLQ~V4_c(!jD9aWo5o42DT4RFJjTYQKXE52WGsX@EY8bvF&%k6H zT!HopI*^iO_E+_@ZZ`=^a9Ks60@DoaX3vXLPD4vmcVTK_6O11ARE9V9%G03XXi`!DBao(ZK)jL7ksLAuLNad&48 z?N@z$ecF;YxKwI3FLxK2n+;dq&&Rs4*bLT_uP>6y-z|@MMHHI$5x1?5!%hOGGF{d8 zH)9jC)MfXPGn)4`>ad7`A^m3HRC($ASJ$GE=~Ma5V~zQl3lWr5#fo-?4yQZs@aQH1 zchRo4GS2QwJSb_}-)I1mS&oQJXD7!4c1~BawZy)w0+TMthhm z;>Y;mL`YIs#631)wwN=S)q23u$!Qs@7G*Pnu$7F0!o=^lbvaF~)4lKv5vjF0*k!p- z(mwFu0$@S>%T+xZS~wAG4~fILh5^gr^17)AlwSetl%XLmvHt^D!ICM0f!3){t%ASY zogBSsD4DrXyW}dz_&SbVvAUvSpLs$--uTHLOEPUY9x*%HH zA_Iz*l!*y}m}iiwGB{=gokTJtVt)4pVOmM@)8W%c$*p{}2g*W#!FQ$ZSh~q*$)7}l z&&dJL!eai6vb>!2p)9{ho9z2}$@qA1LelSOV8`4dzWoNib88zTE#2;&nTCkw$(mqM z-m6!g`_>%oS)Oi4VrZxSp$0W9^(0gj*^cCsMgtNJYnvr389zO4b%598F0S}Go4i@K z?nTEuy+wS1GRR87Nw-ZnGDw%TU)4N#3EFCg}WU2jBGrrBc{=G`BzwQb_; zC$)P91-zFhN6Q?qj|irl3~miM$z-W|@cEe_^CZkwf{u>_sK~Bj{$x(WycVRV?O)Q9 z#9?X^>rNhFtW+y2>ti&X@sEo^U4u68*3<03+q+AjI`@+Ry@KBX$%neXaxGfSTM`Ck zFoEbC?I2HHLitHp$>yx*6rP}=S+g0>A>Q2@0;C6^yY<*~+^vcMAj@n*DtSzPO(nGl zm9+9@j?M!{dDTzZClWx54I$~3m_@0h{uu#z z=720uo2;(HyL5B|9xv6^k?N5m9>5pl}zo$&kP#b_ZAAU+LjyM zGN~7^7^Y&gc=yYP;;F<|K?m~rS)6BXxbgy&(wS0y6j*581`xZay|AC4KGInJ`esDO8~6@Ic#rP- zDN=^^{7=hN?}MZv@%*l<3?G-g7=L{o5ZzSgud8~`(f0wR6gmCsPs5w1m1(1dLP4n) zCAc9us4VVQFQiE8uSmx?qT1SaA2%l+tD0v$1`%Bxy9UDotIbo%lGVG$!otGHFz9)@Ino*4Vkjt+}0!Hu%#A7{GMM1NXGMT7OLm4v!}1w zi&`wd1L?HTXjFq<6+`r9kvZCU56kZaIQ(KcERozKJ5~mlu2q1X%C0;5@WqQ;aJAts zRqOPg3*Yt>Gd$8fD8e4%pro~ooy`_TKB zzr7jl)dZH2-GxrvZl6*Pf0ekMSlF1ex^!7G?X5AAIu9Lfiwo7n0C773jf-bxUuPlz zyz;41u)=K(bjlQkL?Gx^Z;ticZ?xVO0rt+07uL^y)g?wXoQS*-Ku%qW@iBcx#aOKG zy1mMX-oO3TVq&4eaSS-YiA)4kTU+7`S`Sx&Ir%s|I6;vcLmi(N+B43N3_h#tg%)pC zI^{iHm&Q~ozvjgLhsd=&EyGzsNwqk;KrMdWTtg{|FQ>}hHaE@m#ix2Ml!x+xu76$f z6?;89xs}cWgu(qot*(=_lej*lt6Ob4KJ!JO;6xwCql;sG8)X?YUTX)9%cf$~6y=n~ z>pF0$eE3+#yPlY&Bb+n(dbe0ncTqL>xvqv-XV!mb%MmFIE;QXE+)XiU-g&8|F7hxC z=EmK_>pC4UTt$I%{gY|~1)KJ>$gY8Z&WszI<(TqVbSYGzY=q)+mjuG-JDyo+ki344 zS>)xEkfVOx!EL1W_&OS$1Kjer2DEXHT~?qyw;#BD-_u{94B5IEhEA(8m|MgoMn}=1OImJ^}!<91vS3Vg9q~?n@w_LfYN<@i*9&DkLQ>Lu{A{MO=4$Ids0q1YsudPDwRJRU6|cnH2m*Iw zEbJ5QEnP*ZzfLiEMYG;Ai~carx1*;za+f;|5K6#A6lBIQ?X82dUNT$8G;?6|z^N--YcNhNRrst0fPrMQ@V zWvMz!{??0rWPEM#vlVk(iGT^lLgL~k%xOFO`z^eb=tC0m%FHIu#rKTa32lPg`ug_M z9kQ@&7C`JkF&!~}uWS8hFrT>h<*!wDi-zFfa8(L}kpe7}O5w+mZH*VQJFLP1P8&=4 z6@Yx80OPo;9$Ao2P(<+AWFvn_Z?C@}0Xhn6hB&*(lYb+65N%2XG&Yf2;AAo(7?|^j zPR;0_{(50!{=Sd0K{Y>m!<^H{bJRLZJ_U?Lm|XHlf_x0w8)mw@qd_Tk{B!=Rv9 zE_kC8w+X3IftS1S}a^xZ#(2PKGgmle54Wfm3)RSGK` znt6K7NBesBtQi5aFxq#&`%2x=f+{)KSiNl|mrqAc4CYENg;_3bOAPWG&pjp79yj0c zf;7bD`+%r?{$aot>>ORq+FAY~|8@!uz|#5P`==Mbxbv~LcexiAY2~{U?lDhp&$8D{H+f&Q@1=6+)P%4{ z&)gl}+-K;Re7%dQu;_lo6>P1m9jmq8C=+%bI{>mX5=VQC-o49%acsa7pBNv@p*hJC z_jWIbWoYCZPCQKDwK%@Kc-LIYtx+mK{N2-MXDe;*iUwGSN2%2vm`VWm(t8mh_FiKl zICL9HWN|l{Xtwy~*Yp#r+p}|Xt$CfmZ4qc7Sv$$AEW={A{(V&`e82OV;Z zms(Zm(nq8h|IA@ywfF>uwd@jp7xJc06d3PkG&bh$bj}bHU3%<^u>Ss$&F;c8u1yPg zyybldy$oG2R94s?t~E}Vn}<9Eg@l_8P(6&l8m!MBIv)OB_bNRI$zA{(T&xxvA;-}D zyDz?^dU}6S5wp$Gk9t=TgmKbLo~hF5KGQOd&U))4w_xdyT&Uo_f0xha=_13~Bx@RR zw@3M;!!Uf6`$|s9?o<9u-=N8@XM%?BQ-%`czKeJriWt6j(9dm+8M3fgo~!5&p?acx zfd$uEXSa!m9lwBpaaA@RHJj~z6AOL>i~o2(wW#wm<1t{pP>H(*is&jQ;KiepZiX|Y zk<*s}NGNS>EwWn*aB$ZqKZQV%Z1q*+k;)&hMz1RahDmgDgU_a>i#ml=FeH|*&S>f+ zq^X1Ptky#eL}uo|UAdgK$`^y7*4q=e88jjifupbh!kr1Zcr_p{TfBe$2A5icOl)bu zii0lUJA=`z!gfk} zx*xRZ`HRtuHo4DV>Of~UcbL}HCH8ZRqu)+LtS%P-IkPi3xpyA>9SZ{Z;Bj<&Xx01i zV_dT{DQhZfQMGeJns;K1)hjWm&z1vNDKsj(W0pDs*5+Dw96h!#rE;1V<|;^+(|;Zc zNrb8-w(NBy`IF%^vrR8Z^0)2h`_~%qHe0vF4;vSdLd(y;`21L>gY>)3+PWe`q$bIwPAJGRl%=pTb zz`z@+d3lccYGzP5N*8O{WU2&J{0@GcWM91a_Qc_Nl+DrrTK%CKJ zp&As-dz>LPlxLRo`>iBhJcq9GAuOo5Z#%)ya__c0Vr8FwgtYv+GzuBeP=(l8#`1_*p%fpMG$r@@0X0O(Z2?HWXz3^pxJI&(weecaX6 zaqneKx}3YAR;=4pS1rmepa;IkFoj|HEJzn%&%Mihb4JLU0*ub4n?qiVw43rrtFOmt zijZ@|fCb6i9aT6~lB+K5TiV+gkwgFT?U8&@SCRCooi#PGMW+M{i? z*D+^6BLHBuP%fV9(^8X$@cA5UDAY$Fe9wX~)woM!=~2he&!`tR*$lNCKdv_Vs()cC1TS$UvWG zd|z08K*6i&Qw~yQBufT(b-VwRrGoMFYaA-RXO`Y18V}@C>@d_R2>-& zOLguJ+l|U%0FG2acewtUoWb77BT(C-A|Ar*1$$+HejZHbxPBI90bpDhHuJ^i9x|0W zHC69S8rB3nSzdV20e>PZ9g1gb!|rrEmLGSYZS?AZHudF#G`BA`Lh9WUJNtpb?7eOc;Q#g} zF0(F=3-a^FFrNS351Z@WndoPXV=Hgy?%&sI-*df$p?{IV`a4k%0n*cWHjU`vC;DJL z#BAotK>*w=82hSHWB@AvaO?P0+Q6f7@s~>~FbBY zcY9V|PiJRA5WD9MX;;+RpD&R+ZVjP>IaxC(k+1TPX#V?-&pB4hDkW68#belxef`hs zv@KaG)otj;-`k*gbCggv-2ogRQQU=T*XRf+VDOD3VPD!gI{LCOqq|&w86Y?jv{u0b z4Fs{AI|Yx(6u@vFygCe!)VehxVadq!@E^%!E@tr3B1r$=0+2T=6k zz)Qc@sXyW|x@8%Xg*cJIxYCW;M#3%uAjdGt~L=-HpJm%|0Oo`gfm zs_mr?x55FX5GstfeD$jeZhg#K92Cz~qc+V`qE4|b@rOqU`Vwp}besXjjNg1hqp!i) zix8=V1GL=ksN`%(1f=l&x0gdq1p*44WuqaT^m~U3|9T?)q9A06bwGoDA4$`S7Dqxl za6-WxArPcDJ7J+aOO}bTzIH!+#lT5K?L?gPF5nVkjCminedmEvgjV%(;?5m@!h5f# zj5+UF0|rzu^GsLw`$Tv2QUzQq$T=5N7{!OT2ACo~mjpnRdinPX@h!G%5h(lquETg< z^cPgENZP+8Hx{L+sA$o_v$v|IOfiCNpjc0$;Q;oBo#n`NASgwXYpGVnRNhQ5_fveJ z3C=KOEw|=)@U`H@ zZ1^T)y|vC$ux3MnUIXC^b?oX;gSfk+ixfD#-CACn8x(({J@B!ey0lk?rE>+I z_R2u;`q5;|O<#T)o7%jm-uE^{tP&U*tHTxS{izKYv`5#<8?Oaszs|k^!WUxXff%5e zphI&9m`Qp@UK+rwM_z6~OT&9u>~+t0k0UWT+1J*rwVX4_^tuzd_$!8DgC?2F3?R7I z64?j1o_XP4277*Mw;nLh1n5!dvk8({w6ycx%n-m|@Tib(@~cCg(!!5I64Q{Q>1Ml= ze_&p~YXw;(b&8-ZdgP?H)7lU^NQrRaZy}LzF~cW4^7qG$Bw|_bi_-u^dp7~p1q(W3 z*iby>-FhnXZ!Kr{38&~O1tq2FQ0rikDV)PQAW^FSWk--*J2z4%O5)ycar^9SMhf}L z9=M>FF;Rlh0nKMtBU;riP{z#xG*>}R8( zGXp&w09#WU1B&L}-HLz->L>~Y8$Z6QqpQ>WJS{=ts91Xt>+I;2IVZO}Y@0DCxS*07 zASi)vg)vr7jf;b)jV9B9YXdTb3|Hc~0AT*_0Ep#v?NxkDhLAUr)z#+Y5dgzF9~N%H zq!8F^8r^3Dpx7Fb-T+leY1Lri;mbGvv6; z%)PKk(CJ+DQX{sV6R&t(<8{lohcvp^E`rF2J2}zeBr$dPhCA|+4feIKve+lX0Ub^C zR36KP7x5S?PwlZDr-{7-J}dOxU!{HdtUD2L3qLI``0n0)JMfHKvmu$cCq^R=Bsv`n z0n|n7APx;Vz>bbNLe4}|Mv7nNbO2T7a0}NchZ!Cis8?j>My5HUY+*D-C00t9qnMz! zZcy+|Q)>yZ^Ag z0IrZxTX}%lRezetShXoP3{*H6_okPcG;=XpJ0?T^Ucq3Uc6Cm5W85QBLpE{KQ^M5D zEa>*6;9P{kG*O`Lc0<-T5!3=jfRTi}&A8!_#Z$I}!tm_ydUJPy{}j)|K{z8Y;f%0) zAlMYk`ji5UzD#bf4@$W`&>&j>L=Vfcjez*R@cj?ZUH-&9%~d8J*wbURT7HL=lL2W$ zrvtdA@j>NIg(M1-<{)Em=3QG@c)?DKg9v8C~?SAp|6RW;) zT)rn^y=^nyh+gyRs*T`eVp2=?8xzfr>rja@m~)2#t+YHGGy#(BlS;-`@EA9y%H$O~ z^{3_wJV~xoJAfNNxCwWGsq9z9I4P&3-@IwdtOC$LL4_0!CI0KVAH4Bl_nh{G;y+Z< zk_mnk?`dfiQdauD())*S5V(|K+Zr%I2Zonv)lb+ur4BB)kjx)?L%{Xc8X`F=1s)^W zq*ggG0qGUSFFFm%nn$YnfM&*g=6#706fr>Q;{cmFWpR-1&FOcb4~_8ddckoc*DaqH zzWJl($&;!r)mR{Z`1$#vtS4UD9z>D-S0ff=>2cz90{sPo2bg$8`VB-dHZr^IbBCAp z!wWa@u7vXflMmdSp6buZC1{V#o4$aJ74exfI?Oi4V~}7UuT!^BkwKmIijT(8)q2nI z)$IqBZ9p|tX&ZU8A^`7U^B+QVl^kF&=>SuG6y+$iIj)W2qNI3f$LJwGIRi(E3Tq-$rF0bZZSdK92&C!};V$gW_s_D| zX=>!}PZLJC(e9yQ8 z-|Sauky`1%xnDTwdb7&V@+J?Y&tPMa4LbMtcT1TApsoaWnd<{?{5k0jiLXrq?*JGX z@2m2}@X#!}z-dScl=?S*o3 za?Vus5;EH4?6Rq`m0M-YQluzIkEA`pdJlLS)jO@mPp*w7+5wpS*PUQzK+%ybFC$NKzfYYj7X%wzh#*rZS)SHKo zPa1y7u_{x-byGB6C==Sl$iwv~?{(`>)PB(yfG18j`n3x5F;rtUH#aBQNm}gE&~Mzh zq0Qq%0*>~9NkBdXk->}U0<@`jxUInRv)es?4YWSJ&mIcR8k3yuV8`S9YBuPD*Cdbk z6vn~oN+9wuJ+H-wQ#ect-KDzHROI8QFVjbKa5d& zKUG{YSEUl}W)N4s-v9vd2JqT*n%(+S-UIEk$9nM*4h>F;IrfLb6w;>5)XOaRQrKE8 zMM*Ks-o2w!Ihc_3@u9RaUzeLf)#M(ZXdm)3pGPmRV2mk{bobLXPSf8) z@ErQ^3msQ4{EqJwA7P~nJ3M`^zr8(hn`i#E1{^uUD-5eTR|Kq;+UBo4(3yFa^vk|f z_Q#Bko%(#X)`z(cOqlL!uWvp%1jZesi#g<%U(;FkSU+qa_%pYqpOCw#sxde`-1dug zvGi4+{aBCdyKle~1RmDTvz7burrDcf?8dem==yF3o34E7P=^OLV9$og-c3D00x zH%YMiO%8(P8+~2)5)1@%y2scw1oomaLK+F8@|r||Z=(|sif5_+f%s_Ebb-MG!}-ah zZ8^E)AdtQoo2cCoD41kTC1RKJzEo;izh?{fhN0bYMaEXTIyT#nB#m)FS4i92lLndG0-+fFA5#K*X?kt##FmNf;0nyY{vR|Z zLD4Y`W*+8`iIx+9*f?vNyfs0 z$=Zf3TP-K}(Xj`Zpc#jhKt|P}F*4vK{Vufa@9u5~f>BWLCBk9f9_b5X zzuZk?6fE%WWJa<9SktQnuC;c9s$m4 zFt{vbu}$Buzkr1RGTPlgPx(S|ZWF5m3RufVq} zwKWBR9Hg^IPlCF7(Tjir4Qp%xaWS7u{{cfa)nYxJSOEdnAH2#SwWu9){fK!T==Bs$ z9z!ca5>IQrMsw13KglsjN-oGUFnM2(=#T=*H~0;cbk}N4B9ZY??s=a*FZBO@^$l{( z+uElIX;$<3QI}kIbaaHHhK7j;4%${RcAw<5aygIAv;`Wq za2?J}>$_~~YnHj_>&vJnR2g%BGQ!4q3!@|R-pK2yNkls*X^T+|F-sPFb<1fkTgt4@ zf2Z0x_hSY~`pwPVG8?!=b9T;GOqF|SD1zldf3BbBe6#CuJNcqZ+{oD27_F_ry`{c& zi><70$l#8>mBGYauBzU@X9@}{y-6x#*^xlGXZ>3gto|1_vUI69_;hcO)%f}I5YLmn zx&7Y*b`B1M_gl&sd(s||+W+p4Tl+mZKA!brke=lw%0*7(q)QZ|gT>N7#=Wl1%d_pq zog=(D2goVYu(&N2E#QSwYNOACg?Ps0gu7;TDr?*6Tei;MgI_k&u# zbm!(*yZ)qW;^#)>UaDSX`D5*QTk)k)t0F5z!JGD(IJ^Jq#`^i*?LAO z7pK5T!l}bJ72ieGd!Icw=Y4SSqp!FIu7sB)h*BY=`2OXGPuIV{k!_w8uu_jZsCv(0 zQ)j{+;0x0khhB#d>u&5M;d8v|pSpGkW>u6kfl6JyyDVuSmZMtuEEU zWI8#=?)6~$U3?06JmB&XzaqW6FGGQkAC)Nl0D*+~!`3u-JaRMo8G@%h@D_kg+HAv0 zSTqz;>B(^mKdGl|F^^~3hk9v`g~N~!FOFU7$CqiCSeBYByU#ltW6P^CDJaG&FuEVz z_J_9(1%V9oOBvzp)nfxUlYf3>9dzBbG9ge+E?XWI-(}h0MHu}}Rwff2L3g>jz=J9i zK@eYi^JWA3_O7>({Xy+cJ%|{Rt&^rJ=gtEZC8N0!8&eI2dq>CHGc`$PY#K`L)ok<% zKCfmQLqIUG0G@)VT@IcT^K2!CpVb=b~lKUak9WfarIy6-6-g%8lh) z*=~rF1&x->KFn7~mD8s7I_qyh1`Ds&i3_|m+S@C505W6frqB_{c(gCh+Yum%UTEov zXcjD)eQWxsTp&^4!Nb}T$rHYv9lLvOZk+nh#7KgIdg+*$NWjJyUo(wd#F`@>BbEyvToW+GqMd85-iaz!cWe|^L@zJ6p#Pq0hP zk8^e5Vkmbg>aj)t55HJQyMZtI*zSOga(H}uBDpd(zSwm)D{GQbktE?<^wm@?8sd{) z9qRL^OsDANEve#6f8fDZZq{WzRL(TA_S>Qs-xK@YwKoXFlXS6`AM-N^g77}LtFXGX z*j^QL?NC3MS~6G09@;B=C~b!8>|Cu~Zzovqj(clsveJ!R&}Ihf;gM^#Rzxw2VY(M} zR;)d@Hi9qd&5tH_-Q3tD#ecnQY3W$+aizn*DbYjB7e1)0t?Y}t^G};OGV1KjqAHD~ z&7fsCMCN=NfEO?X3%sX(+P7BtYV3z0kMn^F*sP`$1X)VPb0n#jdFq(;MWcbv=TVAg zUliRN$5GAJwl=zhrn4QErSK8)ds2;_dV8s>9`=V*XsJSOj~p|UR(yxqNt^rn1cpnj zOidwflkJXTJjW-UZ16-_yMg{LG>{}g?UOc~PCE50&?fngjS0NuN7#04(-+9gWe-~b$&Rh zjP76iiatwvrv3^C5}z6GSQmXZHaACOXJ<#;x*UC{p;RQ9zujKIXtKB%r@|H&q|rLx z74mjmMS;Y5@Jtzw64xCb9G~05fgVTHv>Y3l*4EaM>>{GrEiEm# z14O4(i>)mkNcsEZdOA??ql8;KIu_T4*M%Tuytz4jt}7<5GnSQbZ|Sv66g{;aEG1&L zSefvR$17ZH|2lHv-#MmqM+T^fy}J9&BTU!e9Wk=$lQ#U%hxT7TsfcD99Gzgvx$|HD z@;^U+!!wu=^gn!bqVoRlfB3(j%l|%-|ND8spZ@oe{O=?A&nNKzbupOpxS#|D4MoqT z&>@51MM8)kU7ox3=~KbU#dqfr`#*o`KR)RkOI%fyjzv8?LN~ek{t)5&?%e}WM*Bn7 zZepFfv~(ACBe_4gFwjP%utV5AocxD6ZIBaLC$%z{8bv`s7b zg-3Foy5+#-H9rhoT!|?90F^>br`j*)MqBhb9$@y|3?8tNcfJw=;Vg7-x%*px|HxDu zeRL}nM7K&`2-`1p;vV^@>q&;Ud8&m$0_xxPeO@298H4h^c98TBF9MB*nP7 z;lfcekpo@vGVg{7GQk5<{)Aw7Ni2Sn_z^Q+=!-4yfXYzsHeKpEZ>_ECp!%FXtMb)I zYCx^$2^#`_EbjU!mkbmIeR^!sL*Rc5QMX}x%L>`ghPykH1w!gVq%D2_V#%v9H^=AmIT8(H88MrQWq*!KHEPyg6}`>XIGf z43B}~uli>-d{A`?IOGonLKQdPru2-EV- zHWlQL4`#73ZKCx8GhbX>>ieh&sPS5>KU0Dc;fwfkP-0Mkp#Rn@trAT%x4qir91hl; zMjDiV`i6B;3JQwUnQ=VH5R*+goDP_T!aE{J6CuSNot%&zBqNfmx?^qIcWaDh5SUQ?s=CabhedV@$<=REqbmd>XkI;&zXBSSb*Z z?CAVGUC0udo{bHQoZmuew1PMt@-@U7FOdOgTzd8X;F8?Z7bbr+0bjMSHLbGLy=?s> zu851PPPOs{KGg$fEW;&x�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

aqj( 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

MO@DJ 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%0DJe6e~ri(hHiORo+8e$t9mMhHpbGKH| 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 literal 349976 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 }xd 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ä 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 SHZ&=l;(XBk0PXuTSN;tnrO4(0 diff --git a/x-pack/test/reporting/functional/reports/baseline/dashboard_print.pdf b/x-pack/test/reporting/functional/reports/baseline/dashboard_print.pdf deleted file mode 100644 index bf2bca54ca2d77f545192b3f89dfe7063863ea36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359189 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�{y6X3l5rp(aVCorq_w4F9Z~uSU>4RqdphsB^_2L-K%PnxZ*JbWTxzyOGkEZT zMp=tLgj`AN`+A#xs7nVg1^qL~g16Yc*)!eqQj#i;c|pFZyK0ygbegyJwwlbr${h}P zNcdaKfr(%S47X!nmBqUOB*gAk#L{_>)jXz_{9WbFz}C&)qNB z>(fp*`ruq!ZTS?iE>ZXErz$NX|6RcfTs(Cq~G0N2bEiiq*naSJbCR04xt_ zX-tltQ*%paW3)6XibwrFm$*0rKYz1lE;qS3-&vdV|D$J2m$Mwzo&($ShNhC74OP** z|Fe8xM5(97trLHWU zk7Rt#B>zX&<&Ui;sB~_jZk6Yyz7zd3d90)G+`44AeeaY32 z9!*_l{;ZQKK6S+=WYT}t^#b(wphuJ-g|?c&K33TM4W7n(<)O_A6VTB+xZ%L6w!;tNNdxj~vhpB|ex_DQE3X=xhsq${r*-wbDWX=xZP z6ndfPNFi`@{BuF@nlUmpIMOO)%-6I@c_E2W_e3uHLrt7o#M&Q`IlD|%LkSqQ~+jju0kr36}5_Fc+(2~_^lN@-f~YY&hKE^tc4AQz@@gy z&tDHn;?(41%@$sB!sdaZz~cpc%|QK3FA|>u;KScu069jx;s}Xxj9h1@;b{w}cx&(XtDm1!YiPTFmB_wv2l+m@&P{R7`0>uY z6U@fC`3-=ymEho61i=R*iICvN+_LlX>6vQpuPUvSM=iVC2TuwxJEOwSj22;I5lyk+ zchJ!ERFlJ7nUl?T7DtLX@09tztut<i{(SFPZVCp>!$RY*n0IBQIP zKjJ#l?Qz*%>6oVRJnq!r(7S4Wo%IGi_+%gtnT_OAnq5_>TA&kOy=VT4AcIG&F%Xwtk?|?ykL8HsXpgM2#hU(H5BzoU~uxG8?7B6Xz8XLqrgnM8UNt zoNc-v9LZS20a$%vJ}JPgvX`apY3Ah>)80>52NGLDY3U<*#}M2h-#RH;1tHhWe{2~iTbqu?uP5Q6Y##N`b~PH z84yP;Ngm;S_>7JN>*yFF3-`gupL1$hts;s&wD4+|tQ!aVHzJgpw9H+u?k{Z(qD98h z=K_VOkeA@|B#-vpq8{}nCyY*h8xMZYC)hpmXz_FHk2hz6ng;s5#!X6BBjiV+MZ-6l zw}9Qfkuml#V8tPad!7%^2?wNoi^35R{rFsZIA{{S9?E2IT)=v<2O4y;2PnGnp% zEbX`3K>J&t+Wth_3qvy`VV5;oO=+7haXZO z-X@gV@0-fiGBt62x)ER^Zp$VkosDJRh36MCNx05DO`5M9 zCx_@st-+yU9SSDB-9CKC4^euOz;*(ZB$mI1+7bBOw{~pWDu#uG@T7uaiR@7I{E~M~ zQ$Nb}0+jb5I3YmW0q3e_ICBp(%|`n2PYa2e-?$KGQi=@Ym9<<5Bgfm5z?(eQneBly1Z zxCsCaP40;dZH2(hY?6*=HK;i-*hh1lm83;;BnDV(&VoD{Bcl@JJ$F%-1r49jVtenA8)v-bJrQS>1)L4I~yGc@Y%e?GNyyVO^QkjXvP^ z$K!Y@1@hrT)>wc;aFZq88zl{e@$$mTM>`O+4CjJ5OB!F5Sm0Xa9!|9+RM%W@!dkI6 zdT{VHsscq{3zOg7UnD}Ki>RiXxprPLv&MfIAA0C=>+&K+e}WJlfSa= zvq}hmZ2#L%ej{5E;73o$3gPaCxOB)%1u)g&Onx%2!t6EuEyd3Lq3jE`w&&8XXQSW( zxwnuFc@otPy(_IBUkSL3Ria8RTFdYT5bbjtaep>3rVIXvp_$2DNQzf^s69>~Xk`7ke$u=B!UTO$00%0=yHnu@HdZT)6QhTp^sdhVSKz4fPyi6Q&^1mWA^4cV6N zV#4cPyY$${dz2V716Ymjp*l(4O%-crLv9F(#haCpakszcG1=eN%tjpOaOK=uTfpcN zTr5XMnyir7c`kF~JoFV4?;+@03;qYK2D5wfYO!_5zO24EXo?(1k+Y`B)=gA@1f^d-dTBVC5wbSrzOXdfk1?THTPW z-r{QuE?JQ~eDT8-4l^RmxtO+4AXgA0Du)2$pWEvO=`v7#AjoaMrSV)|fIcLwfa{TgL>@`GPwdev0O+DCSRy?U&IgR(gLuy9%1pRX zPxJ!&HI`q(s=UO58Ogq=N9+SgF&nG(T*6(4Eo7Xv#kEJ%H<;(%0(6|Bcey&%3|tvQ z0jygL`-Y~5lQ-Dr%X=`-a1Q-gax5z~VkV@{+q$K7Y;10OC`d~G;1KAgp%#i_z+XucTxlt=H7+z26u`K)c zTXc~D@vXsg6p5te6%o|WzWj{($e5QJUgp4V79FGnrv07a8$qFLQ=pzC3an-oH=zLR z#VL*1Zq{~=)%szVD;ySdkkkyM=)eSo@h)mVy&fOJEMxD{J4)}l*0fz^jq8>*E3A;+ zw6JaZn_2L-Ey}9qapA<60k|e6G$TSpDNIA7X&9sk3Ufy5e>m%Pwx~7>Iv1FEs^kbq z`qtyn-CbR-jGPUAwMJ9FVg{T*GWU7dA+*D7F3LPNJcl!qKVKOzjLV?8pN*}5@-r}p z?g!%Y8kP7jtD{1)gnzcZ>RU?ct^~#c2D7R8`3}&BDeF&`QjBbia3lapb;4@J0Elz7 z8lT(9z;hB+Im3E0Nl_OCriP*45)w|Gmw}(dpE_Rq6tdx8ZdH5~rM|m1r}{o*u|0t8 z$bBDa{#`utP6%oKdSEsiCu5E9dXBi-qPV4n^hH>y%ybn!75=o#bk$2M=l?P*wHv$m z%|Ql>deh!6KdXj{Wcz#&ZWNsk8w|5!yJ<$oF;RL(d+s zy)TVeMD(PA3YVKUKQiypCir<{Jw4&x0-$0f7`rohj%jb%u!&c%+UuZrnm}@vsP@}D z!O?SYyf4eFO-#3OnpyXTP&X}Lo)A~B5gkv3N1xbl?@XEyB&h#mSm%}wg_Ig$WC487 zhaqe`PN$Tzf;tk0c=dZ&XK%F5*tf&Xg5mak_zhiG`)tG?72Yk8JjLRDgG*UsF;O@a z#+cYDSRxS&@_y-eCjUZ_YYVN0cMgLe^XZ!}QJayV>CLaLujjn)DQ{?Y6TKwxQuVjv zlRXBH>h%#;X!j~tDA!!mx!7{$4<+pHx+ebx_yHkJ7*AIHFP)p8*d=$wt*Ne+!mBLs z8$RL%+UDV3j{qgWJ3B<%Eh*(92TCs47}|500ZxL=oIZkr(Qs;cwY>cf^TxpF)qK_(0p?de`{mp-#NKoPoD39R20&@oJ&)wyaSx|3U(xMjWaH^38{8m1CwFYHFqyH-hS(? zlfa?c_gQtft*dAhyP!4(JO);%%jJ z+lz#=o@Wj4LQ*vUV)yUNhIp#TD;Og!&zV02Irp$AMS&R#bUq;=G0O7HdFYkn%9Z8aYbK72pl< zr8f3nK6~CS1a4KmRl|;3bW`|?drJlSI_@}-ofkpT6hOsj=K^cYey=M>w4(YSUoSQ( z5}>$b4!j8y)_%he7mheHIw;n9hBdhREzk0J<)ax^8k3zFLkRtldv#A`Esp1OKd7vER%m(SX(qc)Q^Rg3J+psxJtyw+ zH;CGrAoZBSz~yW}%oH2{v_F-NGpYwZFc2Qu5y~r*;3wImKxZ`^Ms3&TQa! z7h4ukV1fDGZKE-%x`u(6Sear*Uzx%@PhU4gsv?Gi%{y8#7sx;V3f}VDZ9NZ(Y3x)k zjt{YxS0rl@_6By>6sqB_OW$-eU+I6`CsZBo9jDQ4=XEQ4Vhkj;_Q*Z7sC-V-16#At z8Jo_)PVapSB_YQLkFl)<{>Wf-q60S4=(}7TRa*YWow_{Xl)m&Z+BZOy2$IP5Q#>Ez zbO)PgeHE9`-uZ1-wMP=_Z^a*U>FN)oXA3hwc3n zR!)YV9!0(F^_soF%#Ld->4MiU)vSX@wrB1pFd{?Vv)No;ba@eAa7vn1K74eEh-vXM z9!gRt->NV3u4cbmH0k`cPHg%V-90M@O^Txc(ap-}ua`pItV>Got6IOwtd095g%TLB z?d2HnhIf$uq09^TKwhA0=rMGgqbkw#X_CMLAZ^F$+2&V&&}%%okK+KtZXgfP+G>#? z4ULaW!!??RzA2ROguFF{sroA5ZzX5a>d*DYgG!2tF-h?2l`M{@UigP$Y3Dk^G>Kl< zwBk2_+CdO>^q>2gdxPF%;4!L?)InfBZsK}(uBj+jm$J2Vm#hcEy?wplSd>11{N_#d zRdi$df-$P%lOV8*g+}d?@NxL8^NfSiJW$24>Moa3nw6YL9u8^Ko1~#yK+Z`r z_F4IwihmmT<#R=Y3}xnAXzx{b&kyW4oe%O47sU@W-U1Ded|l>66SRQ_?}zK0&Y577 zR4(+2Yr8YEc&Kq1a#>F$aKkc%CREXpbkf&K`IX{K>785OHcQT{}@r4s^Q;v<;)5f^!O1^ zBy4U~3BptWRwH+|O?^{E|Ms#fGjT{5J>qYo@>)W%L=doB%XaJ~msgxTLi4>4V6nh) z8@o|s2IHqld`eh7Kz|*5oT}LFzGakkD>^6?v|EE#R?SD3+G|YyR-AFBq^a6zdUD6# z69O8pPk3al^5*Ba18AT_J|Z9Nx#cr?m?@iZqx3(qVA!V`YaN3io)Zw|_Csmqfha&* z4_Y1R9B#}f8~}*b^^alOiwuiXZ$6qY90)gR_Ob$a4up6Zl3UIWT%_4TYv3w2W|ca~ zedmlk|K%04a)EI6+n8?xcn+hCNto@OJ5NUH!SmQ>+joaQBD||kWD&yKP(owKx5G|@ zOHx3886fMJs3C)(3F?ngU_;^q-|3wTH~ty=C_*3I@%%D;?ZzNDrxBI}xM={-T_ zm-vS4?iY2*O_OI<2SK+V$=};65iakjG5Ha!q&9bpMvYAW=^LYlP+L-ust^~W9^}#L z%dMZ-Gvw&+B?WvfCIp+;jg}`*tNO3D$^n}W8G1KGHYt467>sE+w7n9{MlmW#O72;j z9GVuRO`PPdb^H%CNr0#c5;j^V;wb2T;ED=8ll^c};0Ok8z9ZUz531c}>tx#f58vmx zWdU=(YG{eo0>p4UUW|e(M+5JHmTNNla!j&LcM>Eni~5w3cWQ~9Xtk~M?q786=45++ z??Frknb{D$`2nylNARFxgp~+x2i=!**vmR&JwRZ;u~qH0vDzNe3O4Q?S3cA%ad)`^ z=y3oyg%9H=!Cxp1YPV!u)EGCGwYesaqqw(>iRh z(Cu6ZNnV*AO!*?#ENBd1Nd%CNDj**FEX+T}zuN#c1Jn$?FSwNu z-U@0qDlg(+yphDVS=0hyHo=V;ZRfM9#Vm+#Cpl0Q$YIkVCl7tbG%1)AX3GEj1XqM)bf9c#Nnc`B-nbV^#Tx`!G#j;HXtHtMGGk zZ%qY3nx-NV;PM}@QJI9nv^vV~NPntlU)S|YrG`V!Yg5z-J&P*)F|zwQ-q$CL{Z(gdx$3+M!C?qw1RPsvjB zp^p-yCm@ld<)PBa?yYxWiN6L*(cNj2owDAm+vTp=gp_rUta^Rtj_(;k&B-P{rR)pG z0kh+zT?P6RKq`>(uM)q>@yB0ON$9>Hiw;GRo}=E2&ryKHKxGiXsNg|(%_D)0(>Vc< z8JEyur~mTtfHZzT+@d2b+PrS!g9cF3c#S{k@Uwc#Rrf}Apq7T51weffgqw<*Y!}r6 zbdU#F4bhosQuHreidtl8vlkhE?hy9dr+;)UVFo$NfXeI~qVt5WWjTGXg`NFRKu_Ep zcF%`7s4WbX6u|bL&!eODu~N|Yys?LHYRFQqU2J;lS)lFdv<@-b)}2XU6%!;Jlw_-> z)0`a%`Cq6ps-jTWAc>Ag=%1;z2% zys>)N`LLs*U zpzCYoqXW^EL=OS5t^m>kdl^|`w2Rh=4)a`m8>shM%24}Nb2<6AckpOq7CTk9q<>ny zH#&$52K5c~zPvP=9?)gKqkek*$|)&sd;riJ+&an&f2OL?bn8l$x-I*HHS!E%9oM;S zy#CF=mSKJm*&>dq`cK&zs}CdQ3d*4bh76GR&M|>9!k?6I?H72~-ZL%7V)*F>H|tk-R0wOs89hpt`uS;T&(0}$2R z9;p1{B$SqOqsu44yFo2lm;Zkl_#Y(9!{mdc){(T z3GXhRtlHeZ)^VwO3tSAB>&ME?k=A0Ov5H+5`AtGjPBR>HSqNZxBB=4!du|z;=c~xQ zUA;jy%^&V-LL&$QmaEA#oiA-WPN0Wb#`Iw4q@7QXX}QwM*{TwTD$@ZF!16DBKy?TJ zM-!yIn5cwO{!BMl3#OCuGbU>jU5X#OtG*LUwpTiJm=;h5ly(G{(a zT-*)@IJy`Zk@cM3GCGjN2@5wWoveW_p8TP`+r(z23fwS8I*Ez8DAujrEga4n{X@oV zA*gdJ+z4-HLh3zKC6)ysJmeA9hi&(Ugsj8@;jxARA)5NR-g{MmddXFghXO4tzyzK> z%k1!KBq&+{U?duPgkTP!3-|T+=ZCB1hM_n~OyKOuE2HaSk@DrHjl$P_yB-_u zE_i-Lsw}Xv|0DANyIHy&1JvI(4QqglkG+-#UV?Os{f6nr8teRYe>D|g38 zfGQD@nWsLnz1;6L3~l&Vbp+DU<)*SA|Dv-_H35_UQ{97a0+FEXU=~T;R8*GJ38BkJ zkI3U!1FcEk`LHuP&{0DE{ciW+XJea!8<}4Wnp<^%Ymfsbs9EobmEtO+tc}ixm*s~W zY>|n1F5X|4VMhbocC&u0SWl^03FxCg^n|-3m^}fUS0RhY2KJAISC;&mD*IHaTWRd0 zivfPfHBEq`6I9jbho6tgY~=5>yIzg_P=2ACC0X*J$YZ3BpGJ{U)iaNe6JAf>4ekaJ z$N{vxx5i`*LU#CL)8xJW%4Q`y`Na^WrIL)_VK9RBeIrlf(vnT{Equ0Yvx`oSn`8sA zFj?tG*-1SJ6)bSF2WP)6?@iYFaY7^=uwP}O6qhv3Ht zWqlL*1+H`HTYyDGBE>|tuaKlzQ72pj2lk2GvXF7)UBzt`-c!}_1i||}UUsCL zobH-XM+&+$R)c8$KMWm&QUi?EX*Mx{#tTN*@A@Cpg8a&hzwKs^KrUWb6#9kNcujG< z!|t_7C?Z7~Lw-N;i20o4ZryNJS4Ge~`pk)}5Y>8cMkm)cb?YuNOx#Dqx;`XOO_9vX zHiQv^kExGh#`jl)5NMm*sK^Ay0Ff*njFwzW+~xo12mI>3~C5$RtD*Pwgw^N1YwK#lr#& zKQq6Skbn(Yv1ZCfhhxq)HC5GSC46jZkpLP`PEVfF;6aJfy!ALECCOx(-Th@DfE8cfAVcKa3 zI&n(>W37;4gm>)+@9ESd(N8nM$Zoi|n7u+npW#&v>WvLsO-6vQ$u@buYN<4Xm*Bt) zM>T$+BujDiLL49C*}v{gzBE$|*+33G1jTRhcE&n$pI&t|3)*fL0CZP$5N6kAlmqO= z*a{zHDty+`O2sviTNj*Q&Zc5f&HlD-YWGtSCXqfq%@S~V*9s#&&eS6}yAUQZwoMtJ z=6I_g;|LbcTMfyHX(Y$x!{A?BxaLsgC^7@C1cU!l@GG_)C}sc@yqG0*l_OgH?mK^- zfcOJlBX-TfYG%2^kTC-ue9H2XgQ8)b95xHm~*Qlvyl{Z znpzRTZ5^pC>!mr0#l}-knyO4SvveWbCFiJKgZ^)UB=bZ~QuBU1eA4sn257$X{F9Ti z&>r5{M!!-)Qvf;HwqZ8e6uWrBj7{J5ps9}t#9$0W45+a%lHr;Dqj z*aj(#HFA@BU<9LatpC>rT6jZdw|tbY9O#Plexl)I{_j8;yiGk{I~@4R@)AvVR8$;O zgU^BG6>J2|_o5pq9B<6=SpiHM5uN-Q7|nO``PQJ*yaF8?Xu@@Gmx z9W3h^pAQKCPN;_SEG>v|RzrBfB)qvszARyaECS>Z0+lmW+|8(3q&l)K4-QO4 z+LI4n7K)->DHT*KvPW?q_?+|kxD6P#0*5g>>E@|hJuKy(`wj5p5keCv12R(8h5&kMd!z< zs7%2ufr#dRrz}%-|MJY*e@IXFbvIlTzcY)W26xv)t%gJ zF?pbMzuR#?#DnGyY;l?@2Gw%ueAK6nl|UnPzBHNbd5EB`DJuAX$hf`s&W2vIFAIQe zzxArmPm=?xb>MRJh&MN*cQwF($^~P=Pft}ylT{E}KbG~VpbsZ5c%K$ zl^jKVx68>3Oidj1t`>kW!|!DMhnGxUUNKIsFM1g$(O(22h1+<*BkE~opS{Sq;+=N_-CA$;{h}k5nfkdF3J+D zsOZ(t?H#lZS=HL}XC1LC4=%_FWFh8;HWkRHjQJNLo#nwHo)YWanH-4&{Lb5pA;z4D zVTXtz;k8>~H<`UdvZ;_-0_)^%*FC)|t$=n9Fiz*87B=0E2UMIc)|;K1`ZgakDt@R) z((2{bN;v+&Nr4Kj(+R#I?nD1Sw44j!a_-}n`89w^L7V5R-#5JVd?IrQEPtkMAlvLN z!kbv__Tw@Kn-ULSwV@*b-37<_(4g5igV#Jpn3oFFLU4pZ$C&>CtdP{4tS(CO2F3{O z4nw@9WGhfMG8d#o0NRE9Y_Z}p+Az z&NT68I)=R`MHM|A5mRSs7ZcI|C~B%!d}am=nVoOjY^_FFQS9QCVt}AicWlYkwrw%k z?L8bK@dj!%7cl#KUY+n){smnW^(-wEP>m#1>C;C#|605N zo$oWE!*LcW@)*p^>R?;sMPOcNaEsUw@W^um>$o-hE*;TCALpexRxAtz_B;xM7J|X} z^aYX6EK)v51Gr{C@Ybu^SLC%%{|xp5Q!%hbVAy@Nx_`VHE(m`zmmj!2Azaz}J|i_~ zhJ`kIrQt>TDCf77Iec%fe*&24hzev0!V_(?0dc$VYB=cqxYC1smugTdj@O=i<+qt; zr1gC-XYCq@ov=xmF*R!zu`2^$`n!S6wfk!=dDs}{2aZiJUTQ220Y_xW`Q{<$%_O*4 zt79n=V78Ig0*jUJz4qs}v&I4Yz%1dxV8><&sHpcsy^_`W=H`XcW&`8==6tIP=`8#` zY`=MWvIKrA4&RgNeOgZs%a%4W?6_y~}Y8X6JfM&PJ^sR>b zMF&B_-S{rQd9>|u_(pg`F(_e_|2FiJ0?0>(DZeZWu~*(DJ+(!4PS*wxm`u|{T z5pkc1|HIhnr2a_aS6N5)oV|;5LpV=S8Jr@S1FGrZx__$s4bD0a*$i*U2lRq#g7-mv z3D9|>y0(v*d8rmQKPWzD}LNh zuM)kDe1x!S{MhwmBwiUX{S2d0PX7c-WzKcZDI0{W0r=3a81gr?ukYRyU`hfZqGTu{ z51owjwEk!?XzS_rVW*zXPzUwZ~L zt!k=yWaBd&$rM{=|0^!k>vq86NewaV+j>UkW`@rZQmxf)Qg~XN=W}noiIv5tjE_GS zW|}2#iN?74QIu%avZgYL+Xo4&MT_st>j_g_4v4?-!U5RFW$@p`Fs zkKlBi>ODsS8>=T~rrji@Rpu(#$L~xA{5RJs@k1{{scCUg8xRw=;OBa~-LThZpZ{Y& zA{}prKG63`7udESpRy#W`M^z4o~6(47(NWUYE)O1RidYM zG?9K%2GAesW%zcM||onOg?36g4yYy5^W|SlR?o z=70SRT}%GS%FK!=4bc!80XdE|0juX^N^ffL7>^)tIw=2YiA6oxzu2!2|ykOC8cTmeRUkL`Lt9ObTLg5($X zS@>_f)9j1bG>Fn|QG7SFR4QBgOqiWXn4vi6=$iQy2)}2bqNQ%3JM}u+icm9RtD@J4 z0SEE z$YDKz8uV#Jx?PP?3APMTphrUG@y#Y{iV_aVh~UzU8*$t*I^22iFBfeJ&Ol z7E3sWX!v-bPm|^@3sVJrehP@URZ!<*`Uva5?zl8=K?N8a98ZowpI)qe1kXq}s#jP06cR!~0rQssG$-!bR*QXzYEH`Ht5b z1H%^ubxn~EE~eUTnZIZ6*CUPr@-hp6?C1sOgrUT^MzGuJQYNEx4>>HBQ}!|BTK$un z?29B;L{&}IlOMDxV6K}v)PaNZ1D5xgJ72N}#t8V}hayIDfIApc41ha7%B>RXJokrt zmraIqdyA40IsBTu5Z5`$)ZT(d?#yU!fo(HzUXb#J6`ISHW;tI<7=k84zjreLQTvJu z9iThrcU*wyQ-BtU17*9D7J4>zfdmXp02K!DGofiO7o2JQE$Phv$KIRAL%D|kpmRr@%~8>;7+mB@G2wB>04u;eWjOV&h1fH;@wIUJ^=#5>h#UIcAki?T{nqMY4c!ojNEztZUET!+^nu ze5o#)P}Hb@GP3=LK7cv!!%YigXwXv`IJzu55fF&n+;{hcZbG0J4Td_@3^4c<{d)bj zziQwo;x10$H-;<4P&Q-Mcpo4)v?zJ81oN)#7Q|=HubgWB{eG_oU?0RHY7ny+IryfRK@h&jA@Dkv< z4}u)jR)Xq1)zMCbCk>l<<OSjiJsTb?5Mott`6%SD>_N#(JV%$XZ#U7w93Fn6Ka+N+FgJQl;TyJY9mL<)yoQX zF|>Px`j2Bi$ame?7Jhj@w?2BdX-AQ_VGvV2x#-dM_u3yEuW$QAIn%|(M;bRAj3(d~ zHp;3=pg%FlC~_3EeJydOCF&iuvZyKmEpS|e+CzkjXH#VT71iaopc>W!Ah?BTXqeOx zZZ2jFuj0tar~98W-Y945A9GtNqBD7RIImkOa;xd&1=#@Fg2s|Aw3V`WP=seD`tbXL zh*ue5TusyQ;L{!4K#o~0C+e$C6`kLGgqKMXcP13^>bq*xBWZUEwIS-!a6PrC>}k^U z)p#6jLb3E}=#kvKurVkaG>^U`j6tF_8Us`U&7l+&swzedUAptaYg@}Xk`A&pdu=7o zmZQ?@AV?=;(&VDsf_xn9N)>1&yveAyWnAB%>qg}p52?^g3$4|e*nakCJ;2r@gQN6r z>jO6Ubim150d=IuO99A@SB=jv@Tm8GWH;m>336o(5VElSZ#^yIzCOg!fQn@b%AMNH z8s}>4?15+s9iZxVe7y0`qVIelPWx>o+;Vq#1z2-ECAlB&`kgsV`YDE&2a=(vTWH-8 z%@7K(kWJ5jId$_!x9??WB8a)V3;|YP9uKpOe@EkudrXb?Q4hp5xX%fE5&y^ z^Uvj`?MY1UmcLu^d}8dCeG9*$WvTsAbmRrYe62ocp<7?BT@yr!(=ZyWjhPD^KMy-( zp;CdZO=4;JLI+mcjh8q-w6;NrKKA8HexbS%T=j8S+IdjDoBK|na3^a0_;Y@l#HPUP z?ynsy(twm7W|V21CWZ zT!W%(hJvo9n;TiqH3rk--4p)bo|_L)~aCqudi~^4+(>+r(MdyK`u!1}Cx{ z1Gy63*RuNl-L_Zvjw=mQ7t&*}A-UG3gZU1d>1W8v*qQ>$;NDQzD5WezqlG_+&lLR^ z>j;HvlSF89QrTL~y1V6mjateFv;<>md%W?rUf!pt`w0g)> zv(cVWz;1x4(TTbw9_I37*&bwtdPXA`2>HD7#CGT~s7UJPJty>g93Va>oEj}6MNhC2)hebt6N+^YiJ z=!7^f6iO$r+Ijo*mb+t8bxmk6;ZRvAtM8LX!8a_Y$mt9BhD&Dm4i$nqxN!w{Lk|8f#tL((;szuEQ%s$F>yB!MisQ_RHqk0F6y(3|bvQK+R|d;o_Da@(yK%LcNI1M( z#oeI9`1?#PTe2yo5afTCKkE+-PI1} z7^ z*KWk2s*!N}Jt0Jm+iAU$ekoeYad1Odfe_vu_gr5SW6sJyq zr_pV+cytA&Pa}VSLUGOLjp2K$(p&us8*G>*(Uj3l-5RHJ}B+H_Ue|_paf-jWyL$mjRSWN#`j?{aSI3R=GH6`piF6Hu* z+@2DK)J`CuTz4g++v=*>!l1gtN2!)#gYVlPfZxLfjpe$%63j8nEZ}CX7FU1oct8uUCHXSZC8&RHW0={5#AaAS$TD(59x}8Jt7j-WEr#6Qt4Kw7uh&`lQC2j>Y`n9wLsGV;{f+dt zOl3a&;M*=t&GFl$;bp@>S#DHGj2`L-LM^g3kLuPCjv1>C+^_rl?Z=sRImvQ-xRfy4 zo4GtFYnnVrJyg;8+rOPy%^mtsPq0?g?Ax1YAM6;dw@wGVfuL?DjB;QF`unmYzA-Z7 zuyX2i?|JKNrk#sqQ60z6yyH-?r6KCn@0k9up37~?n`lJm&RoGazD>yr$u(VC?^+(Z z2RGyT2>&Xd2R4l6cL96{BuG7Zo_Y5)S<2{-`Pq|tczV$3?|@HAtH#YVQ2OLu3vR$T zrPa^fuM7;9vZQA-RISc)KG<60kvk!N&Jq{0pio3Sd|qFNxeaYO3To_^>|59Z?phxU zA@K&^pXG-}CrU7UsJAh+TMk9lOY4u4xD^Uw80%PkG*ZJF-lDNBEaxUFOrkKgUSl&N{lESkI4qrLiKAKRCi`Qk9pG|bF@gQyJ)_~}vJCZ#WWi{T!fk3r{wKVdIuT+J9T zdL5i?N@m(8ITYoM;V6y_46=3OxVmPxn^q$<4zr%54!$-9P4^aC&*VbI;L+M$5+U~` z;jWtIa3MW<;HoSVuyfz5aoevTHMZ7-_uDHW_7iM z=ihj}FTFwq`@2Ze@5dOfO-jf8vlp980oC`pMcvku`l4FHS_mDx%u9Uw@Kz3Xf986B ztA!0gNDKq)N2?8>kd5aEA}YH(dvx2i`YTKRJP}U)VfMpBgqDGweMS=!FmLAUt^4=( zPO}_K$V@Gv>(t&~4z z>=lWhhPyZ}G zK~5MjH#&OLV-!2|(dQcU14l9*(6oBrbKgF3*CJbUpeQ69%fXviih(=rw|+{;RQKPVd`3w?c-HXOs@-eN$| zt2U)Ptm4?KP}7a4Xy$1#BRCzGT}fL(8l>huB&_#9QR!Q=?5HMOW@LO-sWx1W zE7seIC=0v4V$gYDV$&L|z`k?UNk?TS?E(4dA>X3C8~7w>KyyJK$8Gp?pl&yV9k#Yx zu%=gPb^ajcHyw%=1V1>wo z6es#GnnVf7hJy1EQFO6hFEBnvM~u}EtqcE~i@_1slerYZVuVrx?Ej77tw!WUuXY49@RIklzNz)T zx-1p%EhbtGb=||Zg-i=0U$?lJYR}u_C!)T*G#x99;SxfZo-~9+eVg%)`F3lt#6qin zFuNyeV)aRdg&qE%w`S!x!}U`u(@1&T3W+hg19?l1lHs>gQ@+UawdN?YGYCq;6VjuK zAQA5~Why5vy=g&p!POv452T$7 z_$>bcI?m0ATH1uJHO_QJrgC_B%7lfqQZq(q>sxoOvkx!qeY7O*OhA*lPowAyzNOP~?aUU_RH@tmzSP9I z1U_g0-{4GGE8|V`QtA6h`2=r_PkftFwiWw1PxpiUSd48PlpwKl-GBP|mBKsnbdIU3 z-`(=b3k9adHg|uXh4N=uz`dehE}&10oL<(AgpB8QNV4*;3K-=O;!{t}LfcV?l>{ki zPGGrvf7p$SYFZmi^l60Nhq)^MEC~p=y-u>nKIf@b)sTz2cTz}-!yJBz zYu>s0-MQOq50a`s<&+a7@60ybUOgkS;&vpX`)|ZYY$xwOa~nFb@6`MDI7A=^unL$X z6fHwR1%uy@a$rMxOgqDVY_g#>8=mOFnK|9R6XZFel}Wj2tEL=oC=cRSnvVX=$=c_3 zoAXv1hqPE-o?87Ij@|_`-Ve~Wc-Y&Ny114T%ags8XPbuG7;duXIEKzs9#70umJfzj z=6cyhvwAJ~1Fq=pmn%bv7r?Ut^ygaBU@dbUp2yuI(b)bgGBDs1$HvBIYwG=si^XzW zj_#)qoO@~&^&T3EHvB-7M#`yU{pFt6n_s>kBmp46w_TMqmO`~MXIBJR1`J6()sT0d z`sPchtZYTXji@y8<2OZhMGr_gE&u>oy>=DT=@*AloH`}IDq#{Dl``uRNBm|;Ql6c^ zX8;+JUQ(@{XiV%tx>~3#j{-f7jJo5W7>^PD&+`7{+596@#bXA-frm@x^#y|u^o1IK zxqn|&T}D(a6mvZuRT#CZ+;e|@erqwkslLc@Kb>&@j`d;CQhawrl;~#fuKJs z+EhT$Hr9yY1$aT@!q`OpYuQK|OX&{z{o-Ca7@b&5ETFQxzXmRP_UHDz%s8)&7|`3& z`cTl>;{L)d9!SpHE6IaHMYewU#W*z~(${WUm+_&dg=5@8vepSqf2{o)6I&QCyK1{{{X}KvvSsfZ|I_!AmOXm+ z6g896$P5=Wp$qRXmAogO`~&-tKTc1qPGhJE^{*qCuj*pa)@!mHl|?wKRy@2}U9@TE zq+U|eW~jujTU9&}c+o5QoK`#}<^FpRWhN_PuES%puu{2hfJvQhVVpc+QS0T0*N#Bo)mlTrI zYRpc`9{lGbFJO@q&4Mpi40bfo`l-YJ$B@3yE z7I+onTCw@%xE@|Z<4#}Gdt7kWd5l;79loWUWC;Br%PiXWzFh^9ApA#n`WdGIQ+QF< zN&ZLQ%!r){00nq5IEPi|jz$ePE#~?KyM+iLW`CM1`m3?jeu6sw1ALX`STfTN0V=?z zn0phQvT9jdOR!ZB9J|tV8N~lWX6bEvScYdj0V)_9!ux@?VN||*)Y^I=kuQX z%Kgj-#%Wc%HU0V0fU&!1o1HQ{hpEw8V#J8!D+OstyF5+gXS${Z8m0Kr6CwkF&wjW? z_6D0d_gdykCiAG47E{q}Qd;i8Cx(ji0)wwf=9Cad?pPc31xqn)6dujV8acK%guART z{e8_5pKoVoU3l2WBxCoQ;H&CcLiNH@+fKq0YlQEP9sl6r=UwpJuDh3>jX5-8@yq7w zXL)||IE-zwtt<1EcmVAHW!oziBJFj9Bw92XU<9w@tkXiq_7AwR;0BFA0ghCjYxmL~ z@+jPHV#E$sk4c;BuBEwC_>c|J2q9-N>aE`10pr1YHoeg;1gv!D>?Gpru? zfOzd|7OlT+W+em zLPKGDvaQE6n4;O?j0mJ{+!u2*OJhsZ?;+E=Mb_T6MOdkzOX-W@i+0iKnB=vcycf|*zXo&W=>|W%0F#E3-5_(iu4SJUb0cgqcX~QuG>H*F*8Tm}(jK3h{ zu~6j1B*yeDX|Mr?ulzFE6O8l~5Z5RecBvseP~E&#G(wXdxf%^CX!8c~D^-bk7FGI$ zL!xCt1c6FbFX$zFCtgBv{%AOp#i@0lkg80Uox_c>4`Vlllptr&gRAeD*UtxUW$V;W zZqb5*yfcu)z8B@J;*`XvaGNGhk8)W)_MBgLjol4sM2}7650y+P+BzdHz}8i99y4n-(uT`q%~JLSytYL|KZh9 z7dTmVspL8_g(Yb_kwk$HjafK1Rw-nbIy(`5K7=}XcCIRLhThStuYUP;sW$ZI^n$G? zU3lCp1u`f7DIXTisowCE7sc4IxX0!Wd4>C&eVMRbf+p}eINl-O9aV|n6JM)LPfN|NzE{!SfwblA0_C5 zmO}d^!Uxq&b>{55-w<7G8VCk5lKI+P(R-xuv-~uqE1xol$TBQ$-Modj85u=0l$(-t z8+|z}z+2$e+(Mr*oR?9QQwIf5ds#z5ehZ4#EZ*)&=y>E5ZTd9|^R(31$w32o%nX1g zdkFKFUTF|uJ^z8^lWl8FDsm9R+kkzsbwSrNpSD;fbS+USA2y@H&^YZtcHBYP%s$%nRrWL{S?-6v*a$xD4=z*%|8~Sm*6xC`*+sH+|U~dJi%Aw4<|i_)Z2*URS-vUd6=Em+ru3_PLsDKMb6> zJb3fKf&n2Cy6L=ZYT1AB)irXD0g6LIWq02xxkEtL?0`Um0v@5|K$nlpJ7J*aflD7u za&XjZ#0ksH-M6+8xSAL-%L&t7Gn2mxVWkGhfMJ6-j^q7Ma*|?-6doSojL**@_&Uu& zKtbSx>3NV+0dn4X@8Fl7*yUu0xxP~hGbIp>@XJ?3u!pLZe(X2MrDgTN2SHV1!Mi?h2Z1ZHwdaFZjlHsv z+(gDMc_bl0&1)}SvYy4f(HMD4HM6OhwK9GX2p_l!C4olcU9P>S+ATYijy=ZR*J$#s zqTo>8#~e-F7OdeuKR3)v>jAG9=_My|pY9vUyS*gDIOU&^SbYdGN4@Q~NW) z4AAdC`?ng};7w4gsY!1#NF9}IqNbo6gZK5FYH_-W9L_1#n!jT%P)me_k0#V0u(Wg-yZnm!>@y4kKD@o3qI;B`@8aWA-%vH zj{K$QN<8BTdH0<>wU5=4^}p8A+Ktmfce_x$AE7Ez{8o9>96wrHxqRrOqJE>Vq}x;a z;$Wj+xK^an3B5;U`LUQE6H=gvF5{#Sl$5Atg=#*j-pPx6I5GWI2{KjWlrQdGRFAiz;bf%d>BhpZ#-3tV`HmZ0yNLGvI z_C=|MXsFQzh4%NMULy{aVuFr<#a2Xk#30E=rN@{9lA@d1oW3;6Fgr`O^60JpoB_t3 z-Wm=vuG(af_-+RM+HVr_yC~iU{m5hpFZsrmmZQ=LL5qRigJ|mTsMkub24S;s7$G*p zH3Z7Qp+i2yw$`R0S08h;Bd)H_G4V!}F(l&Yckz-ne!M`PHQ8P;T=SDLf!lM6mM3;1 z^EUzyn=SBhz>?O%S3+bzzZ|uPaLc>ov%q*XktA`A{iB&51pH^EU~ z3!fGJ<%<`KOs3#7fr@PC!knmY&0`W4}yLU5+OhSd3dC{j^W1-1}H2o7cj>GBnw!KfX^s4^NNh$e*0gKl3HqV z$XyYhUS5&h7hZdY?e}y``finS=xSYoE*MzjM~TodA`WjpBE|$06jV1K5$7JF+vm@m zg+N)fSi|uOvZ|`#bxh9+B&K1HZDmS;h!mibhk{Aj5=+u*@cW#isQfea`IH~6K$&-} zQrqHYG48fh-hml}(p08CPj;lLPp8(0R+Qo)NF41DGGYmLiKVc@Np297k{A|cxbFZl zGKcP4H07e>g0a^f)PmQb0yX#sp!@`>T~n?5EQUVRTF!T_ypG)Y{O zI}YYmo1SU|Mdo3WFw$3-tHP@t|3Gr?GpUM%I!}sh)il~`<{na;X+OGZIbjK1?1Izu zjjy}%N`hblj|J|lImS=jLwevNs??>9;Go9ss=HI-^s;I1PqO8GY6<{Or!hA_C_$~5 z{|hC`1s$(Osr|QxU%Kw*v;wby=Bm@+DOf3s8$MpIcA?CS&w%Jchs06NHd@1LPxX!v>oIw52&*E)YFfONxZyCm%_G%JdleNsEFhb>S@&T+qCfOAf# z@=yzQu%eF_0KiGnsGE{G%gI~uWOo2v{N88jg(KBIP)y-~@DO8gvZ3YI;v^JS78WC_ z6OyWc`c0L4qD-0()lws>(`%6hK`_7hCCdHHvzW`FYSqBu&j2~p*~zo`8*yFQU%d5C ziRzyAyGULg>CBX_lr&2(8sq9608)}v%RM$o_JU?9q9?z#zb0 zgG4IoI!&DNvp7Bz%5antL3zX%kZ=An#Y{KFr`(-Mdq!R%O+g{KlAYm+)5%rsNX9(- zq&+0*KyerVMkscg#3GYF6!SYj08AVHjFUG@QX~08J%@ATdaS;&Q6PTsvW`ONJi8jMLt>2}mV-^7F6dS%J0 z#9&ip6zqHE3f{PWbmI(rr1>{exJxT{m{72it>BVDP@P3~AVv-D$H_Zr5XF>D)c`^w zD7E6obxc;ejA%Y#=t`EOebKAH**g3(SG`m4OV)2BKGAXygm14YT!vHBIZ7X2DHo>D zdSM+~fowU+Ss!K9OV-X5Qq!e!+KtyES z%KJDM*mMejZ{V(+qTGP|!`Pv^wBC-G6l!YK3H9ROAE@CWyEjkK^}avd!viJ!a*gYM zEKhcnsqO`S$@ZUynnhN4E?B>)^BQ{1CIGn?2H&VB!dEXIB{nXobLo7O3XD2~u^GuE zn;nX#kS10JLL})}&lsRAL_qe!vIzY{OA!Ps3$TKw05g@UFa zfWe0Wk43rq!NR2p`u9Z+#YBbEKJxaKr^7pSAMO@$rS=Insl@u z;dA@c$iq@_m{d2vAz7dgx8)R-Ce5dHsH*E4-uM|u3)RZIFOPxCT5*O=sbuez;+#P^ z>~5#kPEwT}1Z7a8St1=Y>cT;#RZm>tTE_B~4b5^w*BxuP`ibp6j0Rz(I<~q>3m|A| zH>j_Wx6uKkM*rMa>h8X=U+yqP@Wj1MwqGG+^qVh>ObU*1b&)P9@*HHx1EDe+F`GfX zm#vga3#jQX9JBvHRKOKj+iVmW&7 zMM^^uPk~Rk>vN?ZG=sp&Jj$;z2qExjhh)L6_lJTNS;NEFeF37?WlUpStY_!?JlPwd zPDy2;Y=Qu3O%W3f0c9&JXzPDI4WZN0E;-#oOX{gjwX$h8!}KwYWY1 z$r#IRM8L}WTmd#5Brn23Yu*dKZm3iO55wk2flB|ahJn9Y*vRfPg>dA=^nwU*Qw6};Wb(R@ zCx~b$1fc;i)aHujo0q49y67N$6)iR%wMMQZp{NOMTizjV;cT(Vm!o%=C0wHG9=oXA z4xu7E}=`OE5( zwAhP$cr)^kJ?(!iUHP#;K3phF$@bCi-1DXH(oA&*kU92{FEH%KX!H~%f}4Trl>vZ^ z1XP;9qg~&8)mi?@Pd2uyBah$hvW_`jXYgq{ORCVjlYQT+mSW0G1t89e0;L>`a+$ON zoUhOv@=sEvjJzIc&3|1NrWLLf1VJo(543T;t#-HAVXzclTxd+{EWl5b?143_Qwex(J!roGbj+wRH{`y_O-@RjajUByC#2>3Hoc z%=Xb^S9Q<3`W6DRGf?7>C5R_-3z|)|FDYE0k-43kkD4n*4_0}=+8+QgvDQR;eo@`@ z{GD;!(W5s&?))d=Ll)ut9cyb0byB+Evr04`GRGB_t{vkj<`M#n!YE zk6tG-HaZnu)BlJJ#{iDjVB#92SadH(dsNxX>A{ZMC!HTB7~{{3zHnZ{rS%``+g6hzi#+aJ*ijA|cPS)>8WN36UBSC-Vj0qazDO4?EJCewW= zw3l2aP`VTKNQg;}1u5G69-kYU)ldyug!4Pm8|ErW*#ZzxTT4>4z_cluk&Vj@bF|fO zD?`}GEt)tdb7eaJc+qL!w@_7F1R#6d0`O6d?tUwejhLsC7h8RmHr9*mq)`Mc&$i_n zI#khv%WBo~Avj~k-v#3WDPdJph=yHsvp?RaiC=-AvKsJs0I@rwNrkLyp6-9?>2{UB zUq`s4s>hC#byrTsY4qoW^gdV8Gy#w>#JwJT`}nYw(7;b`d7d2GK23C%e~d+t@U-Mm z+S4pXc953X0NLPq=fPa7y80LAu{(8yFHVo)#+>B0r+Ha~YbHGYSX%-hTNgukF$W9e z3PZ-_$Q91$<>fKoQ-wQ7ilX?*JT3~J4EwPUx0y)>Rfz;8)y=>4ok#RpY=bAb6;9L0 z_<=JyfZ;HxDr8rXW~TjjXkv927&m+;BC&j2eJw+U%SNz>3P2|Wt=q|*3_wvqdEhDu zb7o_B8*+;%3hAn#n~uZL8*RaA8Nm+Cvo=eo+m+1DS{@HId(U-je_@TvaZHbv4WTad z@3@9b*9g1w4wW=eR-$xjYky!-9wnj&r{Q#eMkYct_=`A>y$;9jd)T)o+$LLrsRue@ z<;zHBL6i}V{2i5EGXoXxA0cdQfB-c7$ZCys4@81gY~j>>T0b$YJPmpYc^4}66NAae$mY~ zx7)b}Pk}n)hkzz+K+Mk9O#-Ap)L%5UMip{ZgBZ%{&3q1UHI#|m3CZr>nummLGF^k> z-KU@3C)0>P9lcZiz$9V!S{4z_)6!;lot>dGXFRq;L~2k!KJ@|z>Yk#L`Zdd%bJZ48 z@#O7D(ZwmjQNIPczWH(Y2^CHF=&|$=JI{whRI%ZR>Oc1Cn<4DBed**{b4@egu(i0x z9gXz^6{1dWcX=C-miuZ8qz22(zEy-1PTZOG1+0*tUb7Og^dFO<444A84?h%0VRBW5 zQzw4?WYM<=M7Oc9CVgja2zTGvkkPX%Z&z6h0hQWn7efs1>F?M zo-c)_a)0G+fw%kyz!LzWxCmH7z4_8hQY!F04)%n5Ch$Yzsvp zw;i%_peVk-(^mloctzn!OtQFhhb?Sd@FJ*e-#=ID^{^p%0khu14WnbL40N#~2Bulc z4O&$ku0|dWc>OF$jt5*oE(qx-h4rS*{&c36%c7bbGVX8nR%B0D+gr>C?}>@Ms^GZB zhL#l)xQDeMXRRpA`fK_6*8H}ij;B@itfrNZG+YL6!Z$hGcaPadF2VbWwHhU@gGzZZPW33qZVP6-9RMJESsa$ACzDve)Cx zQ{a?1P}R4l9_i1TaFFt;!%#yMoGssi06SP0poJ2~Rc5)*IIdS6Y8(<80zP+-Rk2bh z50qUJYg;!ZCpIV^>pFU0^eF}<00M8#^0-r#3y#IdrU@$SoU7GhXran2=!JOCg^k4% zDtW^~e~&klH{Mgf&aWNJ!aj?%gAHVE7HI2MsA;(JLmeW+?u$b{9(q5Ii$fjOZ!tbw z%ZFyb42oy2nUbFd#8k=Y$UwwZa^zwDHl^`>RsCS?DNLOze3`?&pl5Y7OYnMf)_p*f z$ttra9Yo2CX4+Y4zG@|sd94&v$R6|1;>BT0I1^XS>bH)+VHspdbMsuSzQ3cva8m)| zOrjpPVjF}#{jL_02Pcj+(K?SLj<|?{$%a7GbFQrO{t+HVEwb2KY|-^Fhjs(lnX#gH zKsvtyUXFc*TC|^`>NuIWL_xtCGH8n^b8@U*Iwa$^Hj0~rY@GPes4r*8tYp!K3$g`- zp8E@^L*o=vl3_Vv3)lhnjqT^{I3B<{`v6HG*Q1uEzZ z$kp(3p4vx#@>UynK6*83lc09PqG&=BuE5n_4H4c^2-QBTO`lLBRX7bUaPb zxW{0-Ijym0>^DC(wS&nkNhIp(~jbhYw#H9vOGf z&1empog-C3QGxa$oNhw2o6KDuisAJ_~+yyg@-iK^A4-IE7XqfA4AM-*Sxi`0kg2egRqc zG9x(#DN~aZFDopct93qx+S?q6bPjUeIua?kxSpqOiDYC4ofbN_TWW4EaYfd9-G+~Y zN`O~Vdvgy){;2i#KKkyk_hwg|E2t0z%_MZXEgN+kYj}{Z^aw)8cz)TWM#(ES2Dtjs z`aI@q?=>$P_NpQ9s<*A(C*0mDFJ_TagD-HngSOhct+NKGzWJWNQLm3wY)#Sn#xPSQ z+htU@j$2)7O18zf=(IDf42tZ-J-|kbja5a~yBn_;{d&oYay}yY_kyFLg8!RPRbSIv z0Hd`5?Qd9g`(@5NZ28><|65CqOh@BxVmRm1nKP_Jrt^Wlp;z+0`@uQHVThS%U{oOg z5?YK)&|qEQ*SB}hB|px=v~u-ADfWu2lX-2_u>+0?K0L;73QqU3u_pZ2J=K|V9o@e$ zN4aB)^{2of&AnK8f=iABt*a)Q(#38L6nM?7*y9;NUjZhw`3;cJSurS>G8H)*5$m&T zdvuE?@ZX^hhK(j=Tz4BSf(=UO*p7v!G@kE0^tTOeUbfTx2eoq)>c3Yq3k!4JnJE-q z^9==ke3CUSB6NiMv4@RqzyqDf?SG9Mie!$9PT?fj{yMod2{CCBzLR4N4kto-Yd?JL z={6M7MkJBWVE|ZD7J%@FKhX#Q>j3}d4qnd#YJv~>!v9-g4k1^)*MCfn^c`~7d-TIk zX=#yA`m>>r^N_knGq|w!WwFy@qMekbrVH>4=l!n0r@k`$ySrF95a!VlN*Dm99UuSL zbY0-c^P>pD#_9z3n&>ZXNP^CC%tK!5ceieihcxQts(Ee6Bg3UNYdor|@UJ z#jm5QGBMq4*oIVM7aJgTGRd9q>d;iDhc6#(^QV;G#GNtt4TVPT!y;a`X~D8X^Bn&^ zt&!=o0DrLFN4aO&C{oqHWNxlE9>H=Hf{U8ILm*b+3j{ok^Ip%Ekj%var4Z$_9#r~+ zgP~C2mop{z>tKwx;yn!OBi7Y?iVH12hIKXkVA=z zJJQe1XGT}Hovm^Xe6<3~laK`M70+(tT5}?&*4nrr=zYkjiypQx5pmKUALI*KBPW^x zAEg)UcLOH{qo#><0IG!veeU^=nwcM@eoXw}25xb=mp3wK!>#mk;QJOZx#dBml_ot(du zw5_ekUO&jIa1+oAQ!)Mz+rHf}Y>9HD3Z9aqK6*$SP8IA$7|61C$k2G8Z;IC+J?)Qv z7_>KS4M>+D@(mkpHj$9Jo7lW_^XND>>!&tel=uAn6@p}XJA=-oRo^6D&*(+agTR$F z{XBgd>qJ9e@ym^V8W+l=o4~;@Dc1$?S$+Dn1+pbX1Tra1tNR4fbLNjN59xB3Dku=0 zswy;caY$Z^d{x}h`8CFmbTmAQ7hL12h&y7eQOT6|e{J8uU?4`R)#m2vnMl677G48AXB!2(va zJ@<9`Ifqu-H*t;i?qAC;+;niWGrLi-YDuaHf?VnAS_{@OYny?__{Eq7sojH((2p<$ zjJWep+!x24x;wuf8xNnDmiF5ITAFy7w6(aOz$^H3xyG?_A?GkCKIl(8W9&kL$+i6* z@WQwGE#85Y?vufzb3sweDbHs&(UXY_NYTdw{jlumcIu+^En=3=%uMUfUH1(WeO|>z z=jO6A%RehBjtf0LTA1b^=C30WC@1yj+Z<_ya{?$mP_1+RMSjzlxQ8mOfC1G42ys%` zJ~OX%d2Xj&vqFykRbun&(K8@#x*v&HQ?y_7(*Sok3{j6j)v<^`t;cT&pjd*&@hD|R zasOuMRmM&!HbU{*+fyW>CLD#*V&HJiQ`|`D!LDsnC)co>5Ans%|0{OtPb`h@&FWV$CIzHJW-;V)j~ed}nm7-#-32ZZ z{aZ7RA*WwseVJwV!%6;e2Cz!d-Z34t{VasWz!mj~R$w_GM}P8v#vt|9@{!CFEcT0x zBkG@vdpp$d2;=Jd$dr;pihqVPq1w0N|M~6}uVAY$r>YUUrkJs9u>PD?#y8 z#kOor)3Qz>aI4r$vBwuvF>i?p_~x3y4`I%T8K`c?nCrRYz3D{-#GxH%-ie;?227kg z0bbPuB1g~|#Z(W!0XmM^jd|x#-0QFoq#*%&p|=qg^)pp@Vt^DsVM`0Thdf339U`7D z!%?N)JAirRnj-I9MRzLg->K9@wZ4sb&Lh}kT2(Rs?j_)g23C31lY9#7H(X{00x!u4 z=)*m;XrKz7J@_7?;|~D?DmJ*dXE!)RLBU6%1qDTzkOT28IsdkwZ^;pV4$+!DT z;Xp|zp?R5ms~A81mtsj=%gHrUCivo)bb#c3Z~t}RDN>AFls|*vp9^k@bUi&$dw+H5 zUd!Ch!nKdRj^Bn6u)OVT0{04?zh$isD2s{w=_FinYwG9aW5}))U+ambaI2HpVv7z{ zt%QJ=zeG0U=w|1*Cn8Yp2MeGv5-+ILanmYi-Pp*p&w;d*4g`o#)iOk)ol(fwwP~@7>GM zOhY%#FYHx;MU&J_ta&izMHte8*hv(AME>%1#x08zC3_WX9LvD~qGmvrR3A zUvKLE`JqoipBfqtR#s9rH^Dd}W$LQ$g%cp`u8bRCBTE!N>Rcf(XHuG_+o|65XgvJ?rq?ijE)sE@&p~+l- z;l+#HnstVDjmaB_6OY%0S-b7}aRXjn`=2^z4z_mftBmM6fB07Unlfkz9R=;bhWG#e z^M88G-M!7Crm`r{OCZy+AiGsTf>k%w(9~i^Jj0~qwA?A z|BXN^nXG}&%g@jDApdzv3hEqKJ5JVV_wCv)gd<*@{aSwa>W`FU7qYgTYU-59dHc2e zfMB}cDfj)#v6H84T&z7j-EFL#q5pGz;Be}RyN&HB;Y$*dr-c9K-z7;22{DOFwwHc= zCN3i?dWrnkOD_NOnY5JH|Ncx=LPlCf`hR~WEF&r9>2EGa20{rhi-h)YWd|Mn~xt%$_$pGgP{|Ng9)n6Q-0@81&^mH5wmg+;{v z^F2{9(ci}>EG8oU`#iu{WW;~}4RI;a-#>#M{m*X*OZ*?kBL3g8h)E0o{;Zg=$ba9P zu(bGp=O!ikpJzoyC8T~Ivxtbuf7e+?=J)S`C6)Tm8i2X|_cPJ|>=*FXB!6F1QPKbY zhOmgFs5!eSC4|5WVnKkrvY_&@JR1WZHtw{;Pb6p{Y@Y=I3V{{Nqwr@NKCla2eSYu8Q*>Dv4Le@g|G yIr>5Q`6UWKPbdU&>3im-OB0#He6zY-DEW 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ⅆF(fW>_>;(9~Q-{Sw`?C-s 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 From f9e8c1bfff15365c8e89c6843322b246db473e22 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 14 Apr 2020 14:11:50 -0600 Subject: [PATCH 02/80] [SIEM] [Cases] Removed double pasted line (#63507) --- x-pack/legacy/plugins/siem/public/pages/case/case.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/legacy/plugins/siem/public/pages/case/case.tsx b/x-pack/legacy/plugins/siem/public/pages/case/case.tsx index aefb0a93366b8..2b613f6692df1 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/case.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/case.tsx @@ -26,7 +26,6 @@ export const CasesPage = React.memo(() => { message={savedObjectReadOnly.description} /> )} - From 7cd746bc2f24530ba8a3375798188e017747eddc Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Tue, 14 Apr 2020 17:20:18 -0400 Subject: [PATCH 03/80] [Lens] Fix missing formatting bug in "break down by" (#63288) * [Lens] Fix missing formatting bug in "break down by" * Stop showing UUIDs, make logic more explicit Co-authored-by: Elastic Machine --- .../xy_visualization/xy_expression.test.tsx | 294 ++++++++++++++---- .../public/xy_visualization/xy_expression.tsx | 23 +- 2 files changed, 254 insertions(+), 63 deletions(-) diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx index 54abc2c2bb667..0a6945dd0c1f0 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx +++ b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx @@ -633,70 +633,242 @@ describe('xy_expression', () => { expect(component.find(BarSeries).prop('enableHistogramMode')).toEqual(false); }); - test('it names the series for multiple accessors', () => { - const { data, args } = sampleArgs(); - - const component = shallow( - - ); - const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; - - expect( - nameFn( - { - seriesKeys: ['a', 'b', 'c', 'd'], - key: '', - specId: 'a', - yAccessor: '', - splitAccessors: new Map(), + describe('provides correct series naming', () => { + const dataWithoutFormats: LensMultiTable = { + type: 'lens_multitable', + tables: { + first: { + type: 'kibana_datatable', + columns: [ + { id: 'a', name: 'a' }, + { id: 'b', name: 'b' }, + { id: 'c', name: 'c' }, + { id: 'd', name: 'd' }, + ], + rows: [ + { a: 1, b: 2, c: 'I', d: 'Row 1' }, + { a: 1, b: 5, c: 'J', d: 'Row 2' }, + ], }, - false - ) - ).toEqual('Label A - Label B - c - Label D'); - }); - - test('it names the series for a single accessor', () => { - const { data, args } = sampleArgs(); - - const component = shallow( - - ); - const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; - - expect( - nameFn( - { - seriesKeys: ['a', 'b', 'c', 'd'], - key: '', - specId: 'a', - yAccessor: '', - splitAccessors: new Map(), }, - false - ) - ).toEqual('Label A'); + }, + }; + + const nameFnArgs = { + seriesKeys: [], + key: '', + specId: 'a', + yAccessor: '', + splitAccessors: new Map(), + }; + + const getRenderedComponent = (data: LensMultiTable, args: XYArgs) => { + return shallow( + + ); + }; + + test('simplest xy chart without human-readable name', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a'], + splitAccessor: undefined, + columnToLabel: '', + }, + ], + }; + + const component = getRenderedComponent(dataWithoutFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + // In this case, the ID is used as the name. This shouldn't happen in practice + expect(nameFn({ ...nameFnArgs, seriesKeys: ['a'] }, false)).toEqual(''); + expect(nameFn({ ...nameFnArgs, seriesKeys: ['nonsense'] }, false)).toEqual(''); + }); + + test('simplest xy chart with empty name', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a'], + splitAccessor: undefined, + columnToLabel: '{"a":""}', + }, + ], + }; + + const component = getRenderedComponent(dataWithoutFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + // In this case, the ID is used as the name. This shouldn't happen in practice + expect(nameFn({ ...nameFnArgs, seriesKeys: ['a'] }, false)).toEqual(''); + expect(nameFn({ ...nameFnArgs, seriesKeys: ['nonsense'] }, false)).toEqual(''); + }); + + test('simplest xy chart with human-readable name', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a'], + splitAccessor: undefined, + columnToLabel: '{"a":"Column A"}', + }, + ], + }; + + const component = getRenderedComponent(dataWithoutFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + expect(nameFn({ ...nameFnArgs, seriesKeys: ['a'] }, false)).toEqual('Column A'); + }); + + test('multiple y accessors', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a', 'b'], + splitAccessor: undefined, + columnToLabel: '{"a": "Label A"}', + }, + ], + }; + + const component = getRenderedComponent(dataWithoutFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + // This accessor has a human-readable name + expect(nameFn({ ...nameFnArgs, seriesKeys: ['a'] }, false)).toEqual('Label A'); + // This accessor does not + expect(nameFn({ ...nameFnArgs, seriesKeys: ['b'] }, false)).toEqual(''); + expect(nameFn({ ...nameFnArgs, seriesKeys: ['nonsense'] }, false)).toEqual(''); + }); + + test('split series without formatting and single y accessor', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a'], + splitAccessor: 'd', + columnToLabel: '{"a": "Label A"}', + }, + ], + }; + + const component = getRenderedComponent(dataWithoutFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + expect(nameFn({ ...nameFnArgs, seriesKeys: ['split1', 'a'] }, false)).toEqual('split1'); + }); + + test('split series with formatting and single y accessor', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a'], + splitAccessor: 'd', + columnToLabel: '{"a": "Label A"}', + }, + ], + }; + + const component = getRenderedComponent(dataWithFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + convertSpy.mockReturnValueOnce('formatted'); + expect(nameFn({ ...nameFnArgs, seriesKeys: ['split1', 'a'] }, false)).toEqual('formatted'); + expect(getFormatSpy).toHaveBeenCalledWith({ id: 'custom' }); + }); + + test('split series without formatting with multiple y accessors', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a', 'b'], + splitAccessor: 'd', + columnToLabel: '{"a": "Label A","b": "Label B"}', + }, + ], + }; + + const component = getRenderedComponent(dataWithoutFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + expect(nameFn({ ...nameFnArgs, seriesKeys: ['split1', 'b'] }, false)).toEqual( + 'split1 - Label B' + ); + }); + + test('split series with formatting with multiple y accessors', () => { + const args = createArgsWithLayers(); + const newArgs = { + ...args, + layers: [ + { + ...args.layers[0], + accessors: ['a', 'b'], + splitAccessor: 'd', + columnToLabel: '{"a": "Label A","b": "Label B"}', + }, + ], + }; + + const component = getRenderedComponent(dataWithFormats, newArgs); + const nameFn = component.find(LineSeries).prop('name') as SeriesNameFn; + + convertSpy.mockReturnValueOnce('formatted1').mockReturnValueOnce('formatted2'); + expect(nameFn({ ...nameFnArgs, seriesKeys: ['split1', 'a'] }, false)).toEqual( + 'formatted1 - Label A' + ); + expect(nameFn({ ...nameFnArgs, seriesKeys: ['split1', 'b'] }, false)).toEqual( + 'formatted2 - Label B' + ); + }); }); test('it set the scale of the x axis according to the args prop', () => { diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx index f5798688badc5..527eedf1083c2 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -361,12 +361,31 @@ export function XYChart({ enableHistogramMode: isHistogram && (seriesType.includes('stacked') || !splitAccessor), timeZone, name(d) { + const splitHint = table.columns.find(col => col.id === splitAccessor)?.formatHint; + + // For multiple y series, the name of the operation is used on each, either: + // * Key - Y name + // * Formatted value - Y name if (accessors.length > 1) { return d.seriesKeys - .map((key: string | number) => columnToLabelMap[key] || key) + .map((key: string | number, i) => { + if (i === 0 && splitHint) { + return formatFactory(splitHint).convert(key); + } + return splitAccessor && i === 0 ? key : columnToLabelMap[key] ?? ''; + }) .join(' - '); } - return columnToLabelMap[d.seriesKeys[0]] ?? d.seriesKeys[0]; + + // For formatted split series, format the key + // This handles splitting by dates, for example + if (splitHint) { + return formatFactory(splitHint).convert(d.seriesKeys[0]); + } + // This handles both split and single-y cases: + // * If split series without formatting, show the value literally + // * If single Y, the seriesKey will be the acccessor, so we show the human-readable name + return splitAccessor ? d.seriesKeys[0] : columnToLabelMap[d.seriesKeys[0]] ?? ''; }, }; From 5aa93be77d7e03802a5cfc2dcd020e57d80a27dd Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 14 Apr 2020 15:41:50 -0600 Subject: [PATCH 04/80] [Maps] fix double fetch when filter pill is added (#63024) * [Maps] fix double fetch when filter pill is added * remove isDataSyncActive * set dataMetaAtStart to null instead of deleting Co-authored-by: Elastic Machine --- .../data_request_descriptor_types.d.ts | 2 +- x-pack/plugins/maps/public/layers/util/data_request.ts | 10 +++++++--- x-pack/plugins/maps/public/reducers/map.js | 5 +++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.d.ts b/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.d.ts index ceba2fe56db12..26044d28d53a3 100644 --- a/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.d.ts +++ b/x-pack/plugins/maps/common/descriptor_types/data_request_descriptor_types.d.ts @@ -65,7 +65,7 @@ export type DataMeta = Partial & export type DataRequestDescriptor = { dataId: string; - dataMetaAtStart?: DataMeta; + dataMetaAtStart?: DataMeta | null; dataRequestToken?: symbol; data?: object; dataMeta?: DataMeta; diff --git a/x-pack/plugins/maps/public/layers/util/data_request.ts b/x-pack/plugins/maps/public/layers/util/data_request.ts index eeef5c49c6ef8..44b7b2ffb6ae7 100644 --- a/x-pack/plugins/maps/public/layers/util/data_request.ts +++ b/x-pack/plugins/maps/public/layers/util/data_request.ts @@ -26,9 +26,13 @@ export class DataRequest { } getMeta(): DataMeta { - return this.hasData() - ? _.get(this._descriptor, 'dataMeta', {}) - : _.get(this._descriptor, 'dataMetaAtStart', {}); + if (this._descriptor.dataMetaAtStart) { + return this._descriptor.dataMetaAtStart; + } else if (this._descriptor.dataMeta) { + return this._descriptor.dataMeta; + } else { + return {}; + } } hasData(): boolean { diff --git a/x-pack/plugins/maps/public/reducers/map.js b/x-pack/plugins/maps/public/reducers/map.js index 7e07569b44b83..251a2304538ed 100644 --- a/x-pack/plugins/maps/public/reducers/map.js +++ b/x-pack/plugins/maps/public/reducers/map.js @@ -57,8 +57,13 @@ const updateLayerInList = (state, layerId, attribute, newValue) => { if (!layerId) { return state; } + const { layerList } = state; const layerIdx = getLayerIndex(layerList, layerId); + if (layerIdx === -1) { + return state; + } + const updatedLayer = { ...layerList[layerIdx], // Update layer w/ new value. If no value provided, toggle boolean value From 0abbb1d9c4b22904eed969b28778715eb3ea33fa Mon Sep 17 00:00:00 2001 From: Candace Park <56409205+parkiino@users.noreply.github.com> Date: Tue, 14 Apr 2020 18:19:31 -0400 Subject: [PATCH 05/80] adding useMemo (#63504) --- .../view/policy/policy_forms/events/linux.tsx | 26 ++++++++++--------- .../view/policy/policy_forms/events/mac.tsx | 26 ++++++++++--------- .../policy/policy_forms/events/windows.tsx | 7 ++--- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx index 9d2ce03c20462..ca2215d3d0a59 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx @@ -8,18 +8,19 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, EuiText, EuiSpacer } from '@elastic/eui'; +import { ImmutableArray } from '../../../../../../../common/types'; +import { getIn, setIn } from '../../../../models/policy_details_config'; import { EventsCheckbox } from './checkbox'; import { OS, UIPolicyConfig } from '../../../../types'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { selectedLinuxEvents, totalLinuxEvents } from '../../../../store/policy_details/selectors'; import { ConfigForm } from '../config_form'; -import { getIn, setIn } from '../../../../models/policy_details_config'; export const LinuxEvents = React.memo(() => { const selected = usePolicyDetailsSelector(selectedLinuxEvents); const total = usePolicyDetailsSelector(totalLinuxEvents); - const checkboxes: Array<{ + const checkboxes: ImmutableArray<{ name: string; os: 'linux'; protectionField: keyof UIPolicyConfig['linux']['events']; @@ -50,7 +51,7 @@ export const LinuxEvents = React.memo(() => { [] ); - const renderCheckboxes = () => { + const renderCheckboxes = useMemo(() => { return ( <> @@ -76,9 +77,9 @@ export const LinuxEvents = React.memo(() => { })} ); - }; + }, [checkboxes]); - const collectionsEnabled = () => { + const collectionsEnabled = useMemo(() => { return ( { /> ); - }; + }, [selected, total]); return ( [i18n.translate('xpack.endpoint.policy.details.linux', { defaultMessage: 'Linux' })], + [] + )} + id="linuxEventsForm" + rightCorner={collectionsEnabled} + children={renderCheckboxes} /> ); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx index 3b69c21d2b150..5024d02603d77 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx @@ -8,18 +8,19 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, EuiText, EuiSpacer } from '@elastic/eui'; +import { ImmutableArray } from '../../../../../../../common/types'; +import { getIn, setIn } from '../../../../models/policy_details_config'; import { EventsCheckbox } from './checkbox'; import { OS, UIPolicyConfig } from '../../../../types'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { selectedMacEvents, totalMacEvents } from '../../../../store/policy_details/selectors'; import { ConfigForm } from '../config_form'; -import { getIn, setIn } from '../../../../models/policy_details_config'; export const MacEvents = React.memo(() => { const selected = usePolicyDetailsSelector(selectedMacEvents); const total = usePolicyDetailsSelector(totalMacEvents); - const checkboxes: Array<{ + const checkboxes: ImmutableArray<{ name: string; os: 'mac'; protectionField: keyof UIPolicyConfig['mac']['events']; @@ -50,7 +51,7 @@ export const MacEvents = React.memo(() => { [] ); - const renderCheckboxes = () => { + const renderCheckboxes = useMemo(() => { return ( <> @@ -76,9 +77,9 @@ export const MacEvents = React.memo(() => { })} ); - }; + }, [checkboxes]); - const collectionsEnabled = () => { + const collectionsEnabled = useMemo(() => { return ( { /> ); - }; + }, [selected, total]); return ( [i18n.translate('xpack.endpoint.policy.details.mac', { defaultMessage: 'Mac' })], + [] + )} + id="macEventsForm" + rightCorner={collectionsEnabled} + children={renderCheckboxes} /> ); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx index da675dc1e2393..5b347ec387f48 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx @@ -8,6 +8,8 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, EuiText, EuiSpacer } from '@elastic/eui'; +import { ImmutableArray } from '../../../../../../../common/types'; +import { setIn, getIn } from '../../../../models/policy_details_config'; import { EventsCheckbox } from './checkbox'; import { OS, UIPolicyConfig } from '../../../../types'; import { usePolicyDetailsSelector } from '../../policy_hooks'; @@ -16,13 +18,12 @@ import { totalWindowsEvents, } from '../../../../store/policy_details/selectors'; import { ConfigForm } from '../config_form'; -import { setIn, getIn } from '../../../../models/policy_details_config'; export const WindowsEvents = React.memo(() => { const selected = usePolicyDetailsSelector(selectedWindowsEvents); const total = usePolicyDetailsSelector(totalWindowsEvents); - const checkboxes: Array<{ + const checkboxes: ImmutableArray<{ name: string; os: 'windows'; protectionField: keyof UIPolicyConfig['windows']['events']; @@ -132,7 +133,7 @@ export const WindowsEvents = React.memo(() => { ], [] )} - id="windowsEventingForm" + id="windowsEventsForm" rightCorner={collectionsEnabled} children={renderCheckboxes} /> From 7677764c6597d0920b7d14a2d0e5773f9c32d2b7 Mon Sep 17 00:00:00 2001 From: Patrick Mueller Date: Tue, 14 Apr 2020 18:20:50 -0400 Subject: [PATCH 06/80] [Alerting] fixes to allow pre-configured actions to be executed (#63432) resolves https://github.com/elastic/kibana/issues/63162 Most of the support for pre-configured actions has already been added to Kibana, except for one small piece. The ability for them to be executed. This PR adds that support. --- .../server/create_execute_function.test.ts | 67 +++++++++++++ .../actions/server/create_execute_function.ts | 25 ++++- .../server/lib/action_executor.test.ts | 2 + .../actions/server/lib/action_executor.ts | 72 +++++++++++--- .../server/lib/task_runner_factory.test.ts | 1 + x-pack/plugins/actions/server/plugin.ts | 2 + .../alerting_api_integration/common/config.ts | 21 +++++ .../es_index_preconfigured.ts | 68 ++++++++++++++ .../tests/actions/get_all.ts | 66 +++++++++++++ .../tests/actions/index.ts | 1 + .../tests/alerting/alerts.ts | 94 +++++++++++++++++++ .../spaces_only/tests/actions/get_all.ts | 44 +++++++++ 12 files changed, 445 insertions(+), 18 deletions(-) create mode 100644 x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/es_index_preconfigured.ts diff --git a/x-pack/plugins/actions/server/create_execute_function.test.ts b/x-pack/plugins/actions/server/create_execute_function.test.ts index 68c3967359ff4..6bdd30848e4b7 100644 --- a/x-pack/plugins/actions/server/create_execute_function.test.ts +++ b/x-pack/plugins/actions/server/create_execute_function.test.ts @@ -23,6 +23,7 @@ describe('execute()', () => { actionTypeRegistry: actionTypeRegistryMock.create(), getScopedSavedObjectsClient: jest.fn().mockReturnValueOnce(savedObjectsClient), isESOUsingEphemeralEncryptionKey: false, + preconfiguredActions: [], }); savedObjectsClient.get.mockResolvedValueOnce({ id: '123', @@ -68,6 +69,68 @@ describe('execute()', () => { }); }); + test('schedules the action with all given parameters with a preconfigured action', async () => { + const executeFn = createExecuteFunction({ + getBasePath, + taskManager: mockTaskManager, + actionTypeRegistry: actionTypeRegistryMock.create(), + getScopedSavedObjectsClient: jest.fn().mockReturnValueOnce(savedObjectsClient), + isESOUsingEphemeralEncryptionKey: false, + preconfiguredActions: [ + { + id: '123', + actionTypeId: 'mock-action-preconfigured', + config: {}, + isPreconfigured: true, + name: 'x', + secrets: {}, + }, + ], + }); + savedObjectsClient.get.mockResolvedValueOnce({ + id: '123', + type: 'action', + attributes: { + actionTypeId: 'mock-action', + }, + references: [], + }); + savedObjectsClient.create.mockResolvedValueOnce({ + id: '234', + type: 'action_task_params', + attributes: {}, + references: [], + }); + await executeFn({ + id: '123', + params: { baz: false }, + spaceId: 'default', + apiKey: Buffer.from('123:abc').toString('base64'), + }); + expect(mockTaskManager.schedule).toHaveBeenCalledTimes(1); + expect(mockTaskManager.schedule.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "params": Object { + "actionTaskParamsId": "234", + "spaceId": "default", + }, + "scope": Array [ + "actions", + ], + "state": Object {}, + "taskType": "actions:mock-action-preconfigured", + }, + ] + `); + expect(savedObjectsClient.get).not.toHaveBeenCalled(); + expect(savedObjectsClient.create).toHaveBeenCalledWith('action_task_params', { + actionId: '123', + params: { baz: false }, + apiKey: Buffer.from('123:abc').toString('base64'), + }); + }); + test('uses API key when provided', async () => { const getScopedSavedObjectsClient = jest.fn().mockReturnValueOnce(savedObjectsClient); const executeFn = createExecuteFunction({ @@ -76,6 +139,7 @@ describe('execute()', () => { getScopedSavedObjectsClient, isESOUsingEphemeralEncryptionKey: false, actionTypeRegistry: actionTypeRegistryMock.create(), + preconfiguredActions: [], }); savedObjectsClient.get.mockResolvedValueOnce({ id: '123', @@ -125,6 +189,7 @@ describe('execute()', () => { getScopedSavedObjectsClient, isESOUsingEphemeralEncryptionKey: false, actionTypeRegistry: actionTypeRegistryMock.create(), + preconfiguredActions: [], }); savedObjectsClient.get.mockResolvedValueOnce({ id: '123', @@ -171,6 +236,7 @@ describe('execute()', () => { getScopedSavedObjectsClient, isESOUsingEphemeralEncryptionKey: true, actionTypeRegistry: actionTypeRegistryMock.create(), + preconfiguredActions: [], }); await expect( executeFn({ @@ -193,6 +259,7 @@ describe('execute()', () => { getScopedSavedObjectsClient, isESOUsingEphemeralEncryptionKey: false, actionTypeRegistry: mockedActionTypeRegistry, + preconfiguredActions: [], }); mockedActionTypeRegistry.ensureActionTypeEnabled.mockImplementation(() => { throw new Error('Fail'); diff --git a/x-pack/plugins/actions/server/create_execute_function.ts b/x-pack/plugins/actions/server/create_execute_function.ts index 4bbcda4cba7fc..4a9ddf412b7cc 100644 --- a/x-pack/plugins/actions/server/create_execute_function.ts +++ b/x-pack/plugins/actions/server/create_execute_function.ts @@ -6,7 +6,12 @@ import { SavedObjectsClientContract } from '../../../../src/core/server'; import { TaskManagerStartContract } from '../../task_manager/server'; -import { GetBasePathFunction, RawAction, ActionTypeRegistryContract } from './types'; +import { + GetBasePathFunction, + RawAction, + ActionTypeRegistryContract, + PreConfiguredAction, +} from './types'; interface CreateExecuteFunctionOptions { taskManager: TaskManagerStartContract; @@ -14,6 +19,7 @@ interface CreateExecuteFunctionOptions { getBasePath: GetBasePathFunction; isESOUsingEphemeralEncryptionKey: boolean; actionTypeRegistry: ActionTypeRegistryContract; + preconfiguredActions: PreConfiguredAction[]; } export interface ExecuteOptions { @@ -29,6 +35,7 @@ export function createExecuteFunction({ actionTypeRegistry, getScopedSavedObjectsClient, isESOUsingEphemeralEncryptionKey, + preconfiguredActions, }: CreateExecuteFunctionOptions) { return async function execute({ id, params, spaceId, apiKey }: ExecuteOptions) { if (isESOUsingEphemeralEncryptionKey === true) { @@ -61,9 +68,9 @@ export function createExecuteFunction({ }; const savedObjectsClient = getScopedSavedObjectsClient(fakeRequest); - const actionSavedObject = await savedObjectsClient.get('action', id); + const actionTypeId = await getActionTypeId(id); - actionTypeRegistry.ensureActionTypeEnabled(actionSavedObject.attributes.actionTypeId); + actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); const actionTaskParamsRecord = await savedObjectsClient.create('action_task_params', { actionId: id, @@ -72,7 +79,7 @@ export function createExecuteFunction({ }); await taskManager.schedule({ - taskType: `actions:${actionSavedObject.attributes.actionTypeId}`, + taskType: `actions:${actionTypeId}`, params: { spaceId, actionTaskParamsId: actionTaskParamsRecord.id, @@ -80,5 +87,15 @@ export function createExecuteFunction({ state: {}, scope: ['actions'], }); + + async function getActionTypeId(actionId: string): Promise { + const pcAction = preconfiguredActions.find(action => action.id === actionId); + if (pcAction) { + return pcAction.actionTypeId; + } + + const actionSO = await savedObjectsClient.get('action', actionId); + return actionSO.attributes.actionTypeId; + } }; } diff --git a/x-pack/plugins/actions/server/lib/action_executor.test.ts b/x-pack/plugins/actions/server/lib/action_executor.test.ts index bbcb0457fc1d1..124e5951c714b 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.test.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.test.ts @@ -43,6 +43,7 @@ actionExecutor.initialize({ actionTypeRegistry, encryptedSavedObjectsPlugin, eventLogger: eventLoggerMock.create(), + preconfiguredActions: [], }); beforeEach(() => { @@ -232,6 +233,7 @@ test('throws an error when passing isESOUsingEphemeralEncryptionKey with value o actionTypeRegistry, encryptedSavedObjectsPlugin, eventLogger: eventLoggerMock.create(), + preconfiguredActions: [], }); await expect( customActionExecutor.execute(executeParams) diff --git a/x-pack/plugins/actions/server/lib/action_executor.ts b/x-pack/plugins/actions/server/lib/action_executor.ts index ba8bb79170c63..a33fb8830a930 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.ts @@ -11,6 +11,8 @@ import { ActionTypeRegistryContract, GetServicesFunction, RawAction, + PreConfiguredAction, + Services, } from '../types'; import { EncryptedSavedObjectsPluginStart } from '../../../encrypted_saved_objects/server'; import { SpacesServiceSetup } from '../../../spaces/server'; @@ -24,6 +26,7 @@ export interface ActionExecutorContext { encryptedSavedObjectsPlugin: EncryptedSavedObjectsPluginStart; actionTypeRegistry: ActionTypeRegistryContract; eventLogger: IEventLogger; + preconfiguredActions: PreConfiguredAction[]; } export interface ExecuteOptions { @@ -72,28 +75,22 @@ export class ActionExecutor { encryptedSavedObjectsPlugin, actionTypeRegistry, eventLogger, + preconfiguredActions, } = this.actionExecutorContext!; const services = getServices(request); const spaceId = spaces && spaces.getSpaceId(request); const namespace = spaceId && spaceId !== 'default' ? { namespace: spaceId } : {}; - // Ensure user can read the action before processing - const { - attributes: { actionTypeId, config, name }, - } = await services.savedObjectsClient.get('action', actionId); - - actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); - - // Only get encrypted attributes here, the remaining attributes can be fetched in - // the savedObjectsClient call - const { - attributes: { secrets }, - } = await encryptedSavedObjectsPlugin.getDecryptedAsInternalUser( - 'action', + const { actionTypeId, name, config, secrets } = await getActionInfo( + services, + encryptedSavedObjectsPlugin, + preconfiguredActions, actionId, - namespace + namespace.namespace ); + + actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); const actionType = actionTypeRegistry.get(actionTypeId); let validatedParams: Record; @@ -173,3 +170,50 @@ function actionErrorToMessage(result: ActionTypeExecutorResult): string { return message; } + +interface ActionInfo { + actionTypeId: string; + name: string; + config: any; + secrets: any; +} + +async function getActionInfo( + services: Services, + encryptedSavedObjectsPlugin: EncryptedSavedObjectsPluginStart, + preconfiguredActions: PreConfiguredAction[], + actionId: string, + namespace: string | undefined +): Promise { + // check to see if it's a pre-configured action first + const pcAction = preconfiguredActions.find( + preconfiguredAction => preconfiguredAction.id === actionId + ); + if (pcAction) { + return { + actionTypeId: pcAction.actionTypeId, + name: pcAction.name, + config: pcAction.config, + secrets: pcAction.secrets, + }; + } + + // if not pre-configured action, should be a saved object + // ensure user can read the action before processing + const { + attributes: { actionTypeId, config, name }, + } = await services.savedObjectsClient.get('action', actionId); + + const { + attributes: { secrets }, + } = await encryptedSavedObjectsPlugin.getDecryptedAsInternalUser('action', actionId, { + namespace: namespace === 'default' ? undefined : namespace, + }); + + return { + actionTypeId, + name, + config, + secrets, + }; +} diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts index 43882cef21170..f070f714ee508 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts @@ -61,6 +61,7 @@ const actionExecutorInitializerParams = { actionTypeRegistry, encryptedSavedObjectsPlugin: mockedEncryptedSavedObjectsPlugin, eventLogger: eventLoggerMock.create(), + preconfiguredActions: [], }; const taskRunnerFactoryInitializerParams = { spaceIdToNamespace, diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index 34c9e7aa9e8b8..ef3716070ab04 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -245,6 +245,7 @@ export class ActionsPlugin implements Plugin, Plugi getServices: this.getServicesFactory(core.savedObjects), encryptedSavedObjectsPlugin: plugins.encryptedSavedObjects, actionTypeRegistry: actionTypeRegistry!, + preconfiguredActions, }); taskRunnerFactory!.initialize({ @@ -265,6 +266,7 @@ export class ActionsPlugin implements Plugin, Plugi getScopedSavedObjectsClient: core.savedObjects.getScopedClient, getBasePath: this.getBasePath, isESOUsingEphemeralEncryptionKey: isESOUsingEphemeralEncryptionKey!, + preconfiguredActions, }), isActionTypeEnabled: id => { return this.actionTypeRegistry!.isActionTypeEnabled(id); diff --git a/x-pack/test/alerting_api_integration/common/config.ts b/x-pack/test/alerting_api_integration/common/config.ts index 4d32a5ae9f53c..457b7621e84bd 100644 --- a/x-pack/test/alerting_api_integration/common/config.ts +++ b/x-pack/test/alerting_api_integration/common/config.ts @@ -100,6 +100,27 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) xyzSecret2: 'credential2', }, }, + { + id: 'preconfigured-es-index-action', + actionTypeId: '.index', + name: 'preconfigured_es_index_action', + config: { + index: 'functional-test-actions-index-preconfigured', + refresh: true, + executionTimeField: 'timestamp', + }, + }, + { + id: 'preconfigured.test.index-record', + actionTypeId: 'test.index-record', + name: 'Test:_Preconfigured_Index_Record', + config: { + unencrypted: 'ignored-but-required', + }, + secrets: { + encrypted: 'this-is-also-ignored-and-also-required', + }, + }, ])}`, ...disabledPlugins.map(key => `--xpack.${key}.enabled=false`), `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`, diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/es_index_preconfigured.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/es_index_preconfigured.ts new file mode 100644 index 0000000000000..b04bc13ffc5e4 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/es_index_preconfigured.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +// from: x-pack/test/alerting_api_integration/common/config.ts +const ACTION_ID = 'preconfigured-es-index-action'; +const ES_TEST_INDEX_NAME = 'functional-test-actions-index-preconfigured'; + +// eslint-disable-next-line import/no-default-export +export default function indexTest({ getService }: FtrProviderContext) { + const es = getService('legacyEs'); + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + describe('preconfigured index action', () => { + after(() => esArchiver.unload('empty_kibana')); + beforeEach(() => clearTestIndex(es)); + + it('should execute successfully when expected for a single body', async () => { + const { body: result } = await supertest + .post(`/api/action/${ACTION_ID}/_execute`) + .set('kbn-xsrf', 'foo') + .send({ + params: { + documents: [{ testing: [4, 5, 6] }], + }, + }) + .expect(200); + expect(result.status).to.eql('ok'); + + const items = await getTestIndexItems(es); + expect(items.length).to.eql(1); + + // check document sans timestamp + const document = items[0]._source; + const timestamp = document.timestamp; + delete document.timestamp; + expect(document).to.eql({ testing: [4, 5, 6] }); + + // check timestamp + const timestampTime = new Date(timestamp).getTime(); + const timeNow = Date.now(); + const timeMinuteAgo = timeNow - 1000 * 60; + expect(timestampTime).to.be.within(timeMinuteAgo, timeNow); + }); + }); +} + +async function clearTestIndex(es: any) { + return await es.indices.delete({ + index: ES_TEST_INDEX_NAME, + ignoreUnavailable: true, + }); +} + +async function getTestIndexItems(es: any) { + const result = await es.search({ + index: ES_TEST_INDEX_NAME, + }); + + return result.hits.hits; +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/get_all.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/get_all.ts index 80b512f3fb5e3..0b637326d4667 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/get_all.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/get_all.ts @@ -68,6 +68,18 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 0, }, + { + id: 'preconfigured-es-index-action', + isPreconfigured: true, + actionTypeId: '.index', + name: 'preconfigured_es_index_action', + config: { + index: 'functional-test-actions-index-preconfigured', + refresh: true, + executionTimeField: 'timestamp', + }, + referencedByCount: 0, + }, { id: 'my-slack1', isPreconfigured: true, @@ -90,6 +102,16 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 0, }, + { + id: 'preconfigured.test.index-record', + isPreconfigured: true, + actionTypeId: 'test.index-record', + name: 'Test:_Preconfigured_Index_Record', + config: { + unencrypted: 'ignored-but-required', + }, + referencedByCount: 0, + }, ]); break; default: @@ -167,6 +189,18 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 1, }, + { + id: 'preconfigured-es-index-action', + isPreconfigured: true, + actionTypeId: '.index', + name: 'preconfigured_es_index_action', + config: { + index: 'functional-test-actions-index-preconfigured', + refresh: true, + executionTimeField: 'timestamp', + }, + referencedByCount: 0, + }, { id: 'my-slack1', isPreconfigured: true, @@ -189,6 +223,16 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 0, }, + { + id: 'preconfigured.test.index-record', + isPreconfigured: true, + actionTypeId: 'test.index-record', + name: 'Test:_Preconfigured_Index_Record', + config: { + unencrypted: 'ignored-but-required', + }, + referencedByCount: 0, + }, ]); break; default: @@ -232,6 +276,18 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { case 'superuser at space1': expect(response.statusCode).to.eql(200); expect(response.body).to.eql([ + { + id: 'preconfigured-es-index-action', + isPreconfigured: true, + actionTypeId: '.index', + name: 'preconfigured_es_index_action', + config: { + index: 'functional-test-actions-index-preconfigured', + refresh: true, + executionTimeField: 'timestamp', + }, + referencedByCount: 0, + }, { id: 'my-slack1', isPreconfigured: true, @@ -254,6 +310,16 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 0, }, + { + id: 'preconfigured.test.index-record', + isPreconfigured: true, + actionTypeId: 'test.index-record', + name: 'Test:_Preconfigured_Index_Record', + config: { + unencrypted: 'ignored-but-required', + }, + referencedByCount: 0, + }, ]); break; default: diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/index.ts index d7ec2e78ccb30..8e002bcc8d3da 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/index.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/index.ts @@ -11,6 +11,7 @@ export default function actionsTests({ loadTestFile }: FtrProviderContext) { describe('Actions', () => { loadTestFile(require.resolve('./builtin_action_types/email')); loadTestFile(require.resolve('./builtin_action_types/es_index')); + loadTestFile(require.resolve('./builtin_action_types/es_index_preconfigured')); loadTestFile(require.resolve('./builtin_action_types/pagerduty')); loadTestFile(require.resolve('./builtin_action_types/server_log')); loadTestFile(require.resolve('./builtin_action_types/servicenow')); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/alerts.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/alerts.ts index 6eed28cc381dd..d8e4f808f5cd2 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/alerts.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/alerts.ts @@ -165,6 +165,100 @@ instanceStateValue: true } }); + it('should schedule task, run alert and schedule preconfigured actions when appropriate', async () => { + const testStart = new Date(); + const reference = alertUtils.generateReference(); + const response = await alertUtils.createAlwaysFiringAction({ + reference, + indexRecordActionId: 'preconfigured.test.index-record', + }); + + switch (scenario.id) { + case 'no_kibana_privileges at space1': + case 'global_read at space1': + case 'space_1_all at space2': + expect(response.statusCode).to.eql(404); + expect(response.body).to.eql({ + statusCode: 404, + error: 'Not Found', + message: 'Not Found', + }); + break; + case 'superuser at space1': + case 'space_1_all at space1': + expect(response.statusCode).to.eql(200); + + // Wait for the action to index a document before disabling the alert and waiting for tasks to finish + await esTestIndexTool.waitForDocs('action:test.index-record', reference); + + await taskManagerUtils.waitForAllTasksIdle(testStart); + + const alertId = response.body.id; + await alertUtils.disable(alertId); + await taskManagerUtils.waitForEmpty(testStart); + + // Ensure only 1 alert executed with proper params + const alertSearchResult = await esTestIndexTool.search( + 'alert:test.always-firing', + reference + ); + expect(alertSearchResult.hits.total.value).to.eql(1); + expect(alertSearchResult.hits.hits[0]._source).to.eql({ + source: 'alert:test.always-firing', + reference, + state: {}, + params: { + index: ES_TEST_INDEX_NAME, + reference, + }, + alertInfo: { + alertId, + spaceId: space.id, + namespace: space.id, + name: 'abc', + tags: ['tag-A', 'tag-B'], + createdBy: user.fullName, + updatedBy: user.fullName, + }, + }); + + // Ensure only 1 action executed with proper params + const actionSearchResult = await esTestIndexTool.search( + 'action:test.index-record', + reference + ); + expect(actionSearchResult.hits.total.value).to.eql(1); + expect(actionSearchResult.hits.hits[0]._source).to.eql({ + config: { + unencrypted: 'ignored-but-required', + }, + secrets: { + encrypted: 'this-is-also-ignored-and-also-required', + }, + params: { + index: ES_TEST_INDEX_NAME, + reference, + message: ` +alertId: ${alertId}, +alertName: abc, +spaceId: ${space.id}, +tags: tag-A,tag-B, +alertInstanceId: 1, +instanceContextValue: true, +instanceStateValue: true +`.trim(), + }, + reference, + source: 'action:test.index-record', + }); + + await taskManagerUtils.waitForActionTaskParamsToBeCleanedUp(testStart); + break; + default: + throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); + } + }); + it('should pass updated alert params to executor', async () => { const testStart = new Date(); // create an alert diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/get_all.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/get_all.ts index 517c64f178af5..ec59e56b08308 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/get_all.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/get_all.ts @@ -45,6 +45,18 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 0, }, + { + id: 'preconfigured-es-index-action', + isPreconfigured: true, + actionTypeId: '.index', + name: 'preconfigured_es_index_action', + config: { + index: 'functional-test-actions-index-preconfigured', + refresh: true, + executionTimeField: 'timestamp', + }, + referencedByCount: 0, + }, { id: 'my-slack1', isPreconfigured: true, @@ -67,6 +79,16 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 0, }, + { + id: 'preconfigured.test.index-record', + isPreconfigured: true, + actionTypeId: 'test.index-record', + name: 'Test:_Preconfigured_Index_Record', + config: { + unencrypted: 'ignored-but-required', + }, + referencedByCount: 0, + }, ]); }); @@ -88,6 +110,18 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { objectRemover.add(Spaces.space1.id, createdAction.id, 'action'); await supertest.get(`${getUrlPrefix(Spaces.other.id)}/api/action/_getAll`).expect(200, [ + { + id: 'preconfigured-es-index-action', + isPreconfigured: true, + actionTypeId: '.index', + name: 'preconfigured_es_index_action', + config: { + index: 'functional-test-actions-index-preconfigured', + refresh: true, + executionTimeField: 'timestamp', + }, + referencedByCount: 0, + }, { id: 'my-slack1', isPreconfigured: true, @@ -110,6 +144,16 @@ export default function getAllActionTests({ getService }: FtrProviderContext) { }, referencedByCount: 0, }, + { + id: 'preconfigured.test.index-record', + isPreconfigured: true, + actionTypeId: 'test.index-record', + name: 'Test:_Preconfigured_Index_Record', + config: { + unencrypted: 'ignored-but-required', + }, + referencedByCount: 0, + }, ]); }); }); From bf63b56f833c8657cb249c0a69805acc47608550 Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Tue, 14 Apr 2020 18:32:05 -0500 Subject: [PATCH 07/80] Disable adding conditions when in alert management context. (#63514) * Disable adding conditions when in alert manament context. * Fix typo * Change id for i18n string --- .../alerting/metrics/expression.tsx | 179 ++++++++++++------ 1 file changed, 117 insertions(+), 62 deletions(-) diff --git a/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx b/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx index 2430fe78e2053..6cf4e5bed2e6f 100644 --- a/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx +++ b/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx @@ -17,6 +17,9 @@ import { import { IFieldType } from 'src/plugins/data/public'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; +import { EuiExpression } from '@elastic/eui'; +import { EuiCallOut } from '@elastic/eui'; +import { EuiLink } from '@elastic/eui'; import { MetricExpressionParams, Comparator, @@ -208,6 +211,37 @@ export const Expressions: React.FC = props => { } }, [alertsContext.metadata, defaultExpression, source]); // eslint-disable-line react-hooks/exhaustive-deps + // INFO: If there is metadata, you're in the metrics explorer context + const canAddConditions = !!alertsContext.metadata; + + if (!canAddConditions && !alertParams.criteria) { + return ( + <> + + + {' '} + + + + . + + } + color="warning" + iconType="help" + /> + + + ); + } + return ( <> @@ -224,6 +258,7 @@ export const Expressions: React.FC = props => { alertParams.criteria.map((e, idx) => { return ( 1} fields={derivedIndexPattern.fields} remove={removeExpression} @@ -246,62 +281,65 @@ export const Expressions: React.FC = props => { />

- - - - - - {alertsContext.metadata && ( - - - + <> + + + + + + + + + )} ); @@ -309,6 +347,7 @@ export const Expressions: React.FC = props => { interface ExpressionRowProps { fields: IFieldType[]; + canEditAggField: boolean; expressionId: number; expression: MetricExpression; errors: IErrorObject; @@ -379,17 +418,20 @@ export const ExpressionRow: React.FC = props => { {aggType !== 'count' && ( - ({ - normalizedType: f.type, - name: f.name, - }))} - aggType={aggType} - errors={errors} - onChangeSelectedAggField={updateMetric} - /> + {!props.canEditAggField && } + {props.canEditAggField && ( + ({ + normalizedType: f.type, + name: f.name, + }))} + aggType={aggType} + errors={errors} + onChangeSelectedAggField={updateMetric} + /> + )} )} @@ -421,6 +463,19 @@ export const ExpressionRow: React.FC = props => { ); }; +export const DisabledAggField = ({ text }: { text: string }) => { + return ( + + ); +}; + export const aggregationType: { [key: string]: any } = { avg: { text: i18n.translate('xpack.infra.metrics.alertFlyout.aggregationText.avg', { From 8264352bbe27c527e2738aaf95bf9c4e51fa294b Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Wed, 15 Apr 2020 08:33:10 +0200 Subject: [PATCH 08/80] [Discover] Fix broken setting of bucketInterval (#62939) * Fix broken setting of bucketInterval, remove $watch * Fix and adapt functional tests --- .../discover/np_ready/angular/discover.html | 1 + .../discover/np_ready/angular/discover.js | 14 +++---------- .../apps/discover/_discover_histogram.js | 20 +++++++++---------- test/functional/page_objects/discover_page.ts | 5 +++++ 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html index d068e824a3e0a..1221b01657e45 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.html @@ -140,6 +140,7 @@

{{screenTitle}}

position="'top'" > Date: Wed, 15 Apr 2020 11:16:36 +0300 Subject: [PATCH 09/80] [data.search.aggs] Remove service getters from agg types (AggConfig part) (#62548) * removed getFieldFormats from aggConfig * made new properties is private * Fixed ci * Fixed tests * Fixes clone method * move filedFotmats inside opt fro AggConfigs * Added readonly Co-authored-by: Elastic Machine --- .../new_platform/new_platform.karma_mock.js | 1 + src/plugins/data/public/plugin.ts | 2 +- .../public/search/aggs/agg_config.test.ts | 34 +++++++------- .../data/public/search/aggs/agg_config.ts | 19 +++++--- .../public/search/aggs/agg_configs.test.ts | 44 +++++++++++-------- .../data/public/search/aggs/agg_configs.ts | 17 +++++-- .../_terms_other_bucket_helper.test.ts | 5 ++- .../create_filter/date_histogram.test.ts | 5 ++- .../buckets/create_filter/date_range.test.ts | 5 ++- .../buckets/create_filter/filters.test.ts | 5 ++- .../buckets/create_filter/histogram.test.ts | 4 +- .../buckets/create_filter/ip_range.test.ts | 5 ++- .../aggs/buckets/create_filter/range.test.ts | 5 ++- .../aggs/buckets/create_filter/terms.test.ts | 1 + .../search/aggs/buckets/date_range.test.ts | 5 ++- .../search/aggs/buckets/geo_hash.test.ts | 5 ++- .../search/aggs/buckets/histogram.test.ts | 5 ++- .../public/search/aggs/buckets/range.test.ts | 5 ++- .../aggs/buckets/significant_terms.test.ts | 1 + .../public/search/aggs/buckets/terms.test.ts | 4 +- .../public/search/aggs/metrics/median.test.ts | 5 ++- .../aggs/metrics/parent_pipeline.test.ts | 2 +- .../aggs/metrics/percentile_ranks.test.ts | 2 +- .../search/aggs/metrics/percentiles.test.ts | 2 +- .../aggs/metrics/sibling_pipeline.test.ts | 2 +- .../search/aggs/metrics/std_deviation.test.ts | 2 +- .../search/aggs/metrics/top_hit.test.ts | 2 +- src/plugins/data/public/search/aggs/mocks.ts | 2 + .../search/expressions/create_filter.test.ts | 4 +- .../data/public/search/search_service.ts | 13 +++++- .../public/search/tabify/get_columns.test.ts | 3 ++ .../search/tabify/response_writer.test.ts | 3 ++ .../data/public/search/tabify/tabify.test.ts | 3 ++ 33 files changed, 156 insertions(+), 66 deletions(-) diff --git a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js index 33a7fdad065b4..f577a29ce90b9 100644 --- a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js +++ b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js @@ -453,6 +453,7 @@ export const npStart = { createAggConfigs: (indexPattern, configStates = []) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: aggTypesRegistry.start(), + fieldFormats: getFieldFormatsRegistry(mockCoreStart), }); }, types: aggTypesRegistry.start(), diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 2ebe377b3b32f..1723545b32522 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -155,7 +155,7 @@ export class DataPublicPlugin implements Plugin { let indexPattern: IndexPattern; let typesRegistry: AggTypesRegistryStart; + const fieldFormats = fieldFormatsServiceMock.createStartContract(); beforeEach(() => { jest.restoreAllMocks(); @@ -40,7 +42,7 @@ describe('AggConfig', () => { describe('#toDsl', () => { it('calls #write()', () => { - const ac = new AggConfigs(indexPattern, [], { typesRegistry }); + const ac = new AggConfigs(indexPattern, [], { typesRegistry, fieldFormats }); const configStates = { enabled: true, type: 'date_histogram', @@ -55,7 +57,7 @@ describe('AggConfig', () => { }); it('uses the type name as the agg name', () => { - const ac = new AggConfigs(indexPattern, [], { typesRegistry }); + const ac = new AggConfigs(indexPattern, [], { typesRegistry, fieldFormats }); const configStates = { enabled: true, type: 'date_histogram', @@ -70,7 +72,7 @@ describe('AggConfig', () => { }); it('uses the params from #write() output as the agg params', () => { - const ac = new AggConfigs(indexPattern, [], { typesRegistry }); + const ac = new AggConfigs(indexPattern, [], { typesRegistry, fieldFormats }); const configStates = { enabled: true, type: 'date_histogram', @@ -100,7 +102,7 @@ describe('AggConfig', () => { params: {}, }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const histoConfig = ac.byName('date_histogram')[0]; const avgConfig = ac.byName('avg')[0]; @@ -210,8 +212,8 @@ describe('AggConfig', () => { testsIdentical.forEach((configState, index) => { it(`identical aggregations (${index})`, () => { - const ac1 = new AggConfigs(indexPattern, configState, { typesRegistry }); - const ac2 = new AggConfigs(indexPattern, configState, { typesRegistry }); + const ac1 = new AggConfigs(indexPattern, configState, { typesRegistry, fieldFormats }); + const ac2 = new AggConfigs(indexPattern, configState, { typesRegistry, fieldFormats }); expect(ac1.jsonDataEquals(ac2.aggs)).toBe(true); }); }); @@ -251,8 +253,8 @@ describe('AggConfig', () => { testsIdenticalDifferentOrder.forEach((test, index) => { it(`identical aggregations (${index}) - init json is in different order`, () => { - const ac1 = new AggConfigs(indexPattern, test.config1, { typesRegistry }); - const ac2 = new AggConfigs(indexPattern, test.config2, { typesRegistry }); + const ac1 = new AggConfigs(indexPattern, test.config1, { typesRegistry, fieldFormats }); + const ac2 = new AggConfigs(indexPattern, test.config2, { typesRegistry, fieldFormats }); expect(ac1.jsonDataEquals(ac2.aggs)).toBe(true); }); }); @@ -316,8 +318,8 @@ describe('AggConfig', () => { testsDifferent.forEach((test, index) => { it(`different aggregations (${index})`, () => { - const ac1 = new AggConfigs(indexPattern, test.config1, { typesRegistry }); - const ac2 = new AggConfigs(indexPattern, test.config2, { typesRegistry }); + const ac1 = new AggConfigs(indexPattern, test.config1, { typesRegistry, fieldFormats }); + const ac2 = new AggConfigs(indexPattern, test.config2, { typesRegistry, fieldFormats }); expect(ac1.jsonDataEquals(ac2.aggs)).toBe(false); }); }); @@ -325,7 +327,7 @@ describe('AggConfig', () => { describe('#toJSON', () => { it('includes the aggs id, params, type and schema', () => { - const ac = new AggConfigs(indexPattern, [], { typesRegistry }); + const ac = new AggConfigs(indexPattern, [], { typesRegistry, fieldFormats }); const configStates = { enabled: true, type: 'date_histogram', @@ -356,8 +358,8 @@ describe('AggConfig', () => { params: {}, }, ]; - const ac1 = new AggConfigs(indexPattern, configStates, { typesRegistry }); - const ac2 = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac1 = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); + const ac2 = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); // this relies on the assumption that js-engines consistently loop over properties in insertion order. // most likely the case, but strictly speaking not guaranteed by the JS and JSON specifications. @@ -369,7 +371,7 @@ describe('AggConfig', () => { let aggConfig: AggConfig; beforeEach(() => { - const ac = new AggConfigs(indexPattern, [], { typesRegistry }); + const ac = new AggConfigs(indexPattern, [], { typesRegistry, fieldFormats }); aggConfig = ac.createAggConfig({ type: 'count' } as CreateAggConfigParams); }); @@ -398,7 +400,7 @@ describe('AggConfig', () => { describe('#fieldFormatter - custom getFormat handler', () => { it('returns formatter from getFormat handler', () => { - const ac = new AggConfigs(indexPattern, [], { typesRegistry }); + const ac = new AggConfigs(indexPattern, [], { typesRegistry, fieldFormats }); const configStates = { enabled: true, type: 'count', @@ -439,7 +441,7 @@ describe('AggConfig', () => { }, }, }; - const ac = new AggConfigs(indexPattern, [configStates], { typesRegistry }); + const ac = new AggConfigs(indexPattern, [configStates], { typesRegistry, fieldFormats }); aggConfig = ac.createAggConfig(configStates); }); diff --git a/src/plugins/data/public/search/aggs/agg_config.ts b/src/plugins/data/public/search/aggs/agg_config.ts index d6948aaade63d..6188849e0e6d4 100644 --- a/src/plugins/data/public/search/aggs/agg_config.ts +++ b/src/plugins/data/public/search/aggs/agg_config.ts @@ -25,7 +25,7 @@ import { IAggConfigs } from './agg_configs'; import { FetchOptions } from '../fetch'; import { ISearchSource } from '../search_source'; import { FieldFormatsContentType, KBN_FIELD_TYPES } from '../../../common'; -import { getFieldFormats } from '../../../public/services'; +import { FieldFormatsStart } from '../../field_formats'; export interface AggConfigOptions { type: IAggType; @@ -35,6 +35,10 @@ export interface AggConfigOptions { schema?: string; } +export interface AggConfigDependencies { + fieldFormats: FieldFormatsStart; +} + /** * @name AggConfig * @@ -93,8 +97,13 @@ export class AggConfig { private __type: IAggType; private __typeDecorations: any; private subAggs: AggConfig[] = []; + private readonly fieldFormats: FieldFormatsStart; - constructor(aggConfigs: IAggConfigs, opts: AggConfigOptions) { + constructor( + aggConfigs: IAggConfigs, + opts: AggConfigOptions, + { fieldFormats }: AggConfigDependencies + ) { this.aggConfigs = aggConfigs; this.id = String(opts.id || AggConfig.nextId(aggConfigs.aggs as any)); this.enabled = typeof opts.enabled === 'boolean' ? opts.enabled : true; @@ -115,6 +124,8 @@ export class AggConfig { // @ts-ignore this.__type = this.__type; + + this.fieldFormats = fieldFormats; } /** @@ -341,12 +352,10 @@ export class AggConfig { } fieldOwnFormatter(contentType?: FieldFormatsContentType, defaultFormat?: any) { - const fieldFormatsService = getFieldFormats(); - const field = this.getField(); let format = field && field.format; if (!format) format = defaultFormat; - if (!format) format = fieldFormatsService.getDefaultInstance(KBN_FIELD_TYPES.STRING); + if (!format) format = this.fieldFormats.getDefaultInstance(KBN_FIELD_TYPES.STRING); return format.getConverterFor(contentType); } diff --git a/src/plugins/data/public/search/aggs/agg_configs.test.ts b/src/plugins/data/public/search/aggs/agg_configs.test.ts index e20e6de6112a8..653bf6a266df6 100644 --- a/src/plugins/data/public/search/aggs/agg_configs.test.ts +++ b/src/plugins/data/public/search/aggs/agg_configs.test.ts @@ -24,10 +24,12 @@ import { AggTypesRegistryStart } from './agg_types_registry'; import { mockDataServices, mockAggTypesRegistry } from './test_helpers'; import { Field as IndexPatternField, IndexPattern } from '../../index_patterns'; import { stubIndexPattern, stubIndexPatternWithFields } from '../../../public/stubs'; +import { fieldFormatsServiceMock } from '../../field_formats/mocks'; describe('AggConfigs', () => { let indexPattern: IndexPattern; let typesRegistry: AggTypesRegistryStart; + const fieldFormats = fieldFormatsServiceMock.createStartContract(); beforeEach(() => { mockDataServices(); @@ -45,7 +47,7 @@ describe('AggConfigs', () => { }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); expect(ac.aggs).toHaveLength(1); }); @@ -70,7 +72,7 @@ describe('AggConfigs', () => { ]; const spy = jest.spyOn(AggConfig, 'ensureIds'); - new AggConfigs(indexPattern, configStates, { typesRegistry }); + new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); expect(spy).toHaveBeenCalledTimes(1); expect(spy.mock.calls[0]).toEqual([configStates]); spy.mockRestore(); @@ -92,16 +94,20 @@ describe('AggConfigs', () => { }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); expect(ac.aggs).toHaveLength(2); ac.createAggConfig( - new AggConfig(ac, { - enabled: true, - type: typesRegistry.get('terms'), - params: {}, - schema: 'split', - }) + new AggConfig( + ac, + { + enabled: true, + type: typesRegistry.get('terms'), + params: {}, + schema: 'split', + }, + { fieldFormats } + ) ); expect(ac.aggs).toHaveLength(3); }); @@ -115,7 +121,7 @@ describe('AggConfigs', () => { }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); expect(ac.aggs).toHaveLength(1); ac.createAggConfig({ @@ -136,7 +142,7 @@ describe('AggConfigs', () => { }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); expect(ac.aggs).toHaveLength(1); ac.createAggConfig( @@ -164,7 +170,7 @@ describe('AggConfigs', () => { { type: 'percentiles', enabled: true, params: {}, schema: 'metric' }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const sorted = ac.getRequestAggs(); const aggs = indexBy(ac.aggs, agg => agg.type.name); @@ -187,7 +193,7 @@ describe('AggConfigs', () => { { type: 'count', enabled: true, params: {}, schema: 'metric' }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const sorted = ac.getResponseAggs(); const aggs = indexBy(ac.aggs, agg => agg.type.name); @@ -204,7 +210,7 @@ describe('AggConfigs', () => { { type: 'percentiles', enabled: true, params: { percents: [1, 2, 3] }, schema: 'metric' }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const sorted = ac.getResponseAggs(); const aggs = indexBy(ac.aggs, agg => agg.type.name); @@ -225,7 +231,7 @@ describe('AggConfigs', () => { it('uses the sorted aggs', () => { const configStates = [{ enabled: true, type: 'avg', params: { field: 'bytes' } }]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const spy = jest.spyOn(AggConfigs.prototype, 'getRequestAggs'); ac.toDsl(); expect(spy).toHaveBeenCalledTimes(1); @@ -241,6 +247,7 @@ describe('AggConfigs', () => { const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, + fieldFormats, }); const aggInfos = ac.aggs.map(aggConfig => { @@ -284,7 +291,7 @@ describe('AggConfigs', () => { }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const dsl = ac.toDsl(); const histo = ac.byName('date_histogram')[0]; const count = ac.byName('count')[0]; @@ -311,6 +318,7 @@ describe('AggConfigs', () => { const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, + fieldFormats, }); const dsl = ac.toDsl(); const histo = ac.byName('date_histogram')[0]; @@ -336,7 +344,7 @@ describe('AggConfigs', () => { { enabled: true, type: 'max', schema: 'metric', params: { field: 'bytes' } }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const topLevelDsl = ac.toDsl(true); const buckets = ac.bySchemaName('buckets'); const metrics = ac.bySchemaName('metrics'); @@ -406,7 +414,7 @@ describe('AggConfigs', () => { }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, fieldFormats }); const topLevelDsl = ac.toDsl(true)['2']; expect(Object.keys(topLevelDsl.aggs)).toContain('1'); diff --git a/src/plugins/data/public/search/aggs/agg_configs.ts b/src/plugins/data/public/search/aggs/agg_configs.ts index c441b2a0eb46f..5ad09f824d3e4 100644 --- a/src/plugins/data/public/search/aggs/agg_configs.ts +++ b/src/plugins/data/public/search/aggs/agg_configs.ts @@ -28,6 +28,7 @@ import { IndexPattern } from '../../index_patterns'; import { ISearchSource } from '../search_source'; import { FetchOptions } from '../fetch'; import { TimeRange } from '../../../common'; +import { FieldFormatsStart } from '../../field_formats'; function removeParentAggs(obj: any) { for (const prop in obj) { @@ -47,6 +48,7 @@ function parseParentAggs(dslLvlCursor: any, dsl: any) { export interface AggConfigsOptions { typesRegistry: AggTypesRegistryStart; + fieldFormats: FieldFormatsStart; } export type CreateAggConfigParams = Assign; @@ -68,6 +70,7 @@ export type IAggConfigs = AggConfigs; export class AggConfigs { public indexPattern: IndexPattern; public timeRange?: TimeRange; + private readonly fieldFormats: FieldFormatsStart; private readonly typesRegistry: AggTypesRegistryStart; aggs: IAggConfig[]; @@ -83,6 +86,7 @@ export class AggConfigs { this.aggs = []; this.indexPattern = indexPattern; + this.fieldFormats = opts.fieldFormats; configStates.forEach((params: any) => this.createAggConfig(params)); } @@ -113,6 +117,7 @@ export class AggConfigs { const aggConfigs = new AggConfigs(this.indexPattern, this.aggs.filter(filterAggs), { typesRegistry: this.typesRegistry, + fieldFormats: this.fieldFormats, }); return aggConfigs; @@ -129,10 +134,14 @@ export class AggConfigs { aggConfig = params; params.parent = this; } else { - aggConfig = new AggConfig(this, { - ...params, - type: typeof type === 'string' ? this.typesRegistry.get(type) : type, - }); + aggConfig = new AggConfig( + this, + { + ...params, + type: typeof type === 'string' ? this.typesRegistry.get(type) : type, + }, + { fieldFormats: this.fieldFormats } + ); } if (addToAggConfigs) { diff --git a/src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.test.ts b/src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.test.ts index c664325a168b1..44d99375bbd30 100644 --- a/src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/_terms_other_bucket_helper.test.ts @@ -26,6 +26,7 @@ import { AggConfigs, CreateAggConfigParams } from '../agg_configs'; import { BUCKET_TYPES } from './bucket_agg_types'; import { IBucketAggConfig } from './bucket_agg_type'; import { mockAggTypesRegistry } from '../test_helpers'; +import { fieldFormatsServiceMock } from '../../../field_formats/mocks'; const indexPattern = { id: '1234', @@ -219,8 +220,10 @@ const nestedOtherResponse = { describe('Terms Agg Other bucket helper', () => { const typesRegistry = mockAggTypesRegistry(); + const fieldFormats = fieldFormatsServiceMock.createStartContract(); + const getAggConfigs = (aggs: CreateAggConfigParams[] = []) => { - return new AggConfigs(indexPattern, [...aggs], { typesRegistry }); + return new AggConfigs(indexPattern, [...aggs], { typesRegistry, fieldFormats }); }; describe('buildOtherBucketAgg', () => { diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts index 97c940b4ff4b1..7778fcb36bcd6 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/date_histogram.test.ts @@ -78,7 +78,10 @@ describe('AggConfig Filters', () => { params: { field: field.name, interval, customInterval: '5d' }, }, ], - { typesRegistry: mockAggTypesRegistry([getDateHistogramBucketAgg(aggTypesDependencies)]) } + { + typesRegistry: mockAggTypesRegistry([getDateHistogramBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); const bucketKey = 1422579600000; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts index 8c0466b769a7e..4207fa92736f8 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/date_range.test.ts @@ -72,7 +72,10 @@ describe('AggConfig Filters', () => { }, }, ], - { typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]) } + { + typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts index f5a0b5a7b9094..bf05f7463db6c 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/filters.test.ts @@ -69,7 +69,10 @@ describe('AggConfig Filters', () => { }, }, ], - { typesRegistry: mockAggTypesRegistry([getFiltersBucketAgg(aggTypesDependencies)]) } + { + typesRegistry: mockAggTypesRegistry([getFiltersBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts index 18b388be74877..396d515f3b580 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/histogram.test.ts @@ -23,10 +23,12 @@ import { mockAggTypesRegistry } from '../../test_helpers'; import { BUCKET_TYPES } from '../bucket_agg_types'; import { IBucketAggConfig } from '../bucket_agg_type'; import { BytesFormat, FieldFormatsGetConfigFn } from '../../../../../common'; +import { fieldFormatsServiceMock } from '../../../../field_formats/mocks'; describe('AggConfig Filters', () => { describe('histogram', () => { const getConfig = (() => {}) as FieldFormatsGetConfigFn; + const fieldFormats = fieldFormatsServiceMock.createStartContract(); const getAggConfigs = () => { const field = { name: 'bytes', @@ -55,7 +57,7 @@ describe('AggConfig Filters', () => { }, }, ], - { typesRegistry: mockAggTypesRegistry() } + { typesRegistry: mockAggTypesRegistry(), fieldFormats } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts index b528313b080d0..d85576a0ccb14 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/ip_range.test.ts @@ -29,10 +29,11 @@ import { notificationServiceMock } from '../../../../../../../core/public/mocks' describe('AggConfig Filters', () => { describe('IP range', () => { + const fieldFormats = fieldFormatsServiceMock.createStartContract(); const typesRegistry = mockAggTypesRegistry([ getIpRangeBucketAgg({ getInternalStartServices: () => ({ - fieldFormats: fieldFormatsServiceMock.createStartContract(), + fieldFormats, notifications: notificationServiceMock.createStartContract(), }), }), @@ -52,7 +53,7 @@ describe('AggConfig Filters', () => { }, } as any; - return new AggConfigs(indexPattern, aggs, { typesRegistry }); + return new AggConfigs(indexPattern, aggs, { typesRegistry, fieldFormats }); }; test('should return a range filter for ip_range agg', () => { diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/range.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/range.test.ts index 14a7538aa95a4..cadd8e9fe13ed 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/range.test.ts @@ -71,7 +71,10 @@ describe('AggConfig Filters', () => { }, }, ], - { typesRegistry: mockAggTypesRegistry([getRangeBucketAgg(aggTypesDependencies)]) } + { + typesRegistry: mockAggTypesRegistry([getRangeBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts b/src/plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts index c11a7d1a4e6b8..d9ff63613b640 100644 --- a/src/plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/create_filter/terms.test.ts @@ -58,6 +58,7 @@ describe('AggConfig Filters', () => { return new AggConfigs(indexPattern, aggs, { typesRegistry: mockAggTypesRegistry([getTermsBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, }); }; diff --git a/src/plugins/data/public/search/aggs/buckets/date_range.test.ts b/src/plugins/data/public/search/aggs/buckets/date_range.test.ts index c050620c3a856..f78f0cce732e7 100644 --- a/src/plugins/data/public/search/aggs/buckets/date_range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/date_range.test.ts @@ -74,7 +74,10 @@ describe('date_range params', () => { params, }, ], - { typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]) } + { + typesRegistry: mockAggTypesRegistry([getDateRangeBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts b/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts index 24270dd33a576..226faefe43482 100644 --- a/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/geo_hash.test.ts @@ -77,7 +77,10 @@ describe('Geohash Agg', () => { }, }, ], - { typesRegistry: mockAggTypesRegistry() } + { + typesRegistry: mockAggTypesRegistry(), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/histogram.test.ts b/src/plugins/data/public/search/aggs/buckets/histogram.test.ts index bbfc263df4268..a55c32951232a 100644 --- a/src/plugins/data/public/search/aggs/buckets/histogram.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/histogram.test.ts @@ -70,7 +70,10 @@ describe('Histogram Agg', () => { params, }, ], - { typesRegistry: mockAggTypesRegistry([getHistogramBucketAgg(aggTypesDependencies)]) } + { + typesRegistry: mockAggTypesRegistry([getHistogramBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/range.test.ts b/src/plugins/data/public/search/aggs/buckets/range.test.ts index a1f0ab6a2326a..144d2b779e950 100644 --- a/src/plugins/data/public/search/aggs/buckets/range.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/range.test.ts @@ -95,7 +95,10 @@ describe('Range Agg', () => { }, }, ], - { typesRegistry: mockAggTypesRegistry([getRangeBucketAgg(aggTypesDependencies)]) } + { + typesRegistry: mockAggTypesRegistry([getRangeBucketAgg(aggTypesDependencies)]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts b/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts index 761d0ced6a114..d0ace5a50c28d 100644 --- a/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/significant_terms.test.ts @@ -70,6 +70,7 @@ describe('Significant Terms Agg', () => { typesRegistry: mockAggTypesRegistry([ getSignificantTermsBucketAgg(aggTypesDependencies), ]), + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, } ); }; diff --git a/src/plugins/data/public/search/aggs/buckets/terms.test.ts b/src/plugins/data/public/search/aggs/buckets/terms.test.ts index 5afe7d0b0c35c..0dc052bd1fdf6 100644 --- a/src/plugins/data/public/search/aggs/buckets/terms.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/terms.test.ts @@ -20,9 +20,11 @@ import { AggConfigs } from '../agg_configs'; import { mockAggTypesRegistry } from '../test_helpers'; import { BUCKET_TYPES } from './bucket_agg_types'; +import { fieldFormatsServiceMock } from '../../../field_formats/mocks'; describe('Terms Agg', () => { describe('order agg editor UI', () => { + const fieldFormats = fieldFormatsServiceMock.createStartContract(); const getAggConfigs = (params: Record = {}) => { const indexPattern = { id: '1234', @@ -47,7 +49,7 @@ describe('Terms Agg', () => { type: BUCKET_TYPES.TERMS, }, ], - { typesRegistry: mockAggTypesRegistry() } + { typesRegistry: mockAggTypesRegistry(), fieldFormats } ); }; diff --git a/src/plugins/data/public/search/aggs/metrics/median.test.ts b/src/plugins/data/public/search/aggs/metrics/median.test.ts index f80c46026f50a..de3ca646ead9e 100644 --- a/src/plugins/data/public/search/aggs/metrics/median.test.ts +++ b/src/plugins/data/public/search/aggs/metrics/median.test.ts @@ -59,7 +59,10 @@ describe('AggTypeMetricMedianProvider class', () => { }, }, ], - { typesRegistry } + { + typesRegistry, + fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats, + } ); }); diff --git a/src/plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts b/src/plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts index af983a50f6c23..3beb92a2fa000 100644 --- a/src/plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts +++ b/src/plugins/data/public/search/aggs/metrics/parent_pipeline.test.ts @@ -110,7 +110,7 @@ describe('parent pipeline aggs', function() { schema: 'metric', }, ], - { typesRegistry } + { typesRegistry, fieldFormats: getInternalStartServices().fieldFormats } ); // Grab the aggConfig off the vis (we don't actually use the vis for anything else) diff --git a/src/plugins/data/public/search/aggs/metrics/percentile_ranks.test.ts b/src/plugins/data/public/search/aggs/metrics/percentile_ranks.test.ts index 2944fc8c11b23..1b94ecd602075 100644 --- a/src/plugins/data/public/search/aggs/metrics/percentile_ranks.test.ts +++ b/src/plugins/data/public/search/aggs/metrics/percentile_ranks.test.ts @@ -70,7 +70,7 @@ describe('AggTypesMetricsPercentileRanksProvider class', function() { }, }, ], - { typesRegistry } + { typesRegistry, fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats } ); }); diff --git a/src/plugins/data/public/search/aggs/metrics/percentiles.test.ts b/src/plugins/data/public/search/aggs/metrics/percentiles.test.ts index 33bd42df74cc7..76da2fe3eb62c 100644 --- a/src/plugins/data/public/search/aggs/metrics/percentiles.test.ts +++ b/src/plugins/data/public/search/aggs/metrics/percentiles.test.ts @@ -70,7 +70,7 @@ describe('AggTypesMetricsPercentilesProvider class', () => { }, }, ], - { typesRegistry } + { typesRegistry, fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats } ); }); diff --git a/src/plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts b/src/plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts index ab480fe44227e..a47aa2c677ade 100644 --- a/src/plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts +++ b/src/plugins/data/public/search/aggs/metrics/sibling_pipeline.test.ts @@ -111,7 +111,7 @@ describe('sibling pipeline aggs', () => { }, }, ], - { typesRegistry } + { typesRegistry, fieldFormats: getInternalStartServices().fieldFormats } ); // Grab the aggConfig off the vis (we don't actually use the vis for anything else) diff --git a/src/plugins/data/public/search/aggs/metrics/std_deviation.test.ts b/src/plugins/data/public/search/aggs/metrics/std_deviation.test.ts index 6bbff3009cc11..d2370e1fed02c 100644 --- a/src/plugins/data/public/search/aggs/metrics/std_deviation.test.ts +++ b/src/plugins/data/public/search/aggs/metrics/std_deviation.test.ts @@ -64,7 +64,7 @@ describe('AggTypeMetricStandardDeviationProvider class', () => { }, }, ], - { typesRegistry } + { typesRegistry, fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats } ); }; diff --git a/src/plugins/data/public/search/aggs/metrics/top_hit.test.ts b/src/plugins/data/public/search/aggs/metrics/top_hit.test.ts index 8294ad09bae22..142b8e4c83301 100644 --- a/src/plugins/data/public/search/aggs/metrics/top_hit.test.ts +++ b/src/plugins/data/public/search/aggs/metrics/top_hit.test.ts @@ -89,7 +89,7 @@ describe('Top hit metric', () => { params, }, ], - { typesRegistry } + { typesRegistry, fieldFormats: aggTypesDependencies.getInternalStartServices().fieldFormats } ); // Grab the aggConfig off the vis (we don't actually use the vis for anything else) diff --git a/src/plugins/data/public/search/aggs/mocks.ts b/src/plugins/data/public/search/aggs/mocks.ts index 7a5dcc9be4592..16544fd8f46b0 100644 --- a/src/plugins/data/public/search/aggs/mocks.ts +++ b/src/plugins/data/public/search/aggs/mocks.ts @@ -27,6 +27,7 @@ import { } from './'; import { SearchAggsSetup, SearchAggsStart } from './types'; import { mockAggTypesRegistry } from './test_helpers'; +import { fieldFormatsServiceMock } from '../../field_formats/mocks'; const aggTypeBaseParamMock = () => ({ name: 'some_param', @@ -72,6 +73,7 @@ export const searchAggsStartMock = (): SearchAggsStart => ({ createAggConfigs: jest.fn().mockImplementation((indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: mockAggTypesRegistry(), + fieldFormats: fieldFormatsServiceMock.createStartContract(), }); }), types: mockAggTypesRegistry(), diff --git a/src/plugins/data/public/search/expressions/create_filter.test.ts b/src/plugins/data/public/search/expressions/create_filter.test.ts index 23da060cba203..51b5e175761bd 100644 --- a/src/plugins/data/public/search/expressions/create_filter.test.ts +++ b/src/plugins/data/public/search/expressions/create_filter.test.ts @@ -22,10 +22,12 @@ import { AggConfigs, IAggConfig } from '../aggs'; import { TabbedTable } from '../tabify'; import { isRangeFilter, BytesFormat, FieldFormatsGetConfigFn } from '../../../common'; import { mockDataServices, mockAggTypesRegistry } from '../aggs/test_helpers'; +import { fieldFormatsServiceMock } from '../../field_formats/mocks'; describe('createFilter', () => { let table: TabbedTable; let aggConfig: IAggConfig; + const fieldFormats = fieldFormatsServiceMock.createStartContract(); const typesRegistry = mockAggTypesRegistry(); @@ -58,7 +60,7 @@ describe('createFilter', () => { params, }, ], - { typesRegistry } + { typesRegistry, fieldFormats } ); }; diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 6124682184821..a539736991adb 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -44,12 +44,19 @@ import { siblingPipelineAggHelper, } from './aggs'; +import { FieldFormatsStart } from '../field_formats'; + interface SearchServiceSetupDependencies { packageInfo: PackageInfo; query: QuerySetup; getInternalStartServices: GetInternalStartServicesFn; } +interface SearchStartDependencies { + fieldFormats: FieldFormatsStart; + indexPatterns: IndexPatternsContract; +} + /** * The search plugin exposes two registration methods for other plugins: * - registerSearchStrategyProvider for plugins to add their own custom @@ -110,7 +117,10 @@ export class SearchService implements Plugin { }; } - public start(core: CoreStart, indexPatterns: IndexPatternsContract): ISearchStart { + public start( + core: CoreStart, + { fieldFormats, indexPatterns }: SearchStartDependencies + ): ISearchStart { /** * A global object that intercepts all searches and provides convenience methods for cancelling * all pending search requests, as well as getting the number of pending search requests. @@ -131,6 +141,7 @@ export class SearchService implements Plugin { createAggConfigs: (indexPattern, configStates = [], schemas) => { return new AggConfigs(indexPattern, configStates, { typesRegistry: aggTypesStart, + fieldFormats, }); }, types: aggTypesStart, diff --git a/src/plugins/data/public/search/tabify/get_columns.test.ts b/src/plugins/data/public/search/tabify/get_columns.test.ts index b7dadc3f65d82..1072e9318b40e 100644 --- a/src/plugins/data/public/search/tabify/get_columns.test.ts +++ b/src/plugins/data/public/search/tabify/get_columns.test.ts @@ -21,6 +21,7 @@ import { tabifyGetColumns } from './get_columns'; import { TabbedAggColumn } from './types'; import { AggConfigs } from '../aggs'; import { mockAggTypesRegistry, mockDataServices } from '../aggs/test_helpers'; +import { fieldFormatsServiceMock } from '../../field_formats/mocks'; describe('get columns', () => { beforeEach(() => { @@ -28,6 +29,7 @@ describe('get columns', () => { }); const typesRegistry = mockAggTypesRegistry(); + const fieldFormats = fieldFormatsServiceMock.createStartContract(); const createAggConfigs = (aggs: any[] = []) => { const field = { @@ -45,6 +47,7 @@ describe('get columns', () => { return new AggConfigs(indexPattern, aggs, { typesRegistry, + fieldFormats, }); }; diff --git a/src/plugins/data/public/search/tabify/response_writer.test.ts b/src/plugins/data/public/search/tabify/response_writer.test.ts index 52338ae79ccbb..3334d858ce54e 100644 --- a/src/plugins/data/public/search/tabify/response_writer.test.ts +++ b/src/plugins/data/public/search/tabify/response_writer.test.ts @@ -21,6 +21,7 @@ import { TabbedAggResponseWriter } from './response_writer'; import { AggConfigs, BUCKET_TYPES } from '../aggs'; import { mockDataServices, mockAggTypesRegistry } from '../aggs/test_helpers'; import { TabbedResponseWriterOptions } from './types'; +import { fieldFormatsServiceMock } from '../../field_formats/mocks'; describe('TabbedAggResponseWriter class', () => { beforeEach(() => { @@ -30,6 +31,7 @@ describe('TabbedAggResponseWriter class', () => { let responseWriter: TabbedAggResponseWriter; const typesRegistry = mockAggTypesRegistry(); + const fieldFormats = fieldFormatsServiceMock.createStartContract(); const splitAggConfig = [ { @@ -74,6 +76,7 @@ describe('TabbedAggResponseWriter class', () => { return new TabbedAggResponseWriter( new AggConfigs(indexPattern, aggs, { typesRegistry, + fieldFormats, }), { metricsAtAllLevels: false, diff --git a/src/plugins/data/public/search/tabify/tabify.test.ts b/src/plugins/data/public/search/tabify/tabify.test.ts index c9bf04ae9f0fc..63685cc87f5cf 100644 --- a/src/plugins/data/public/search/tabify/tabify.test.ts +++ b/src/plugins/data/public/search/tabify/tabify.test.ts @@ -22,9 +22,11 @@ import { IndexPattern } from '../../index_patterns'; import { AggConfigs, IAggConfig, IAggConfigs } from '../aggs'; import { mockAggTypesRegistry } from '../aggs/test_helpers'; import { metricOnly, threeTermBuckets } from 'fixtures/fake_hierarchical_data'; +import { fieldFormatsServiceMock } from '../../field_formats/mocks'; describe('tabifyAggResponse Integration', () => { const typesRegistry = mockAggTypesRegistry(); + const fieldFormats = fieldFormatsServiceMock.createStartContract(); const createAggConfigs = (aggs: IAggConfig[] = []) => { const field = { @@ -42,6 +44,7 @@ describe('tabifyAggResponse Integration', () => { return new AggConfigs(indexPattern, aggs, { typesRegistry, + fieldFormats, }); }; From cf87efb9d0856acea74c64803f858409fcbc5461 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Wed, 15 Apr 2020 10:20:01 +0200 Subject: [PATCH 10/80] Add test:jest_integration npm script (#62938) --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 388e46aedf37d..c60cf5234c9f7 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "test:karma": "grunt test:karma", "test:karma:debug": "grunt test:karmaDebug", "test:jest": "node scripts/jest", + "test:jest_integration": "node scripts/jest_integration", "test:mocha": "node scripts/mocha", "test:mocha:coverage": "grunt test:mochaCoverage", "test:ftr": "node scripts/functional_tests", From ebbc062689e3b130b6ea7dbd585a976fde406036 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 15 Apr 2020 12:22:37 +0200 Subject: [PATCH 11/80] Move Lens frontend to Kibana Platform (#62965) * Move Lens frontend to Kibana platform * Fix line breaks * Fix jest tests * Fix remaining test * Remove old Lens plugin entry * Fix i18n prefix * Add config schema * Address review --- .eslintrc.js | 4 +- .github/CODEOWNERS | 2 +- .sass-lint.yml | 2 +- x-pack/.i18nrc.json | 2 +- x-pack/index.js | 2 - x-pack/legacy/plugins/lens/index.ts | 38 ------------------ .../lens/public/app_plugin/_index.scss | 1 - .../datatable_visualization/_index.scss | 1 - .../plugins/lens/public/drag_drop/_index.scss | 1 - .../public/editor_frame_service/_index.scss | 1 - .../editor_frame/index.scss | 8 ---- .../indexpattern_datasource/_index.scss | 4 -- .../dimension_panel/_index.scss | 2 - x-pack/legacy/plugins/lens/public/legacy.ts | 17 -------- x-pack/legacy/plugins/lens/public/redirect.ts | 19 --------- .../lens/public/xy_visualization/_index.scss | 1 - x-pack/plugins/lens/config.ts | 13 ++++++ x-pack/plugins/lens/kibana.json | 12 +++++- .../plugins/lens/public/_mixins.scss | 0 .../plugins/lens/public/_variables.scss | 0 .../plugins/lens/public/app_plugin/_app.scss | 0 .../lens/public/app_plugin/_index.scss | 1 + .../lens/public/app_plugin/app.test.tsx | 28 +++++++------ .../plugins/lens/public/app_plugin/app.tsx | 14 ++++--- .../plugins/lens/public/app_plugin/index.ts | 0 .../plugins/lens/public/assets/chart_area.svg | 0 .../lens/public/assets/chart_area_stacked.svg | 0 .../plugins/lens/public/assets/chart_bar.svg | 0 .../public/assets/chart_bar_horizontal.svg | 0 .../assets/chart_bar_horizontal_stacked.svg | 0 .../lens/public/assets/chart_bar_stacked.svg | 0 .../lens/public/assets/chart_datatable.svg | 0 .../plugins/lens/public/assets/chart_line.svg | 0 .../lens/public/assets/chart_metric.svg | 0 .../lens/public/assets/chart_mixed_xy.svg | 0 .../assets/lens_app_graphic_dark_2x.png | Bin .../assets/lens_app_graphic_light_2x.png | Bin .../datatable_visualization/_index.scss | 1 + .../_visualization.scss | 0 .../datatable_visualization/expression.tsx | 2 +- .../public/datatable_visualization/index.ts | 4 +- .../visualization.test.tsx | 0 .../datatable_visualization/visualization.tsx | 0 .../debounced_component.test.tsx | 0 .../debounced_component.tsx | 0 .../lens/public/debounced_component/index.ts | 0 .../__snapshots__/drag_drop.test.tsx.snap | 0 .../lens/public/drag_drop/_drag_drop.scss | 0 .../plugins/lens/public/drag_drop/_index.scss | 1 + .../lens/public/drag_drop/drag_drop.test.tsx | 0 .../lens/public/drag_drop/drag_drop.tsx | 0 .../plugins/lens/public/drag_drop/index.ts | 0 .../lens/public/drag_drop/providers.test.tsx | 0 .../lens/public/drag_drop/providers.tsx | 0 .../plugins/lens/public/drag_drop/readme.md | 0 .../public/editor_frame_service/_index.scss | 1 + .../__mocks__/suggestion_helpers.ts | 0 .../editor_frame/_chart_switch.scss | 0 .../editor_frame/_config_panel_wrapper.scss | 0 .../editor_frame/_data_panel_wrapper.scss | 0 .../editor_frame/_expression_renderer.scss | 0 .../editor_frame/_frame_layout.scss | 0 .../editor_frame/_suggestion_panel.scss | 0 .../_workspace_panel_wrapper.scss | 0 .../editor_frame/chart_switch.test.tsx | 0 .../editor_frame/chart_switch.tsx | 0 .../editor_frame/config_panel_wrapper.tsx | 0 .../editor_frame/data_panel_wrapper.tsx | 5 +-- .../editor_frame/editor_frame.test.tsx | 0 .../editor_frame/editor_frame.tsx | 6 +-- .../editor_frame/expression_helpers.ts | 2 +- .../editor_frame/frame_layout.tsx | 0 .../editor_frame/index.scss | 8 ++++ .../editor_frame/index.ts | 0 .../editor_frame/layer_actions.test.ts | 0 .../editor_frame/layer_actions.ts | 0 .../editor_frame/save.test.ts | 2 +- .../editor_frame_service/editor_frame/save.ts | 0 .../editor_frame/state_management.test.ts | 2 +- .../editor_frame/state_management.ts | 2 +- .../editor_frame/suggestion_helpers.test.ts | 0 .../editor_frame/suggestion_helpers.ts | 0 .../editor_frame/suggestion_panel.test.tsx | 4 +- .../editor_frame/suggestion_panel.tsx | 2 +- .../editor_frame/workspace_panel.test.tsx | 4 +- .../editor_frame/workspace_panel.tsx | 4 +- .../editor_frame/workspace_panel_wrapper.tsx | 0 .../embeddable/embeddable.test.tsx | 4 +- .../embeddable/embeddable.tsx | 6 +-- .../embeddable/embeddable_factory.ts | 8 ++-- .../embeddable/expression_wrapper.tsx | 0 .../editor_frame_service/format_column.ts | 0 .../lens/public/editor_frame_service/index.ts | 0 .../editor_frame_service/merge_tables.test.ts | 2 - .../editor_frame_service/merge_tables.ts | 2 +- .../public/editor_frame_service/mocks.tsx | 8 ++-- .../editor_frame_service/service.test.tsx | 2 - .../public/editor_frame_service/service.tsx | 19 +++++---- .../plugins/lens/public/help_menu_util.tsx | 7 ++-- .../plugins/lens/public/helpers/index.ts | 0 .../lens/public/helpers/url_helper.test.ts | 2 +- .../plugins/lens/public/helpers/url_helper.ts | 2 +- .../public/id_generator/id_generator.test.ts | 0 .../lens/public/id_generator/id_generator.ts | 0 .../plugins/lens/public/id_generator/index.ts | 0 .../plugins/lens/public/index.scss | 11 ++--- .../{legacy => }/plugins/lens/public/index.ts | 0 .../__mocks__/loader.ts | 0 .../__mocks__/state_helpers.ts | 0 .../lens_field_icon.test.tsx.snap | 0 .../indexpattern_datasource/_datapanel.scss | 0 .../indexpattern_datasource/_field_item.scss | 2 +- .../indexpattern_datasource/_index.scss | 4 ++ .../indexpattern_datasource/auto_date.test.ts | 2 +- .../indexpattern_datasource/auto_date.ts | 4 +- .../change_indexpattern.tsx | 0 .../datapanel.test.tsx | 4 +- .../indexpattern_datasource/datapanel.tsx | 10 ++++- .../dimension_panel/_field_select.scss | 0 .../dimension_panel/_index.scss | 2 + .../dimension_panel/_popover.scss | 0 .../bucket_nesting_editor.test.tsx | 0 .../dimension_panel/bucket_nesting_editor.tsx | 0 .../dimension_panel/dimension_panel.test.tsx | 10 +---- .../dimension_panel/dimension_panel.tsx | 6 +-- .../dimension_panel/field_select.tsx | 0 .../dimension_panel/format_selector.tsx | 0 .../dimension_panel/index.ts | 0 .../dimension_panel/popover_editor.tsx | 0 .../indexpattern_datasource/document_field.ts | 0 .../field_item.test.tsx | 11 ++--- .../indexpattern_datasource/field_item.tsx | 19 ++++++--- .../public/indexpattern_datasource/index.ts | 8 ++-- .../indexpattern.test.ts | 6 +-- .../indexpattern_datasource/indexpattern.tsx | 11 ++--- .../indexpattern_suggestions.test.tsx | 1 - .../indexpattern_suggestions.ts | 0 .../layerpanel.test.tsx | 1 - .../indexpattern_datasource/layerpanel.tsx | 0 .../lens_field_icon.test.tsx | 0 .../lens_field_icon.tsx | 2 +- .../indexpattern_datasource/loader.test.ts | 2 - .../public/indexpattern_datasource/loader.ts | 10 ++--- .../public/indexpattern_datasource/mocks.ts | 0 .../operations/__mocks__/index.ts | 0 .../operations/definitions/cardinality.tsx | 2 +- .../operations/definitions/column_types.ts | 0 .../operations/definitions/count.tsx | 2 +- .../definitions/date_histogram.test.tsx | 8 ++-- .../operations/definitions/date_histogram.tsx | 7 +--- .../operations/definitions/index.ts | 6 +-- .../operations/definitions/metrics.tsx | 2 +- .../operations/definitions/terms.test.tsx | 8 ++-- .../operations/definitions/terms.tsx | 2 +- .../operations/index.ts | 0 .../operations/operations.test.ts | 3 +- .../operations/operations.ts | 0 .../pure_helpers.test.ts | 0 .../indexpattern_datasource/pure_helpers.ts | 0 .../rename_columns.test.ts | 4 +- .../indexpattern_datasource/rename_columns.ts | 0 .../state_helpers.test.ts | 1 - .../indexpattern_datasource/state_helpers.ts | 0 .../indexpattern_datasource/to_expression.ts | 0 .../public/indexpattern_datasource/types.ts | 2 +- .../public/indexpattern_datasource/utils.ts | 0 .../public/lens_ui_telemetry/factory.test.ts | 0 .../lens/public/lens_ui_telemetry/factory.ts | 4 +- .../lens/public/lens_ui_telemetry/index.ts | 0 .../plugins/lens/public/loader.test.tsx | 0 .../plugins/lens/public/loader.tsx | 0 .../metric_visualization/auto_scale.test.tsx | 0 .../metric_visualization/auto_scale.tsx | 0 .../public/metric_visualization/index.scss | 0 .../lens/public/metric_visualization/index.ts | 4 +- .../metric_expression.test.tsx | 4 +- .../metric_expression.tsx | 2 +- .../metric_suggestions.test.ts | 2 +- .../metric_suggestions.ts | 0 .../metric_visualization.test.ts | 0 .../metric_visualization.tsx | 0 .../lens/public/metric_visualization/types.ts | 0 .../lens/public/native_renderer/index.ts | 0 .../native_renderer/native_renderer.test.tsx | 0 .../native_renderer/native_renderer.tsx | 0 .../plugins/lens/public/persistence/index.ts | 0 .../persistence/saved_object_store.test.ts | 0 .../public/persistence/saved_object_store.ts | 4 +- .../plugins/lens/public/plugin.tsx | 23 ++++++----- .../{legacy => }/plugins/lens/public/types.ts | 11 ++--- .../plugins/lens/public/vis_type_alias.ts | 2 +- .../public/visualization_container.test.tsx | 0 .../lens/public/visualization_container.tsx | 0 .../__snapshots__/to_expression.test.ts.snap | 0 .../__snapshots__/xy_expression.test.tsx.snap | 0 .../lens/public/xy_visualization/_index.scss | 1 + .../xy_visualization/_xy_expression.scss | 0 .../lens/public/xy_visualization/index.ts | 6 +-- .../lens/public/xy_visualization/services.ts | 4 +- .../public/xy_visualization/state_helpers.ts | 0 .../xy_visualization/to_expression.test.ts | 0 .../public/xy_visualization/to_expression.ts | 0 .../lens/public/xy_visualization/types.ts | 2 +- .../xy_visualization/xy_config_panel.test.tsx | 0 .../xy_visualization/xy_config_panel.tsx | 0 .../xy_visualization/xy_expression.test.tsx | 7 +--- .../public/xy_visualization/xy_expression.tsx | 8 ++-- .../xy_visualization/xy_suggestions.test.ts | 0 .../public/xy_visualization/xy_suggestions.ts | 0 .../xy_visualization/xy_visualization.test.ts | 0 .../xy_visualization/xy_visualization.tsx | 0 x-pack/{legacy => }/plugins/lens/readme.md | 0 x-pack/plugins/lens/server/index.ts | 8 +++- 213 files changed, 249 insertions(+), 301 deletions(-) delete mode 100644 x-pack/legacy/plugins/lens/index.ts delete mode 100644 x-pack/legacy/plugins/lens/public/app_plugin/_index.scss delete mode 100644 x-pack/legacy/plugins/lens/public/datatable_visualization/_index.scss delete mode 100644 x-pack/legacy/plugins/lens/public/drag_drop/_index.scss delete mode 100644 x-pack/legacy/plugins/lens/public/editor_frame_service/_index.scss delete mode 100644 x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/index.scss delete mode 100644 x-pack/legacy/plugins/lens/public/indexpattern_datasource/_index.scss delete mode 100644 x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/_index.scss delete mode 100644 x-pack/legacy/plugins/lens/public/legacy.ts delete mode 100644 x-pack/legacy/plugins/lens/public/redirect.ts delete mode 100644 x-pack/legacy/plugins/lens/public/xy_visualization/_index.scss create mode 100644 x-pack/plugins/lens/config.ts rename x-pack/{legacy => }/plugins/lens/public/_mixins.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/_variables.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/app_plugin/_app.scss (100%) create mode 100644 x-pack/plugins/lens/public/app_plugin/_index.scss rename x-pack/{legacy => }/plugins/lens/public/app_plugin/app.test.tsx (96%) rename x-pack/{legacy => }/plugins/lens/public/app_plugin/app.tsx (96%) rename x-pack/{legacy => }/plugins/lens/public/app_plugin/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_area.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_area_stacked.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_bar.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_bar_horizontal.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_bar_horizontal_stacked.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_bar_stacked.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_datatable.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_line.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_metric.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/chart_mixed_xy.svg (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/lens_app_graphic_dark_2x.png (100%) rename x-pack/{legacy => }/plugins/lens/public/assets/lens_app_graphic_light_2x.png (100%) create mode 100644 x-pack/plugins/lens/public/datatable_visualization/_index.scss rename x-pack/{legacy => }/plugins/lens/public/datatable_visualization/_visualization.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/datatable_visualization/expression.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/datatable_visualization/index.ts (89%) rename x-pack/{legacy => }/plugins/lens/public/datatable_visualization/visualization.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/datatable_visualization/visualization.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/debounced_component/debounced_component.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/debounced_component/debounced_component.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/debounced_component/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/drag_drop/__snapshots__/drag_drop.test.tsx.snap (100%) rename x-pack/{legacy => }/plugins/lens/public/drag_drop/_drag_drop.scss (100%) create mode 100644 x-pack/plugins/lens/public/drag_drop/_index.scss rename x-pack/{legacy => }/plugins/lens/public/drag_drop/drag_drop.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/drag_drop/drag_drop.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/drag_drop/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/drag_drop/providers.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/drag_drop/providers.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/drag_drop/readme.md (100%) create mode 100644 x-pack/plugins/lens/public/editor_frame_service/_index.scss rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/__mocks__/suggestion_helpers.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/_chart_switch.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/_config_panel_wrapper.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/_data_panel_wrapper.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/_expression_renderer.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/_frame_layout.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/_suggestion_panel.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/_workspace_panel_wrapper.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/chart_switch.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/chart_switch.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/config_panel_wrapper.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/data_panel_wrapper.tsx (94%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/editor_frame.tsx (97%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/expression_helpers.ts (97%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/frame_layout.tsx (100%) create mode 100644 x-pack/plugins/lens/public/editor_frame_service/editor_frame/index.scss rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/layer_actions.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/layer_actions.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/save.test.ts (98%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/save.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts (99%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts (99%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.test.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.test.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel_wrapper.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/embeddable/embeddable.test.tsx (96%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx (94%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/embeddable/embeddable_factory.ts (91%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/format_column.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/merge_tables.test.ts (98%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/merge_tables.ts (96%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/mocks.tsx (92%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/service.test.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/editor_frame_service/service.tsx (91%) rename x-pack/{legacy => }/plugins/lens/public/help_menu_util.tsx (63%) rename x-pack/{legacy => }/plugins/lens/public/helpers/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/helpers/url_helper.test.ts (96%) rename x-pack/{legacy => }/plugins/lens/public/helpers/url_helper.ts (95%) rename x-pack/{legacy => }/plugins/lens/public/id_generator/id_generator.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/id_generator/id_generator.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/id_generator/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/index.scss (54%) rename x-pack/{legacy => }/plugins/lens/public/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/__mocks__/loader.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/__mocks__/state_helpers.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/__snapshots__/lens_field_icon.test.tsx.snap (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/_datapanel.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/_field_item.scss (98%) create mode 100644 x-pack/plugins/lens/public/indexpattern_datasource/_index.scss rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/auto_date.test.ts (96%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/auto_date.ts (92%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/change_indexpattern.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/datapanel.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/_field_select.scss (100%) create mode 100644 x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/_index.scss rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/_popover.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/bucket_nesting_editor.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/bucket_nesting_editor.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.tsx (97%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/format_selector.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/dimension_panel/popover_editor.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/document_field.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/field_item.test.tsx (95%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/field_item.tsx (97%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/index.ts (84%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts (98%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/indexpattern.tsx (96%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/layerpanel.test.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/layerpanel.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/lens_field_icon.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/lens_field_icon.tsx (86%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/loader.test.ts (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/loader.ts (96%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/mocks.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx (97%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts (97%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.test.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/operations/operations.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/pure_helpers.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/pure_helpers.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts (96%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/rename_columns.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts (99%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/state_helpers.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/to_expression.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/types.ts (94%) rename x-pack/{legacy => }/plugins/lens/public/indexpattern_datasource/utils.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/lens_ui_telemetry/factory.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/lens_ui_telemetry/factory.ts (96%) rename x-pack/{legacy => }/plugins/lens/public/lens_ui_telemetry/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/loader.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/loader.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/auto_scale.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/auto_scale.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/index.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/index.ts (88%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/metric_expression.test.tsx (94%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/metric_expression.tsx (98%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/metric_suggestions.test.ts (98%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/metric_suggestions.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/metric_visualization.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/metric_visualization.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/metric_visualization/types.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/native_renderer/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/native_renderer/native_renderer.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/native_renderer/native_renderer.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/persistence/index.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/persistence/saved_object_store.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/persistence/saved_object_store.ts (94%) rename x-pack/{legacy => }/plugins/lens/public/plugin.tsx (90%) rename x-pack/{legacy => }/plugins/lens/public/types.ts (98%) rename x-pack/{legacy => }/plugins/lens/public/vis_type_alias.ts (95%) rename x-pack/{legacy => }/plugins/lens/public/visualization_container.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/visualization_container.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap (100%) create mode 100644 x-pack/plugins/lens/public/xy_visualization/_index.scss rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/_xy_expression.scss (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/index.ts (89%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/services.ts (70%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/state_helpers.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/to_expression.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/to_expression.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/types.ts (99%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_config_panel.tsx (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_expression.test.tsx (99%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_expression.tsx (97%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_suggestions.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_suggestions.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_visualization.test.ts (100%) rename x-pack/{legacy => }/plugins/lens/public/xy_visualization/xy_visualization.tsx (100%) rename x-pack/{legacy => }/plugins/lens/readme.md (100%) diff --git a/.eslintrc.js b/.eslintrc.js index 2ce6d279d93a9..246702aedf863 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -109,7 +109,7 @@ module.exports = { }, }, { - files: ['x-pack/legacy/plugins/lens/**/*.{js,ts,tsx}'], + files: ['x-pack/plugins/lens/**/*.{js,ts,tsx}'], rules: { 'react-hooks/exhaustive-deps': 'off', 'react-hooks/rules-of-hooks': 'off', @@ -728,7 +728,7 @@ module.exports = { * Lens overrides */ { - files: ['x-pack/legacy/plugins/lens/**/*.{ts,tsx}', 'x-pack/plugins/lens/**/*.{ts,tsx}'], + files: ['x-pack/plugins/lens/**/*.{ts,tsx}'], rules: { '@typescript-eslint/no-explicit-any': 'error', }, diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 267f3dde0b66f..71d857c1c9041 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,7 +3,7 @@ # For more info, see https://help.github.com/articles/about-codeowners/ # App -/x-pack/legacy/plugins/lens/ @elastic/kibana-app +/x-pack/plugins/lens/ @elastic/kibana-app /x-pack/legacy/plugins/graph/ @elastic/kibana-app /src/legacy/server/url_shortening/ @elastic/kibana-app /src/legacy/server/sample_data/ @elastic/kibana-app diff --git a/.sass-lint.yml b/.sass-lint.yml index dd7bc0576692b..0c33eaf794c69 100644 --- a/.sass-lint.yml +++ b/.sass-lint.yml @@ -8,9 +8,9 @@ files: - 'x-pack/legacy/plugins/security/**/*.s+(a|c)ss' - 'x-pack/legacy/plugins/canvas/**/*.s+(a|c)ss' - 'x-pack/plugins/triggers_actions_ui/**/*.s+(a|c)ss' + - 'x-pack/plugins/lens/**/*.s+(a|c)ss' ignore: - 'x-pack/legacy/plugins/canvas/shareable_runtime/**/*.s+(a|c)ss' - - 'x-pack/legacy/plugins/lens/**/*.s+(a|c)ss' - 'x-pack/legacy/plugins/maps/**/*.s+(a|c)ss' rules: quotes: diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index b3744f7cf93ab..50f36ddd21c97 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -21,7 +21,7 @@ "xpack.indexLifecycleMgmt": "plugins/index_lifecycle_management", "xpack.infra": "plugins/infra", "xpack.ingestManager": "plugins/ingest_manager", - "xpack.lens": "legacy/plugins/lens", + "xpack.lens": "plugins/lens", "xpack.licenseMgmt": "plugins/license_management", "xpack.licensing": "plugins/licensing", "xpack.logstash": ["plugins/logstash", "legacy/plugins/logstash"], diff --git a/x-pack/index.js b/x-pack/index.js index 3126dc17a7107..61fd4f1752316 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -29,7 +29,6 @@ import { uptime } from './legacy/plugins/uptime'; import { encryptedSavedObjects } from './legacy/plugins/encrypted_saved_objects'; import { actions } from './legacy/plugins/actions'; import { alerting } from './legacy/plugins/alerting'; -import { lens } from './legacy/plugins/lens'; import { ingestManager } from './legacy/plugins/ingest_manager'; import { triggersActionsUI } from './legacy/plugins/triggers_actions_ui'; @@ -58,7 +57,6 @@ module.exports = function(kibana) { upgradeAssistant(kibana), uptime(kibana), encryptedSavedObjects(kibana), - lens(kibana), actions(kibana), alerting(kibana), ingestManager(kibana), diff --git a/x-pack/legacy/plugins/lens/index.ts b/x-pack/legacy/plugins/lens/index.ts deleted file mode 100644 index e9a901c58cd90..0000000000000 --- a/x-pack/legacy/plugins/lens/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import * as Joi from 'joi'; -import { resolve } from 'path'; -import { LegacyPluginInitializer } from 'src/legacy/types'; -import { PLUGIN_ID, NOT_INTERNATIONALIZED_PRODUCT_NAME } from '../../../plugins/lens/common'; - -export const lens: LegacyPluginInitializer = kibana => { - return new kibana.Plugin({ - id: PLUGIN_ID, - configPrefix: `xpack.${PLUGIN_ID}`, - // task_manager could be required, but is only used for telemetry - require: ['kibana', 'elasticsearch', 'xpack_main', 'interpreter'], - publicDir: resolve(__dirname, 'public'), - - uiExports: { - app: { - title: NOT_INTERNATIONALIZED_PRODUCT_NAME, - description: 'Explore and visualize data.', - main: `plugins/${PLUGIN_ID}/redirect`, - listed: false, - }, - visualize: [`plugins/${PLUGIN_ID}/legacy`], - embeddableFactories: [`plugins/${PLUGIN_ID}/legacy`], - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - }, - - config: () => { - return Joi.object({ - enabled: Joi.boolean().default(true), - }).default(); - }, - }); -}; diff --git a/x-pack/legacy/plugins/lens/public/app_plugin/_index.scss b/x-pack/legacy/plugins/lens/public/app_plugin/_index.scss deleted file mode 100644 index 2ac86f0e58a61..0000000000000 --- a/x-pack/legacy/plugins/lens/public/app_plugin/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './app'; diff --git a/x-pack/legacy/plugins/lens/public/datatable_visualization/_index.scss b/x-pack/legacy/plugins/lens/public/datatable_visualization/_index.scss deleted file mode 100644 index 99c357b53952f..0000000000000 --- a/x-pack/legacy/plugins/lens/public/datatable_visualization/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './visualization'; diff --git a/x-pack/legacy/plugins/lens/public/drag_drop/_index.scss b/x-pack/legacy/plugins/lens/public/drag_drop/_index.scss deleted file mode 100644 index 1b3d0cf0a3c2a..0000000000000 --- a/x-pack/legacy/plugins/lens/public/drag_drop/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './drag_drop' diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/_index.scss b/x-pack/legacy/plugins/lens/public/editor_frame_service/_index.scss deleted file mode 100644 index 4d7e054ff03c3..0000000000000 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './editor_frame/index'; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/index.scss b/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/index.scss deleted file mode 100644 index 6c6a63c8c7eb6..0000000000000 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/index.scss +++ /dev/null @@ -1,8 +0,0 @@ -@import './chart_switch'; -@import './config_panel_wrapper'; -@import './data_panel_wrapper'; -@import './expression_renderer'; -@import './frame_layout'; -@import './suggestion_panel'; -@import './workspace_panel_wrapper'; - diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/_index.scss b/x-pack/legacy/plugins/lens/public/indexpattern_datasource/_index.scss deleted file mode 100644 index a283198d6cf73..0000000000000 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/_index.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import './datapanel'; -@import './field_item'; - -@import './dimension_panel/index'; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/_index.scss b/x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/_index.scss deleted file mode 100644 index 26f805fe735f0..0000000000000 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/dimension_panel/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import './field_select'; -@import './popover'; diff --git a/x-pack/legacy/plugins/lens/public/legacy.ts b/x-pack/legacy/plugins/lens/public/legacy.ts deleted file mode 100644 index 3b7b6a7a1b510..0000000000000 --- a/x-pack/legacy/plugins/lens/public/legacy.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { npSetup, npStart } from 'ui/new_platform'; - -export * from './types'; - -import { plugin } from './index'; - -const pluginInstance = plugin(); -pluginInstance.setup(npSetup.core, { - ...npSetup.plugins, -}); -pluginInstance.start(npStart.core, npStart.plugins); diff --git a/x-pack/legacy/plugins/lens/public/redirect.ts b/x-pack/legacy/plugins/lens/public/redirect.ts deleted file mode 100644 index 25b0188214c5e..0000000000000 --- a/x-pack/legacy/plugins/lens/public/redirect.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// This file redirects lens urls starting with app/lens#... to their counterpart on app/kibana#lens/... to -// make sure it's compatible with the 7.5 release - -import { npSetup } from 'ui/new_platform'; -import chrome from 'ui/chrome'; - -chrome.setRootController('lens', () => { - // prefix the path in the hash with lens/ - const prefixedHashRoute = window.location.hash.replace(/^#\//, '#/lens/'); - - // redirect to the new lens url `app/kibana#/lens/...` - window.location.href = npSetup.core.http.basePath.prepend('/app/kibana' + prefixedHashRoute); -}); diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/_index.scss b/x-pack/legacy/plugins/lens/public/xy_visualization/_index.scss deleted file mode 100644 index 794ed4aed82ec..0000000000000 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './_xy_expression'; diff --git a/x-pack/plugins/lens/config.ts b/x-pack/plugins/lens/config.ts new file mode 100644 index 0000000000000..84cf02a7ea541 --- /dev/null +++ b/x-pack/plugins/lens/config.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; + +export const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: true }), +}); + +export type ConfigSchema = TypeOf; diff --git a/x-pack/plugins/lens/kibana.json b/x-pack/plugins/lens/kibana.json index 6abdaad7903be..ce544b31b88ef 100644 --- a/x-pack/plugins/lens/kibana.json +++ b/x-pack/plugins/lens/kibana.json @@ -3,7 +3,15 @@ "version": "8.0.0", "kibanaVersion": "kibana", "server": true, - "ui": false, - "optionalPlugins": ["usageCollection", "taskManager"], + "ui": true, + "requiredPlugins": [ + "data", + "expressions", + "navigation", + "kibanaLegacy", + "uiActions", + "visualizations" + ], + "optionalPlugins": ["embeddable", "usageCollection", "taskManager"], "configPath": ["xpack", "lens"] } diff --git a/x-pack/legacy/plugins/lens/public/_mixins.scss b/x-pack/plugins/lens/public/_mixins.scss similarity index 100% rename from x-pack/legacy/plugins/lens/public/_mixins.scss rename to x-pack/plugins/lens/public/_mixins.scss diff --git a/x-pack/legacy/plugins/lens/public/_variables.scss b/x-pack/plugins/lens/public/_variables.scss similarity index 100% rename from x-pack/legacy/plugins/lens/public/_variables.scss rename to x-pack/plugins/lens/public/_variables.scss diff --git a/x-pack/legacy/plugins/lens/public/app_plugin/_app.scss b/x-pack/plugins/lens/public/app_plugin/_app.scss similarity index 100% rename from x-pack/legacy/plugins/lens/public/app_plugin/_app.scss rename to x-pack/plugins/lens/public/app_plugin/_app.scss diff --git a/x-pack/plugins/lens/public/app_plugin/_index.scss b/x-pack/plugins/lens/public/app_plugin/_index.scss new file mode 100644 index 0000000000000..e72e824224956 --- /dev/null +++ b/x-pack/plugins/lens/public/app_plugin/_index.scss @@ -0,0 +1 @@ +@import 'app'; diff --git a/x-pack/legacy/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx similarity index 96% rename from x-pack/legacy/plugins/lens/public/app_plugin/app.test.tsx rename to x-pack/plugins/lens/public/app_plugin/app.test.tsx index be72dd4b4edef..d49c128dff604 100644 --- a/x-pack/legacy/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -9,7 +9,7 @@ import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { App } from './app'; import { EditorFrameInstance } from '../types'; -import { Storage } from '../../../../../../src/plugins/kibana_utils/public'; +import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { Document, SavedObjectStore } from '../persistence'; import { mount } from 'enzyme'; import { @@ -17,25 +17,24 @@ import { FilterManager, IFieldType, IIndexPattern, -} from '../../../../../../src/plugins/data/public'; -import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; +} from '../../../../../src/plugins/data/public'; +import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; const dataStartMock = dataPluginMock.createStartContract(); -import { TopNavMenuData } from '../../../../../../src/plugins/navigation/public'; +import { navigationPluginMock } from '../../../../../src/plugins/navigation/public/mocks'; +import { TopNavMenuData } from '../../../../../src/plugins/navigation/public'; import { coreMock } from 'src/core/public/mocks'; -jest.mock('ui/new_platform'); jest.mock('../persistence'); jest.mock('src/core/public'); -import { npStart } from 'ui/new_platform'; -jest - .spyOn(npStart.plugins.navigation.ui.TopNavMenu.prototype, 'constructor') - .mockImplementation(() => { - return
; - }); +const navigationStartMock = navigationPluginMock.createStartContract(); + +jest.spyOn(navigationStartMock.ui.TopNavMenu.prototype, 'constructor').mockImplementation(() => { + return
; +}); -const { TopNavMenu } = npStart.plugins.navigation.ui; +const { TopNavMenu } = navigationStartMock.ui; function createMockFrame(): jest.Mocked { return { @@ -99,6 +98,7 @@ describe('Lens App', () => { function makeDefaultArgs(): jest.Mocked<{ editorFrame: EditorFrameInstance; data: typeof dataStartMock; + navigation: typeof navigationStartMock; core: typeof core; storage: Storage; docId?: string; @@ -107,6 +107,7 @@ describe('Lens App', () => { addToDashboardMode?: boolean; }> { return ({ + navigation: navigationStartMock, editorFrame: createMockFrame(), core: { ...core, @@ -140,6 +141,7 @@ describe('Lens App', () => { }, redirectTo: jest.fn(id => {}), } as unknown) as jest.Mocked<{ + navigation: typeof navigationStartMock; editorFrame: EditorFrameInstance; data: typeof dataStartMock; core: typeof core; @@ -338,6 +340,7 @@ describe('Lens App', () => { let defaultArgs: jest.Mocked<{ editorFrame: EditorFrameInstance; + navigation: typeof navigationStartMock; data: typeof dataStartMock; core: typeof core; storage: Storage; @@ -654,6 +657,7 @@ describe('Lens App', () => { let defaultArgs: jest.Mocked<{ editorFrame: EditorFrameInstance; data: typeof dataStartMock; + navigation: typeof navigationStartMock; core: typeof core; storage: Storage; docId?: string; diff --git a/x-pack/legacy/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx similarity index 96% rename from x-pack/legacy/plugins/lens/public/app_plugin/app.tsx rename to x-pack/plugins/lens/public/app_plugin/app.tsx index dfea2e39fcbc5..2d8f1650e4008 100644 --- a/x-pack/legacy/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -9,12 +9,12 @@ import React, { useState, useEffect, useCallback } from 'react'; import { I18nProvider } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { Query, DataPublicPluginStart } from 'src/plugins/data/public'; -import { AppMountContext, NotificationsStart } from 'src/core/public'; +import { NavigationPublicPluginStart } from 'src/plugins/navigation/public'; +import { AppMountContext, NotificationsStart } from 'kibana/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; -import { npStart } from 'ui/new_platform'; import { FormattedMessage } from '@kbn/i18n/react'; -import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; -import { SavedObjectSaveModal } from '../../../../../../src/plugins/saved_objects/public'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { SavedObjectSaveModal } from '../../../../../src/plugins/saved_objects/public'; import { Document, SavedObjectStore } from '../persistence'; import { EditorFrameInstance } from '../types'; import { NativeRenderer } from '../native_renderer'; @@ -25,7 +25,7 @@ import { IndexPattern as IndexPatternInstance, IndexPatternsContract, SavedQuery, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../src/plugins/data/public'; interface State { isLoading: boolean; @@ -53,9 +53,11 @@ export function App({ docStorage, redirectTo, addToDashboardMode, + navigation, }: { editorFrame: EditorFrameInstance; data: DataPublicPluginStart; + navigation: NavigationPublicPluginStart; core: AppMountContext['core']; storage: IStorageWrapper; docId?: string; @@ -188,7 +190,7 @@ export function App({ [] ); - const { TopNavMenu } = npStart.plugins.navigation.ui; + const { TopNavMenu } = navigation.ui; const confirmButton = addToDashboardMode ? ( { const mockVisualization = createMockVisualization(); diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/save.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/save.ts rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.ts diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts similarity index 99% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts index 4aaf2a3ee9e81..1f62929783b63 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.test.ts @@ -5,7 +5,7 @@ */ import { getInitialState, reducer } from './state_management'; -import { EditorFrameProps } from '.'; +import { EditorFrameProps } from './index'; import { Datasource, Visualization } from '../../types'; import { createExpressionRendererMock } from '../mocks'; import { coreMock } from 'src/core/public/mocks'; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts similarity index 99% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts index 7d763bcac2cc9..bb6daf5641a64 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_management.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EditorFrameProps } from '../editor_frame'; +import { EditorFrameProps } from './index'; import { Document } from '../../persistence/saved_object_store'; export interface PreviewState { diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.test.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.test.ts rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.test.ts diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.test.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.test.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.test.tsx index 0e32f1f053b9d..240bdff40b51c 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.test.tsx @@ -15,8 +15,8 @@ import { createMockFramePublicAPI, } from '../mocks'; import { act } from 'react-dom/test-utils'; -import { ReactExpressionRendererType } from '../../../../../../../src/plugins/expressions/public'; -import { esFilters, IFieldType, IIndexPattern } from '../../../../../../../src/plugins/data/public'; +import { ReactExpressionRendererType } from '../../../../../../src/plugins/expressions/public'; +import { esFilters, IFieldType, IIndexPattern } from '../../../../../../src/plugins/data/public'; import { SuggestionPanel, SuggestionPanelProps } from './suggestion_panel'; import { getSuggestions, Suggestion } from './suggestion_helpers'; import { EuiIcon, EuiPanel, EuiToolTip } from '@elastic/eui'; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx index 76443027ab88a..867214d15578a 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx @@ -24,7 +24,7 @@ import classNames from 'classnames'; import { Action, PreviewState } from './state_management'; import { Datasource, Visualization, FramePublicAPI, DatasourcePublicAPI } from '../../types'; import { getSuggestions, switchToSuggestion } from './suggestion_helpers'; -import { ReactExpressionRendererType } from '../../../../../../../src/plugins/expressions/public'; +import { ReactExpressionRendererType } from '../../../../../../src/plugins/expressions/public'; import { prependDatasourceExpression, prependKibanaContext } from './expression_helpers'; import { debouncedComponent } from '../../debounced_component'; import { trackUiEvent, trackSuggestionEvent } from '../../lens_ui_telemetry'; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.test.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.test.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.test.tsx index 748e5b876da95..33ecee53fa3bc 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { act } from 'react-dom/test-utils'; -import { ReactExpressionRendererProps } from '../../../../../../../src/plugins/expressions/public'; +import { ReactExpressionRendererProps } from '../../../../../../src/plugins/expressions/public'; import { FramePublicAPI, TableSuggestion, Visualization } from '../../types'; import { createMockVisualization, @@ -21,7 +21,7 @@ import { ReactWrapper } from 'enzyme'; import { DragDrop, ChildDragDropProvider } from '../../drag_drop'; import { Ast } from '@kbn/interpreter/common'; import { coreMock } from 'src/core/public/mocks'; -import { esFilters, IFieldType, IIndexPattern } from '../../../../../../../src/plugins/data/public'; +import { esFilters, IFieldType, IIndexPattern } from '../../../../../../src/plugins/data/public'; describe('workspace_panel', () => { let mockVisualization: jest.Mocked; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx index c2a5c16e405a2..1f741ca37934f 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx @@ -16,8 +16,8 @@ import { EuiBetaBadge, EuiButtonEmpty, } from '@elastic/eui'; -import { CoreStart, CoreSetup } from 'src/core/public'; -import { ReactExpressionRendererType } from '../../../../../../../src/plugins/expressions/public'; +import { CoreStart, CoreSetup } from 'kibana/public'; +import { ReactExpressionRendererType } from '../../../../../../src/plugins/expressions/public'; import { Action } from './state_management'; import { Datasource, Visualization, FramePublicAPI } from '../../types'; import { DragDrop, DragContext } from '../../drag_drop'; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel_wrapper.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel_wrapper.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel_wrapper.tsx rename to x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel_wrapper.tsx diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.test.tsx similarity index 96% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.test.tsx rename to x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.test.tsx index 55363ebe4d8f3..aeae64514b0fd 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.test.tsx @@ -9,9 +9,9 @@ import { Embeddable } from './embeddable'; import { ReactExpressionRendererProps } from 'src/plugins/expressions/public'; import { Query, TimeRange, Filter, TimefilterContract } from 'src/plugins/data/public'; import { Document } from '../../persistence'; -import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; +import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; -jest.mock('../../../../../../../src/plugins/inspector/public/', () => ({ +jest.mock('../../../../../../src/plugins/inspector/public/', () => ({ isAvailable: false, open: false, })); diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx similarity index 94% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx rename to x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx index c2ab1c72af545..0ef5f6d1a5470 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx @@ -16,15 +16,15 @@ import { } from 'src/plugins/data/public'; import { Subscription } from 'rxjs'; -import { ReactExpressionRendererType } from '../../../../../../../src/plugins/expressions/public'; -import { VIS_EVENT_TO_TRIGGER } from '../../../../../../../src/plugins/visualizations/public'; +import { ReactExpressionRendererType } from '../../../../../../src/plugins/expressions/public'; +import { VIS_EVENT_TO_TRIGGER } from '../../../../../../src/plugins/visualizations/public'; import { Embeddable as AbstractEmbeddable, EmbeddableOutput, IContainer, EmbeddableInput, -} from '../../../../../../../src/plugins/embeddable/public'; +} from '../../../../../../src/plugins/embeddable/public'; import { Document, DOC_TYPE } from '../../persistence'; import { ExpressionWrapper } from './expression_wrapper'; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable_factory.ts b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable_factory.ts similarity index 91% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable_factory.ts rename to x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable_factory.ts index 99a59c756e228..68dbff263f60d 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/embeddable_factory.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable_factory.ts @@ -15,17 +15,17 @@ import { IndexPatternsContract, IndexPattern, TimefilterContract, -} from '../../../../../../../src/plugins/data/public'; -import { ReactExpressionRendererType } from '../../../../../../../src/plugins/expressions/public'; +} from '../../../../../../src/plugins/data/public'; +import { ReactExpressionRendererType } from '../../../../../../src/plugins/expressions/public'; import { EmbeddableFactoryDefinition, ErrorEmbeddable, EmbeddableInput, IContainer, -} from '../../../../../../../src/plugins/embeddable/public'; +} from '../../../../../../src/plugins/embeddable/public'; import { Embeddable } from './embeddable'; import { SavedObjectIndexStore, DOC_TYPE } from '../../persistence'; -import { getEditPath } from '../../../../../../plugins/lens/common'; +import { getEditPath } from '../../../common'; interface StartServices { timefilter: TimefilterContract; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx b/x-pack/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx rename to x-pack/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/format_column.ts b/x-pack/plugins/lens/public/editor_frame_service/format_column.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/format_column.ts rename to x-pack/plugins/lens/public/editor_frame_service/format_column.ts diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/index.ts b/x-pack/plugins/lens/public/editor_frame_service/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/index.ts rename to x-pack/plugins/lens/public/editor_frame_service/index.ts diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/merge_tables.test.ts b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.test.ts similarity index 98% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/merge_tables.test.ts rename to x-pack/plugins/lens/public/editor_frame_service/merge_tables.test.ts index 9368674de31c5..243441f2c8ab3 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/merge_tables.test.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.test.ts @@ -8,8 +8,6 @@ import moment from 'moment'; import { mergeTables } from './merge_tables'; import { KibanaDatatable } from 'src/plugins/expressions'; -jest.mock('ui/new_platform'); - describe('lens_merge_tables', () => { it('should produce a row with the nested table as defined', () => { const sampleTable1: KibanaDatatable = { diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/merge_tables.ts b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.ts similarity index 96% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/merge_tables.ts rename to x-pack/plugins/lens/public/editor_frame_service/merge_tables.ts index c06640fb25de6..7c10ee4a57fad 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/merge_tables.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.ts @@ -10,7 +10,7 @@ import { ExpressionValueSearchContext, KibanaDatatable, } from 'src/plugins/expressions/public'; -import { search } from '../../../../../../src/plugins/data/public'; +import { search } from '../../../../../src/plugins/data/public'; const { toAbsoluteDates } = search.aggs; import { LensMultiTable } from '../types'; diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/mocks.tsx b/x-pack/plugins/lens/public/editor_frame_service/mocks.tsx similarity index 92% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/mocks.tsx rename to x-pack/plugins/lens/public/editor_frame_service/mocks.tsx index 5d2f68a5567eb..50cd1ad8bd53a 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/mocks.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/mocks.tsx @@ -9,12 +9,12 @@ import { ReactExpressionRendererProps, ExpressionsSetup, ExpressionsStart, -} from '../../../../../../src/plugins/expressions/public'; -import { embeddablePluginMock } from '../../../../../../src/plugins/embeddable/public/mocks'; -import { expressionsPluginMock } from '../../../../../../src/plugins/expressions/public/mocks'; +} from '../../../../../src/plugins/expressions/public'; +import { embeddablePluginMock } from '../../../../../src/plugins/embeddable/public/mocks'; +import { expressionsPluginMock } from '../../../../../src/plugins/expressions/public/mocks'; import { DatasourcePublicAPI, FramePublicAPI, Datasource, Visualization } from '../types'; import { EditorFrameSetupPlugins, EditorFrameStartPlugins } from './service'; -import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; +import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; export function createMockVisualization(): jest.Mocked { return { diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/service.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/service.test.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/service.test.tsx rename to x-pack/plugins/lens/public/editor_frame_service/service.test.tsx index 42a1fcc055a1e..fbd65c5044d51 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/service.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/service.test.tsx @@ -14,8 +14,6 @@ import { } from './mocks'; import { CoreSetup } from 'kibana/public'; -jest.mock('ui/new_platform'); - // mock away actual dependencies to prevent all of it being loaded jest.mock('./embeddable/embeddable_factory', () => ({ EmbeddableFactory: class Mock {}, diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_service/service.tsx b/x-pack/plugins/lens/public/editor_frame_service/service.tsx similarity index 91% rename from x-pack/legacy/plugins/lens/public/editor_frame_service/service.tsx rename to x-pack/plugins/lens/public/editor_frame_service/service.tsx index 1375c60060ca8..15fe449d6563b 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_service/service.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/service.tsx @@ -7,16 +7,13 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; -import { CoreSetup, CoreStart } from 'src/core/public'; -import { - ExpressionsSetup, - ExpressionsStart, -} from '../../../../../../src/plugins/expressions/public'; -import { EmbeddableSetup, EmbeddableStart } from '../../../../../../src/plugins/embeddable/public'; +import { CoreSetup, CoreStart } from 'kibana/public'; +import { ExpressionsSetup, ExpressionsStart } from '../../../../../src/plugins/expressions/public'; +import { EmbeddableSetup, EmbeddableStart } from '../../../../../src/plugins/embeddable/public'; import { DataPublicPluginSetup, DataPublicPluginStart, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../src/plugins/data/public'; import { Datasource, Visualization, @@ -32,13 +29,13 @@ import { getActiveDatasourceIdFromDoc } from './editor_frame/state_management'; export interface EditorFrameSetupPlugins { data: DataPublicPluginSetup; - embeddable: EmbeddableSetup; + embeddable?: EmbeddableSetup; expressions: ExpressionsSetup; } export interface EditorFrameStartPlugins { data: DataPublicPluginStart; - embeddable: EmbeddableStart; + embeddable?: EmbeddableStart; expressions: ExpressionsStart; } @@ -79,7 +76,9 @@ export class EditorFrameService { }; }; - plugins.embeddable.registerEmbeddableFactory('lens', new EmbeddableFactory(getStartServices)); + if (plugins.embeddable) { + plugins.embeddable.registerEmbeddableFactory('lens', new EmbeddableFactory(getStartServices)); + } return { registerDatasource: datasource => { diff --git a/x-pack/legacy/plugins/lens/public/help_menu_util.tsx b/x-pack/plugins/lens/public/help_menu_util.tsx similarity index 63% rename from x-pack/legacy/plugins/lens/public/help_menu_util.tsx rename to x-pack/plugins/lens/public/help_menu_util.tsx index 9ead31690e854..333a90df4731b 100644 --- a/x-pack/legacy/plugins/lens/public/help_menu_util.tsx +++ b/x-pack/plugins/lens/public/help_menu_util.tsx @@ -4,16 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } from 'ui/documentation_links'; -import { ChromeStart } from 'kibana/public'; +import { ChromeStart, DocLinksStart } from 'kibana/public'; -export function addHelpMenuToAppChrome(chrome: ChromeStart) { +export function addHelpMenuToAppChrome(chrome: ChromeStart, docLinks: DocLinksStart) { chrome.setHelpExtension({ appName: 'Lens', links: [ { linkType: 'documentation', - href: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/lens.html`, + href: `${docLinks.ELASTIC_WEBSITE_URL}guide/en/kibana/${docLinks.DOC_LINK_VERSION}/lens.html`, }, { linkType: 'github', diff --git a/x-pack/legacy/plugins/lens/public/helpers/index.ts b/x-pack/plugins/lens/public/helpers/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/helpers/index.ts rename to x-pack/plugins/lens/public/helpers/index.ts diff --git a/x-pack/legacy/plugins/lens/public/helpers/url_helper.test.ts b/x-pack/plugins/lens/public/helpers/url_helper.test.ts similarity index 96% rename from x-pack/legacy/plugins/lens/public/helpers/url_helper.test.ts rename to x-pack/plugins/lens/public/helpers/url_helper.test.ts index ef960fb52952b..37e35ca17e0b3 100644 --- a/x-pack/legacy/plugins/lens/public/helpers/url_helper.test.ts +++ b/x-pack/plugins/lens/public/helpers/url_helper.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -jest.mock('../../../../../../src/plugins/dashboard/public', () => ({ +jest.mock('../../../../../src/plugins/dashboard/public', () => ({ DashboardConstants: { ADD_EMBEDDABLE_ID: 'addEmbeddableId', ADD_EMBEDDABLE_TYPE: 'addEmbeddableType', diff --git a/x-pack/legacy/plugins/lens/public/helpers/url_helper.ts b/x-pack/plugins/lens/public/helpers/url_helper.ts similarity index 95% rename from x-pack/legacy/plugins/lens/public/helpers/url_helper.ts rename to x-pack/plugins/lens/public/helpers/url_helper.ts index 3495c15118ce7..0a97ba4b2edf7 100644 --- a/x-pack/legacy/plugins/lens/public/helpers/url_helper.ts +++ b/x-pack/plugins/lens/public/helpers/url_helper.ts @@ -5,7 +5,7 @@ */ import { parseUrl, stringify } from 'query-string'; -import { DashboardConstants } from '../../../../../../src/plugins/dashboard/public'; +import { DashboardConstants } from '../../../../../src/plugins/dashboard/public'; type UrlVars = Record; diff --git a/x-pack/legacy/plugins/lens/public/id_generator/id_generator.test.ts b/x-pack/plugins/lens/public/id_generator/id_generator.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/id_generator/id_generator.test.ts rename to x-pack/plugins/lens/public/id_generator/id_generator.test.ts diff --git a/x-pack/legacy/plugins/lens/public/id_generator/id_generator.ts b/x-pack/plugins/lens/public/id_generator/id_generator.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/id_generator/id_generator.ts rename to x-pack/plugins/lens/public/id_generator/id_generator.ts diff --git a/x-pack/legacy/plugins/lens/public/id_generator/index.ts b/x-pack/plugins/lens/public/id_generator/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/id_generator/index.ts rename to x-pack/plugins/lens/public/id_generator/index.ts diff --git a/x-pack/legacy/plugins/lens/public/index.scss b/x-pack/plugins/lens/public/index.scss similarity index 54% rename from x-pack/legacy/plugins/lens/public/index.scss rename to x-pack/plugins/lens/public/index.scss index 2f91d14c397c7..67bbac12be8c3 100644 --- a/x-pack/legacy/plugins/lens/public/index.scss +++ b/x-pack/plugins/lens/public/index.scss @@ -1,12 +1,13 @@ // Import the EUI global scope so we can use EUI constants -@import 'src/legacy/ui/public/styles/_styling_constants'; +@import '@elastic/eui/src/global_styling/variables/index'; +@import '@elastic/eui/src/global_styling/mixins/index'; -@import './variables'; -@import './mixins'; +@import 'variables'; +@import 'mixins'; -@import './app_plugin/index'; +@import 'app_plugin/index'; @import 'datatable_visualization/index'; -@import './drag_drop/index'; +@import 'drag_drop/index'; @import 'editor_frame_service/index'; @import 'indexpattern_datasource/index'; @import 'xy_visualization/index'; diff --git a/x-pack/legacy/plugins/lens/public/index.ts b/x-pack/plugins/lens/public/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/index.ts rename to x-pack/plugins/lens/public/index.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/__mocks__/loader.ts b/x-pack/plugins/lens/public/indexpattern_datasource/__mocks__/loader.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/__mocks__/loader.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/__mocks__/loader.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/__mocks__/state_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/__mocks__/state_helpers.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/__mocks__/state_helpers.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/__mocks__/state_helpers.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/__snapshots__/lens_field_icon.test.tsx.snap b/x-pack/plugins/lens/public/indexpattern_datasource/__snapshots__/lens_field_icon.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/__snapshots__/lens_field_icon.test.tsx.snap rename to x-pack/plugins/lens/public/indexpattern_datasource/__snapshots__/lens_field_icon.test.tsx.snap diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/_datapanel.scss b/x-pack/plugins/lens/public/indexpattern_datasource/_datapanel.scss similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/_datapanel.scss rename to x-pack/plugins/lens/public/indexpattern_datasource/_datapanel.scss diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/_field_item.scss b/x-pack/plugins/lens/public/indexpattern_datasource/_field_item.scss similarity index 98% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/_field_item.scss rename to x-pack/plugins/lens/public/indexpattern_datasource/_field_item.scss index 89f6bbf908419..41919b900c71f 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/_field_item.scss +++ b/x-pack/plugins/lens/public/indexpattern_datasource/_field_item.scss @@ -14,7 +14,7 @@ } .lnsFieldItem--missing { - background: lightOrDarkTheme(transparentize($euiColorMediumShade, 0.9), $euiColorEmptyShade); + background: lightOrDarkTheme(transparentize($euiColorMediumShade, .9), $euiColorEmptyShade); color: $euiColorDarkShade; } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/_index.scss b/x-pack/plugins/lens/public/indexpattern_datasource/_index.scss new file mode 100644 index 0000000000000..e5d8b408e33e5 --- /dev/null +++ b/x-pack/plugins/lens/public/indexpattern_datasource/_index.scss @@ -0,0 +1,4 @@ +@import 'datapanel'; +@import 'field_item'; + +@import 'dimension_panel/index'; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/auto_date.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/auto_date.test.ts similarity index 96% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/auto_date.test.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/auto_date.test.ts index cc1a74a1854ce..5f35ef650a08c 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/auto_date.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/auto_date.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; +import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; import { getAutoDate } from './auto_date'; describe('auto_date', () => { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/auto_date.ts b/x-pack/plugins/lens/public/indexpattern_datasource/auto_date.ts similarity index 92% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/auto_date.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/auto_date.ts index 063cbb4d217a7..97a46f4a3e176 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/auto_date.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/auto_date.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DataPublicPluginSetup } from '../../../../../../src/plugins/data/public'; +import { DataPublicPluginSetup } from '../../../../../src/plugins/data/public'; import { ExpressionFunctionDefinition, KibanaContext, -} from '../../../../../../src/plugins/expressions/public'; +} from '../../../../../src/plugins/expressions/public'; interface LensAutoDateProps { aggConfigs: string; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/change_indexpattern.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/change_indexpattern.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/change_indexpattern.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/change_indexpattern.tsx diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx index 3066ac0e11325..c396f0efee42e 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx @@ -6,6 +6,7 @@ import React, { ChangeEvent } from 'react'; import { createMockedDragDropContext } from './mocks'; +import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; import { InnerIndexPatternDataPanel, IndexPatternDataPanel, MemoizedDataPanel } from './datapanel'; import { FieldItem } from './field_item'; import { act } from 'react-dom/test-utils'; @@ -16,8 +17,6 @@ import { ChangeIndexPattern } from './change_indexpattern'; import { EuiProgress } from '@elastic/eui'; import { documentField } from './document_field'; -jest.mock('ui/new_platform'); - const initialState: IndexPatternPrivateState = { indexPatternRefs: [], existingFields: {}, @@ -218,6 +217,7 @@ describe('IndexPattern Data Panel', () => { defaultProps = { indexPatternRefs: [], existingFields: {}, + data: dataPluginMock.createStartContract(), dragDropContext: createMockedDragDropContext(), currentIndexPatternId: '1', indexPatterns: initialState.indexPatterns, diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/datapanel.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/datapanel.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx index 7a3c04b67fbc4..79dcdafd916b4 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/datapanel.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx @@ -27,6 +27,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { DataPublicPluginStart } from 'src/plugins/data/public'; import { DatasourceDataPanelProps, DataType, StateSetter } from '../types'; import { ChildDragDropProvider, DragContextState } from '../drag_drop'; import { FieldItem } from './field_item'; @@ -40,9 +41,10 @@ import { trackUiEvent } from '../lens_ui_telemetry'; import { syncExistingFields } from './loader'; import { fieldExists } from './pure_helpers'; import { Loader } from '../loader'; -import { esQuery, IIndexPattern } from '../../../../../../src/plugins/data/public'; +import { esQuery, IIndexPattern } from '../../../../../src/plugins/data/public'; export type Props = DatasourceDataPanelProps & { + data: DataPublicPluginStart; changeIndexPattern: ( id: string, state: IndexPatternPrivateState, @@ -78,6 +80,7 @@ export function IndexPatternDataPanel({ state, dragDropContext, core, + data, query, filters, dateRange, @@ -152,6 +155,7 @@ export function IndexPatternDataPanel({ showEmptyFields={state.showEmptyFields} onToggleEmptyFields={onToggleEmptyFields} core={core} + data={data} onChangeIndexPattern={onChangeIndexPattern} existingFields={state.existingFields} /> @@ -177,8 +181,10 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ showEmptyFields, onToggleEmptyFields, core, + data, existingFields, }: Pick> & { + data: DataPublicPluginStart; currentIndexPatternId: string; indexPatternRefs: IndexPatternRef[]; indexPatterns: Record; @@ -441,6 +447,7 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ {specialFields.map(field => ( { let defaultProps: FieldItemProps; let indexPattern: IndexPattern; let core: ReturnType; + let data: DataPublicPluginStart; beforeEach(() => { indexPattern = { @@ -61,9 +60,11 @@ describe('IndexPattern Field Item', () => { } as IndexPattern; core = coreMock.createSetup(); + data = dataPluginMock.createStartContract(); core.http.post.mockClear(); defaultProps = { indexPattern, + data, core, highlight: '', dateRange: { @@ -81,7 +82,7 @@ describe('IndexPattern Field Item', () => { exists: true, }; - npStart.plugins.data.fieldFormats = ({ + data.fieldFormats = ({ getDefaultInstance: jest.fn(() => ({ convert: jest.fn((s: unknown) => JSON.stringify(s)), })), diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/field_item.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx similarity index 97% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/field_item.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx index b98f589bc5b98..c4d2a6f8780c6 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -20,7 +20,6 @@ import { EuiText, EuiToolTip, } from '@elastic/eui'; -import { npStart } from 'ui/new_platform'; import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { Axis, @@ -33,6 +32,7 @@ import { TooltipType, } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; +import { DataPublicPluginStart } from 'src/plugins/data/public'; import { Query, KBN_FIELD_TYPES, @@ -40,17 +40,18 @@ import { Filter, esQuery, IIndexPattern, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../src/plugins/data/public'; import { DraggedField } from './indexpattern'; import { DragDrop } from '../drag_drop'; import { DatasourceDataPanelProps, DataType } from '../types'; -import { BucketedAggregation, FieldStatsResponse } from '../../../../../plugins/lens/common'; +import { BucketedAggregation, FieldStatsResponse } from '../../common'; import { IndexPattern, IndexPatternField } from './types'; import { LensFieldIcon } from './lens_field_icon'; import { trackUiEvent } from '../lens_ui_telemetry'; export interface FieldItemProps { core: DatasourceDataPanelProps['core']; + data: DataPublicPluginStart; field: IndexPatternField; indexPattern: IndexPattern; highlight?: string; @@ -237,8 +238,16 @@ export function FieldItem(props: FieldItemProps) { } function FieldItemPopoverContents(props: State & FieldItemProps) { - const fieldFormats = npStart.plugins.data.fieldFormats; - const { histogram, topValues, indexPattern, field, dateRange, core, sampledValues } = props; + const { + histogram, + topValues, + indexPattern, + field, + dateRange, + core, + sampledValues, + data: { fieldFormats }, + } = props; const IS_DARK_THEME = core.uiSettings.get('theme:darkMode'); const chartTheme = IS_DARK_THEME ? EUI_CHARTS_THEME_DARK.theme : EUI_CHARTS_THEME_LIGHT.theme; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/index.ts similarity index 84% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/index.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/index.ts index 8a5c562ebd455..fe14f472341af 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/index.ts @@ -4,16 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup } from 'src/core/public'; -import { Storage } from '../../../../../../src/plugins/kibana_utils/public'; +import { CoreSetup } from 'kibana/public'; +import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { getIndexPatternDatasource } from './indexpattern'; import { renameColumns } from './rename_columns'; import { getAutoDate } from './auto_date'; -import { ExpressionsSetup } from '../../../../../../src/plugins/expressions/public'; +import { ExpressionsSetup } from '../../../../../src/plugins/expressions/public'; import { DataPublicPluginSetup, DataPublicPluginStart, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../src/plugins/data/public'; import { Datasource, EditorFrameSetup } from '../types'; export interface IndexPatternDatasourceSetupPlugins { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts similarity index 98% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts index 76e59a170a9e9..dbdbe4e3f9442 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts @@ -8,13 +8,11 @@ import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { getIndexPatternDatasource, IndexPatternColumn, uniqueLabels } from './indexpattern'; import { DatasourcePublicAPI, Operation, Datasource } from '../types'; import { coreMock } from 'src/core/public/mocks'; -import { pluginsMock } from 'ui/new_platform/__mocks__/helpers'; import { IndexPatternPersistedState, IndexPatternPrivateState } from './types'; +import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; jest.mock('./loader'); jest.mock('../id_generator'); -// Contains old and new platform data plugins, used for interpreter and filter ratio -jest.mock('ui/new_platform'); const expectedIndexPatterns = { 1: { @@ -140,7 +138,7 @@ describe('IndexPattern Data Source', () => { indexPatternDatasource = getIndexPatternDatasource({ storage: {} as IStorageWrapper, core: coreMock.createStart(), - data: pluginsMock.createStart().data, + data: dataPluginMock.createStartContract(), }); persistedState = { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx similarity index 96% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx index 9c2a9c9bf4a09..b8f0460f2a9ab 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx @@ -8,7 +8,7 @@ import _ from 'lodash'; import React from 'react'; import { render } from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; -import { CoreStart } from 'src/core/public'; +import { CoreStart } from 'kibana/public'; import { i18n } from '@kbn/i18n'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { @@ -42,10 +42,10 @@ import { IndexPatternPrivateState, IndexPatternPersistedState, } from './types'; -import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; -import { Plugin as DataPlugin } from '../../../../../../src/plugins/data/public'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; import { deleteColumn } from './state_helpers'; -import { Datasource, StateSetter } from '..'; +import { Datasource, StateSetter } from '../index'; export { OperationType, IndexPatternColumn } from './operations'; @@ -105,7 +105,7 @@ export function getIndexPatternDatasource({ }: { core: CoreStart; storage: IStorageWrapper; - data: ReturnType; + data: DataPublicPluginStart; }) { const savedObjectsClient = core.savedObjects.client; const uiSettings = core.uiSettings; @@ -209,6 +209,7 @@ export function getIndexPatternDatasource({ onError: onIndexPatternLoadError, }); }} + data={data} {...props} /> , diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx index fe14e5de5c1e3..2008b326a539c 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx @@ -12,7 +12,6 @@ import { getDatasourceSuggestionsFromCurrentState, } from './indexpattern_suggestions'; -jest.mock('ui/new_platform'); jest.mock('./loader'); jest.mock('../id_generator'); diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/layerpanel.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/layerpanel.test.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/layerpanel.test.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/layerpanel.test.tsx index 219a6d935e436..4dd29d7925916 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/layerpanel.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/layerpanel.test.tsx @@ -12,7 +12,6 @@ import { ShallowWrapper } from 'enzyme'; import { EuiSelectable, EuiSelectableList } from '@elastic/eui'; import { ChangeIndexPattern } from './change_indexpattern'; -jest.mock('ui/new_platform'); jest.mock('./state_helpers'); const initialState: IndexPatternPrivateState = { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/layerpanel.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/layerpanel.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/layerpanel.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/layerpanel.tsx diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/lens_field_icon.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/lens_field_icon.test.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/lens_field_icon.test.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/lens_field_icon.test.tsx diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/lens_field_icon.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/lens_field_icon.tsx similarity index 86% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/lens_field_icon.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/lens_field_icon.tsx index 06eda73748cef..bcc83e799d889 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/lens_field_icon.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/lens_field_icon.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { FieldIcon, FieldIconProps } from '../../../../../../src/plugins/kibana_react/public'; +import { FieldIcon, FieldIconProps } from '../../../../../src/plugins/kibana_react/public'; import { DataType } from '../types'; import { normalizeOperationDataType } from './utils'; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/loader.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/loader.test.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts index ea9c8213ba909..cacf729ba0caf 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/loader.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts @@ -16,8 +16,6 @@ import { import { IndexPatternPersistedState, IndexPatternPrivateState } from './types'; import { documentField } from './document_field'; -// TODO: This should not be necessary -jest.mock('ui/new_platform'); jest.mock('./operations'); const sampleIndexPatterns = { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/loader.ts b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts similarity index 96% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/loader.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/loader.ts index f4d5857f4826d..23faab768eba6 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/loader.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts @@ -5,8 +5,8 @@ */ import _ from 'lodash'; -import { SavedObjectsClientContract, SavedObjectAttributes, HttpSetup } from 'src/core/public'; -import { SimpleSavedObject } from 'src/core/public'; +import { SavedObjectsClientContract, SavedObjectAttributes, HttpSetup } from 'kibana/public'; +import { SimpleSavedObject } from 'kibana/public'; import { StateSetter } from '../types'; import { IndexPattern, @@ -16,14 +16,14 @@ import { IndexPatternField, } from './types'; import { updateLayerIndexPattern } from './state_helpers'; -import { DateRange, ExistingFields } from '../../../../../plugins/lens/common/types'; -import { BASE_API_URL } from '../../../../../plugins/lens/common'; +import { DateRange, ExistingFields } from '../../common/types'; +import { BASE_API_URL } from '../../common'; import { documentField } from './document_field'; import { indexPatterns as indexPatternsUtils, IFieldType, IndexPatternTypeMeta, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../src/plugins/data/public'; interface SavedIndexPatternAttributes extends SavedObjectAttributes { title: string; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/mocks.ts b/x-pack/plugins/lens/public/indexpattern_datasource/mocks.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/mocks.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/mocks.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx index 33325016deaeb..9491ca9ea3787 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx @@ -5,7 +5,7 @@ */ import { i18n } from '@kbn/i18n'; -import { OperationDefinition } from '.'; +import { OperationDefinition } from './index'; import { FormattedIndexPatternColumn } from './column_types'; const supportedTypes = new Set(['string', 'boolean', 'number', 'ip', 'date']); diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx similarity index 97% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx index 1592b1049f666..1dcaf78b58a6c 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx @@ -5,7 +5,7 @@ */ import { i18n } from '@kbn/i18n'; -import { OperationDefinition } from '.'; +import { OperationDefinition } from './index'; import { FormattedIndexPatternColumn } from './column_types'; import { IndexPatternField } from '../../types'; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx index dc279fca82d4b..e3b6061248f3b 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx @@ -6,21 +6,19 @@ import React from 'react'; import { DateHistogramIndexPatternColumn } from './date_histogram'; -import { dateHistogramOperation } from '.'; +import { dateHistogramOperation } from './index'; import { shallow } from 'enzyme'; import { EuiSwitch, EuiSwitchEvent } from '@elastic/eui'; -import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'src/core/public'; +import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'kibana/public'; import { coreMock } from 'src/core/public/mocks'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { dataPluginMock, getCalculateAutoTimeExpression, -} from '../../../../../../../../src/plugins/data/public/mocks'; +} from '../../../../../../../src/plugins/data/public/mocks'; import { createMockedIndexPattern } from '../../mocks'; import { IndexPatternPrivateState } from '../../types'; -jest.mock('ui/new_platform'); - const dataStart = dataPluginMock.createStartContract(); dataStart.search.aggs.calculateAutoTimeExpression = getCalculateAutoTimeExpression({ ...coreMock.createStart().uiSettings, diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx index 452d5c9140868..7a36d52ad897b 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx @@ -21,12 +21,9 @@ import { EuiSpacer, } from '@elastic/eui'; import { updateColumnParam } from '../../state_helpers'; -import { OperationDefinition } from '.'; +import { OperationDefinition } from './index'; import { FieldBasedIndexPatternColumn } from './column_types'; -import { - IndexPatternAggRestrictions, - search, -} from '../../../../../../../../src/plugins/data/public'; +import { IndexPatternAggRestrictions, search } from '../../../../../../../src/plugins/data/public'; const { isValidInterval } = search.aggs; const autoInterval = 'auto'; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts similarity index 97% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts index 2db5296905000..ef12fca690f0c 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'src/core/public'; +import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'kibana/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { termsOperation } from './terms'; import { cardinalityOperation } from './cardinality'; @@ -14,8 +14,8 @@ import { countOperation } from './count'; import { DimensionPriority, StateSetter, OperationMetadata } from '../../../types'; import { BaseIndexPatternColumn } from './column_types'; import { IndexPatternPrivateState, IndexPattern, IndexPatternField } from '../../types'; -import { DateRange } from '../../../../../../../plugins/lens/common'; -import { DataPublicPluginStart } from '../../../../../../../../src/plugins/data/public'; +import { DateRange } from '../../../../common'; +import { DataPublicPluginStart } from '../../../../../../../src/plugins/data/public'; // List of all operation definitions registered to this data source. // If you want to implement a new operation, add it to this array and diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx index c2d9478c6ea15..3da635dc13d10 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx @@ -5,7 +5,7 @@ */ import { i18n } from '@kbn/i18n'; -import { OperationDefinition } from '.'; +import { OperationDefinition } from './index'; import { FormattedIndexPatternColumn } from './column_types'; type MetricColumn = FormattedIndexPatternColumn & { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.test.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.test.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.test.tsx index fc0c9746b2f98..8f6130e74b5b8 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.test.tsx @@ -7,16 +7,14 @@ import React from 'react'; import { shallow } from 'enzyme'; import { EuiRange, EuiSelect } from '@elastic/eui'; -import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'src/core/public'; +import { IUiSettingsClient, SavedObjectsClientContract, HttpSetup } from 'kibana/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; -import { dataPluginMock } from '../../../../../../../../src/plugins/data/public/mocks'; +import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; import { createMockedIndexPattern } from '../../mocks'; import { TermsIndexPatternColumn } from './terms'; -import { termsOperation } from '.'; +import { termsOperation } from './index'; import { IndexPatternPrivateState } from '../../types'; -jest.mock('ui/new_platform'); - const defaultProps = { storage: {} as IStorageWrapper, uiSettings: {} as IUiSettingsClient, diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx index 387b197c9235c..29e5787fa4f54 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms.tsx @@ -10,7 +10,7 @@ import { EuiForm, EuiFormRow, EuiRange, EuiSelect } from '@elastic/eui'; import { IndexPatternColumn } from '../../indexpattern'; import { updateColumnParam } from '../../state_helpers'; import { DataType } from '../../../types'; -import { OperationDefinition } from '.'; +import { OperationDefinition } from './index'; import { FieldBasedIndexPatternColumn } from './column_types'; type PropType = C extends React.ComponentType ? P : unknown; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/index.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/index.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts index 3602491c6eb2c..111b1040de989 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts @@ -4,13 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getOperationTypesForField, getAvailableOperationsByMetadata, buildColumn } from '.'; +import { getOperationTypesForField, getAvailableOperationsByMetadata, buildColumn } from './index'; import { AvgIndexPatternColumn, MinIndexPatternColumn } from './definitions/metrics'; import { CountIndexPatternColumn } from './definitions/count'; import { IndexPatternPrivateState } from '../types'; import { documentField } from '../document_field'; -jest.mock('ui/new_platform'); jest.mock('../loader'); const expectedIndexPatterns = { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/operations.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/operations/operations.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/pure_helpers.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/pure_helpers.test.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.test.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/pure_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/pure_helpers.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts similarity index 96% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts index 9da7591305a6c..4bfd6a4f93c75 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts @@ -5,8 +5,8 @@ */ import { renameColumns } from './rename_columns'; -import { KibanaDatatable } from '../../../../../../src/plugins/expressions/public'; -import { createMockExecutionContext } from '../../../../../../src/plugins/expressions/common/mocks'; +import { KibanaDatatable } from '../../../../../src/plugins/expressions/public'; +import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks'; describe('rename_columns', () => { it('should rename columns of a given datatable', () => { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/rename_columns.ts b/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/rename_columns.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts similarity index 99% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts index 0a58853f1ef4f..1e3251a8dedd8 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.test.ts @@ -17,7 +17,6 @@ import { DateHistogramIndexPatternColumn } from './operations/definitions/date_h import { AvgIndexPatternColumn } from './operations/definitions/metrics'; import { IndexPattern, IndexPatternPrivateState, IndexPatternLayer } from './types'; -jest.mock('ui/new_platform'); jest.mock('./operations'); describe('state_helpers', () => { diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/state_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/state_helpers.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/state_helpers.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/to_expression.ts b/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/to_expression.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/types.ts b/x-pack/plugins/lens/public/indexpattern_datasource/types.ts similarity index 94% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/types.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/types.ts index 3820ff3b387bb..563af40ed2720 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/types.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/types.ts @@ -5,7 +5,7 @@ */ import { IndexPatternColumn } from './operations'; -import { IndexPatternAggRestrictions } from '../../../../../../src/plugins/data/public'; +import { IndexPatternAggRestrictions } from '../../../../../src/plugins/data/public'; export interface IndexPattern { id: string; diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_datasource/utils.ts b/x-pack/plugins/lens/public/indexpattern_datasource/utils.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/indexpattern_datasource/utils.ts rename to x-pack/plugins/lens/public/indexpattern_datasource/utils.ts diff --git a/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.test.ts b/x-pack/plugins/lens/public/lens_ui_telemetry/factory.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.test.ts rename to x-pack/plugins/lens/public/lens_ui_telemetry/factory.test.ts diff --git a/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.ts b/x-pack/plugins/lens/public/lens_ui_telemetry/factory.ts similarity index 96% rename from x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.ts rename to x-pack/plugins/lens/public/lens_ui_telemetry/factory.ts index 73750a65c50b8..10b052c66efed 100644 --- a/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/factory.ts +++ b/x-pack/plugins/lens/public/lens_ui_telemetry/factory.ts @@ -5,10 +5,10 @@ */ import moment from 'moment'; -import { HttpSetup } from 'src/core/public'; +import { HttpSetup } from 'kibana/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; -import { BASE_API_URL } from '../../../../../plugins/lens/common'; +import { BASE_API_URL } from '../../common'; const STORAGE_KEY = 'lens-ui-telemetry'; diff --git a/x-pack/legacy/plugins/lens/public/lens_ui_telemetry/index.ts b/x-pack/plugins/lens/public/lens_ui_telemetry/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/lens_ui_telemetry/index.ts rename to x-pack/plugins/lens/public/lens_ui_telemetry/index.ts diff --git a/x-pack/legacy/plugins/lens/public/loader.test.tsx b/x-pack/plugins/lens/public/loader.test.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/loader.test.tsx rename to x-pack/plugins/lens/public/loader.test.tsx diff --git a/x-pack/legacy/plugins/lens/public/loader.tsx b/x-pack/plugins/lens/public/loader.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/loader.tsx rename to x-pack/plugins/lens/public/loader.tsx diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/auto_scale.test.tsx b/x-pack/plugins/lens/public/metric_visualization/auto_scale.test.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/metric_visualization/auto_scale.test.tsx rename to x-pack/plugins/lens/public/metric_visualization/auto_scale.test.tsx diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/auto_scale.tsx b/x-pack/plugins/lens/public/metric_visualization/auto_scale.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/metric_visualization/auto_scale.tsx rename to x-pack/plugins/lens/public/metric_visualization/auto_scale.tsx diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/index.scss b/x-pack/plugins/lens/public/metric_visualization/index.scss similarity index 100% rename from x-pack/legacy/plugins/lens/public/metric_visualization/index.scss rename to x-pack/plugins/lens/public/metric_visualization/index.scss diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/index.ts b/x-pack/plugins/lens/public/metric_visualization/index.ts similarity index 88% rename from x-pack/legacy/plugins/lens/public/metric_visualization/index.ts rename to x-pack/plugins/lens/public/metric_visualization/index.ts index 65f064258a5e2..2960da52191e4 100644 --- a/x-pack/legacy/plugins/lens/public/metric_visualization/index.ts +++ b/x-pack/plugins/lens/public/metric_visualization/index.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup } from 'src/core/public'; +import { CoreSetup } from 'kibana/public'; import { metricVisualization } from './metric_visualization'; -import { ExpressionsSetup } from '../../../../../../src/plugins/expressions/public'; +import { ExpressionsSetup } from '../../../../../src/plugins/expressions/public'; import { metricChart, getMetricChartRenderer } from './metric_expression'; import { EditorFrameSetup, FormatFactory } from '../types'; diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.test.tsx b/x-pack/plugins/lens/public/metric_visualization/metric_expression.test.tsx similarity index 94% rename from x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.test.tsx rename to x-pack/plugins/lens/public/metric_visualization/metric_expression.test.tsx index 3da38d486aecd..2406e7cd42ebc 100644 --- a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.test.tsx +++ b/x-pack/plugins/lens/public/metric_visualization/metric_expression.test.tsx @@ -9,8 +9,8 @@ import { LensMultiTable } from '../types'; import React from 'react'; import { shallow } from 'enzyme'; import { MetricConfig } from './types'; -import { createMockExecutionContext } from '../../../../../../src/plugins/expressions/common/mocks'; -import { IFieldFormat } from '../../../../../../src/plugins/data/public'; +import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks'; +import { IFieldFormat } from '../../../../../src/plugins/data/public'; function sampleArgs() { const data: LensMultiTable = { diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.tsx b/x-pack/plugins/lens/public/metric_visualization/metric_expression.tsx similarity index 98% rename from x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.tsx rename to x-pack/plugins/lens/public/metric_visualization/metric_expression.tsx index a80552e57a9e0..3484837f65b43 100644 --- a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_expression.tsx +++ b/x-pack/plugins/lens/public/metric_visualization/metric_expression.tsx @@ -10,7 +10,7 @@ import { ExpressionFunctionDefinition, ExpressionRenderDefinition, IInterpreterRenderHandlers, -} from '../../../../../../src/plugins/expressions/public'; +} from '../../../../../src/plugins/expressions/public'; import { MetricConfig } from './types'; import { FormatFactory, LensMultiTable } from '../types'; import { AutoScale } from './auto_scale'; diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_suggestions.test.ts b/x-pack/plugins/lens/public/metric_visualization/metric_suggestions.test.ts similarity index 98% rename from x-pack/legacy/plugins/lens/public/metric_visualization/metric_suggestions.test.ts rename to x-pack/plugins/lens/public/metric_visualization/metric_suggestions.test.ts index c9bfadbefaf5f..ef93f0b5bf064 100644 --- a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_suggestions.test.ts +++ b/x-pack/plugins/lens/public/metric_visualization/metric_suggestions.test.ts @@ -5,7 +5,7 @@ */ import { getSuggestions } from './metric_suggestions'; -import { TableSuggestionColumn, TableSuggestion } from '..'; +import { TableSuggestionColumn, TableSuggestion } from '../index'; describe('metric_suggestions', () => { function numCol(columnId: string): TableSuggestionColumn { diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_suggestions.ts b/x-pack/plugins/lens/public/metric_visualization/metric_suggestions.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/metric_visualization/metric_suggestions.ts rename to x-pack/plugins/lens/public/metric_visualization/metric_suggestions.ts diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_visualization.test.ts b/x-pack/plugins/lens/public/metric_visualization/metric_visualization.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/metric_visualization/metric_visualization.test.ts rename to x-pack/plugins/lens/public/metric_visualization/metric_visualization.test.ts diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/metric_visualization.tsx b/x-pack/plugins/lens/public/metric_visualization/metric_visualization.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/metric_visualization/metric_visualization.tsx rename to x-pack/plugins/lens/public/metric_visualization/metric_visualization.tsx diff --git a/x-pack/legacy/plugins/lens/public/metric_visualization/types.ts b/x-pack/plugins/lens/public/metric_visualization/types.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/metric_visualization/types.ts rename to x-pack/plugins/lens/public/metric_visualization/types.ts diff --git a/x-pack/legacy/plugins/lens/public/native_renderer/index.ts b/x-pack/plugins/lens/public/native_renderer/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/native_renderer/index.ts rename to x-pack/plugins/lens/public/native_renderer/index.ts diff --git a/x-pack/legacy/plugins/lens/public/native_renderer/native_renderer.test.tsx b/x-pack/plugins/lens/public/native_renderer/native_renderer.test.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/native_renderer/native_renderer.test.tsx rename to x-pack/plugins/lens/public/native_renderer/native_renderer.test.tsx diff --git a/x-pack/legacy/plugins/lens/public/native_renderer/native_renderer.tsx b/x-pack/plugins/lens/public/native_renderer/native_renderer.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/native_renderer/native_renderer.tsx rename to x-pack/plugins/lens/public/native_renderer/native_renderer.tsx diff --git a/x-pack/legacy/plugins/lens/public/persistence/index.ts b/x-pack/plugins/lens/public/persistence/index.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/persistence/index.ts rename to x-pack/plugins/lens/public/persistence/index.ts diff --git a/x-pack/legacy/plugins/lens/public/persistence/saved_object_store.test.ts b/x-pack/plugins/lens/public/persistence/saved_object_store.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/persistence/saved_object_store.test.ts rename to x-pack/plugins/lens/public/persistence/saved_object_store.test.ts diff --git a/x-pack/legacy/plugins/lens/public/persistence/saved_object_store.ts b/x-pack/plugins/lens/public/persistence/saved_object_store.ts similarity index 94% rename from x-pack/legacy/plugins/lens/public/persistence/saved_object_store.ts rename to x-pack/plugins/lens/public/persistence/saved_object_store.ts index ac0b3322b400e..015f4b9b825f4 100644 --- a/x-pack/legacy/plugins/lens/public/persistence/saved_object_store.ts +++ b/x-pack/plugins/lens/public/persistence/saved_object_store.ts @@ -5,8 +5,8 @@ */ // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { SavedObjectAttributes } from 'src/core/server'; -import { Query, Filter } from '../../../../../../src/plugins/data/public'; +import { SavedObjectAttributes } from 'kibana/server'; +import { Query, Filter } from '../../../../../src/plugins/data/public'; export interface Document { id?: string; diff --git a/x-pack/legacy/plugins/lens/public/plugin.tsx b/x-pack/plugins/lens/public/plugin.tsx similarity index 90% rename from x-pack/legacy/plugins/lens/public/plugin.tsx rename to x-pack/plugins/lens/public/plugin.tsx index b426a12d07f9b..8d760eb0df501 100644 --- a/x-pack/legacy/plugins/lens/public/plugin.tsx +++ b/x-pack/plugins/lens/public/plugin.tsx @@ -11,14 +11,15 @@ import { render, unmountComponentAtNode } from 'react-dom'; import rison, { RisonObject, RisonValue } from 'rison-node'; import { isObject } from 'lodash'; -import { AppMountParameters, CoreSetup, CoreStart } from 'src/core/public'; +import { AppMountParameters, CoreSetup, CoreStart } from 'kibana/public'; import { DataPublicPluginSetup, DataPublicPluginStart } from 'src/plugins/data/public'; import { EmbeddableSetup, EmbeddableStart } from 'src/plugins/embeddable/public'; import { ExpressionsSetup, ExpressionsStart } from 'src/plugins/expressions/public'; import { VisualizationsSetup } from 'src/plugins/visualizations/public'; +import { NavigationPublicPluginStart } from 'src/plugins/navigation/public'; import { KibanaLegacySetup } from 'src/plugins/kibana_legacy/public'; -import { DashboardConstants } from '../../../../../src/plugins/dashboard/public'; -import { Storage } from '../../../../../src/plugins/kibana_utils/public'; +import { DashboardConstants } from '../../../../src/plugins/dashboard/public'; +import { Storage } from '../../../../src/plugins/kibana_utils/public'; import { EditorFrameService } from './editor_frame_service'; import { IndexPatternDatasource } from './indexpattern_datasource'; import { addHelpMenuToAppChrome } from './help_menu_util'; @@ -34,17 +35,19 @@ import { trackUiEvent, } from './lens_ui_telemetry'; -import { UiActionsStart } from '../../../../../src/plugins/ui_actions/public'; -import { NOT_INTERNATIONALIZED_PRODUCT_NAME } from '../../../../plugins/lens/common'; +import { UiActionsStart } from '../../../../src/plugins/ui_actions/public'; +import { NOT_INTERNATIONALIZED_PRODUCT_NAME } from '../common'; import { addEmbeddableToDashboardUrl, getUrlVars } from './helpers'; import { EditorFrameStart } from './types'; import { getLensAliasConfig } from './vis_type_alias'; +import './index.scss'; + export interface LensPluginSetupDependencies { kibanaLegacy: KibanaLegacySetup; expressions: ExpressionsSetup; data: DataPublicPluginSetup; - embeddable: EmbeddableSetup; + embeddable?: EmbeddableSetup; visualizations: VisualizationsSetup; } @@ -52,6 +55,7 @@ export interface LensPluginStartDependencies { data: DataPublicPluginStart; embeddable: EmbeddableStart; expressions: ExpressionsStart; + navigation: NavigationPublicPluginStart; uiActions: UiActionsStart; } @@ -75,7 +79,7 @@ export class LensPlugin { } setup( - core: CoreSetup, + core: CoreSetup, { kibanaLegacy, expressions, data, embeddable, visualizations }: LensPluginSetupDependencies ) { const editorFrameSetupInterface = this.editorFrameService.setup(core, { @@ -103,9 +107,9 @@ export class LensPlugin { title: NOT_INTERNATIONALIZED_PRODUCT_NAME, mount: async (params: AppMountParameters) => { const [coreStart, startDependencies] = await core.getStartServices(); - const dataStart = startDependencies.data; + const { data: dataStart, navigation } = startDependencies; const savedObjectsClient = coreStart.savedObjects.client; - addHelpMenuToAppChrome(coreStart.chrome); + addHelpMenuToAppChrome(coreStart.chrome, coreStart.docLinks); const instance = await this.createEditorFrame!(); @@ -157,6 +161,7 @@ export class LensPlugin { void; diff --git a/x-pack/legacy/plugins/lens/public/vis_type_alias.ts b/x-pack/plugins/lens/public/vis_type_alias.ts similarity index 95% rename from x-pack/legacy/plugins/lens/public/vis_type_alias.ts rename to x-pack/plugins/lens/public/vis_type_alias.ts index 123b994e6ccce..807504ee2b9c2 100644 --- a/x-pack/legacy/plugins/lens/public/vis_type_alias.ts +++ b/x-pack/plugins/lens/public/vis_type_alias.ts @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import { VisTypeAlias } from 'src/plugins/visualizations/public'; -import { getBasePath, getEditPath } from '../../../../plugins/lens/common'; +import { getBasePath, getEditPath } from '../common'; export const getLensAliasConfig = (): VisTypeAlias => ({ aliasUrl: getBasePath(), diff --git a/x-pack/legacy/plugins/lens/public/visualization_container.test.tsx b/x-pack/plugins/lens/public/visualization_container.test.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/visualization_container.test.tsx rename to x-pack/plugins/lens/public/visualization_container.test.tsx diff --git a/x-pack/legacy/plugins/lens/public/visualization_container.tsx b/x-pack/plugins/lens/public/visualization_container.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/visualization_container.tsx rename to x-pack/plugins/lens/public/visualization_container.tsx diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap rename to x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap rename to x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap diff --git a/x-pack/plugins/lens/public/xy_visualization/_index.scss b/x-pack/plugins/lens/public/xy_visualization/_index.scss new file mode 100644 index 0000000000000..110a9589a6fb4 --- /dev/null +++ b/x-pack/plugins/lens/public/xy_visualization/_index.scss @@ -0,0 +1 @@ +@import 'xy_expression'; diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/_xy_expression.scss b/x-pack/plugins/lens/public/xy_visualization/_xy_expression.scss similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/_xy_expression.scss rename to x-pack/plugins/lens/public/xy_visualization/_xy_expression.scss diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/index.ts b/x-pack/plugins/lens/public/xy_visualization/index.ts similarity index 89% rename from x-pack/legacy/plugins/lens/public/xy_visualization/index.ts rename to x-pack/plugins/lens/public/xy_visualization/index.ts index 8cc5abb44d6e1..5dfae097be834 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/index.ts +++ b/x-pack/plugins/lens/public/xy_visualization/index.ts @@ -5,14 +5,14 @@ */ import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; -import { CoreSetup, IUiSettingsClient, CoreStart } from 'src/core/public'; +import { CoreSetup, IUiSettingsClient, CoreStart } from 'kibana/public'; import moment from 'moment-timezone'; -import { ExpressionsSetup } from '../../../../../../src/plugins/expressions/public'; +import { ExpressionsSetup } from '../../../../../src/plugins/expressions/public'; import { xyVisualization } from './xy_visualization'; import { xyChart, getXyChartRenderer } from './xy_expression'; import { legendConfig, xConfig, layerConfig } from './types'; import { EditorFrameSetup, FormatFactory } from '../types'; -import { UiActionsStart } from '../../../../../../src/plugins/ui_actions/public'; +import { UiActionsStart } from '../../../../../src/plugins/ui_actions/public'; import { setExecuteTriggerActions } from './services'; export interface XyVisualizationPluginSetupPlugins { diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/services.ts b/x-pack/plugins/lens/public/xy_visualization/services.ts similarity index 70% rename from x-pack/legacy/plugins/lens/public/xy_visualization/services.ts rename to x-pack/plugins/lens/public/xy_visualization/services.ts index af683efb86534..51289fe0c63e7 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/services.ts +++ b/x-pack/plugins/lens/public/xy_visualization/services.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createGetterSetter } from '../../../../../../src/plugins/kibana_utils/public'; -import { UiActionsStart } from '../../../../../../src/plugins/ui_actions/public'; +import { createGetterSetter } from '../../../../../src/plugins/kibana_utils/public'; +import { UiActionsStart } from '../../../../../src/plugins/ui_actions/public'; export const [getExecuteTriggerActions, setExecuteTriggerActions] = createGetterSetter< UiActionsStart['executeTriggerActions'] diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/state_helpers.ts b/x-pack/plugins/lens/public/xy_visualization/state_helpers.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/state_helpers.ts rename to x-pack/plugins/lens/public/xy_visualization/state_helpers.ts diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/to_expression.test.ts b/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/to_expression.test.ts rename to x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/to_expression.ts b/x-pack/plugins/lens/public/xy_visualization/to_expression.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/to_expression.ts rename to x-pack/plugins/lens/public/xy_visualization/to_expression.ts diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/types.ts b/x-pack/plugins/lens/public/xy_visualization/types.ts similarity index 99% rename from x-pack/legacy/plugins/lens/public/xy_visualization/types.ts rename to x-pack/plugins/lens/public/xy_visualization/types.ts index f7b4afc76ec4b..7a5837d382c7b 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/types.ts +++ b/x-pack/plugins/lens/public/xy_visualization/types.ts @@ -15,7 +15,7 @@ import chartBarHorizontalSVG from '../assets/chart_bar_horizontal.svg'; import chartBarHorizontalStackedSVG from '../assets/chart_bar_horizontal_stacked.svg'; import chartLineSVG from '../assets/chart_line.svg'; -import { VisualizationType } from '..'; +import { VisualizationType } from '../index'; export interface LegendConfig { isVisible: boolean; diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx rename to x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_config_panel.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_config_panel.tsx rename to x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx similarity index 99% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx rename to x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx index 0a6945dd0c1f0..80d33d1b95b61 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.test.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx @@ -18,14 +18,11 @@ import { } from '@elastic/charts'; import { xyChart, XYChart } from './xy_expression'; import { LensMultiTable } from '../types'; -import { - KibanaDatatable, - KibanaDatatableRow, -} from '../../../../../../src/plugins/expressions/public'; +import { KibanaDatatable, KibanaDatatableRow } from '../../../../../src/plugins/expressions/public'; import React from 'react'; import { shallow } from 'enzyme'; import { XYArgs, LegendConfig, legendConfig, layerConfig, LayerArgs } from './types'; -import { createMockExecutionContext } from '../../../../../../src/plugins/expressions/common/mocks'; +import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; const executeTriggerActions = jest.fn(); diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx similarity index 97% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx rename to x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx index 527eedf1083c2..f12a0e5b907c7 100644 --- a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -28,14 +28,14 @@ import { import { EuiIcon, EuiText, IconType, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { EmbeddableVisTriggerContext } from '../../../../../../src/plugins/embeddable/public'; -import { VIS_EVENT_TO_TRIGGER } from '../../../../../../src/plugins/visualizations/public'; +import { EmbeddableVisTriggerContext } from '../../../../../src/plugins/embeddable/public'; +import { VIS_EVENT_TO_TRIGGER } from '../../../../../src/plugins/visualizations/public'; import { LensMultiTable, FormatFactory } from '../types'; import { XYArgs, SeriesType, visualizationTypes } from './types'; import { VisualizationContainer } from '../visualization_container'; import { isHorizontalChart } from './state_helpers'; -import { UiActionsStart } from '../../../../../../src/plugins/ui_actions/public'; -import { parseInterval } from '../../../../../../src/plugins/data/common'; +import { UiActionsStart } from '../../../../../src/plugins/ui_actions/public'; +import { parseInterval } from '../../../../../src/plugins/data/common'; import { getExecuteTriggerActions } from './services'; type InferPropType = T extends React.FunctionComponent ? P : T; diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_suggestions.test.ts b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_suggestions.test.ts rename to x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_suggestions.ts b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_suggestions.ts rename to x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_visualization.test.ts b/x-pack/plugins/lens/public/xy_visualization/xy_visualization.test.ts similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_visualization.test.ts rename to x-pack/plugins/lens/public/xy_visualization/xy_visualization.test.ts diff --git a/x-pack/legacy/plugins/lens/public/xy_visualization/xy_visualization.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_visualization.tsx similarity index 100% rename from x-pack/legacy/plugins/lens/public/xy_visualization/xy_visualization.tsx rename to x-pack/plugins/lens/public/xy_visualization/xy_visualization.tsx diff --git a/x-pack/legacy/plugins/lens/readme.md b/x-pack/plugins/lens/readme.md similarity index 100% rename from x-pack/legacy/plugins/lens/readme.md rename to x-pack/plugins/lens/readme.md diff --git a/x-pack/plugins/lens/server/index.ts b/x-pack/plugins/lens/server/index.ts index 3b9e94986d247..8aeeeab4539b6 100644 --- a/x-pack/plugins/lens/server/index.ts +++ b/x-pack/plugins/lens/server/index.ts @@ -4,10 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext } from 'kibana/server'; +import { PluginInitializerContext, PluginConfigDescriptor } from 'kibana/server'; import { LensServerPlugin } from './plugin'; export * from './plugin'; +import { configSchema, ConfigSchema } from '../config'; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + export const plugin = (initializerContext: PluginInitializerContext) => new LensServerPlugin(initializerContext); From d1134c551e63cf7efa28b966e68d2a3ce71ddf1b Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Wed, 15 Apr 2020 12:34:16 +0100 Subject: [PATCH 12/80] [Alerting] Handle when an Alerting Task fails due to its Alert object being deleted mid flight (#63093) Detects if a task run failed due to the task SO being deleted mid flight and if so writes debug logs instead of warnings. Detects if an Alerting task run failed due to the alert SO being deleted mid flight of the task and if so ensures the task doesn't reschedule itself (as it usually would with other types of tasks). Ensures that the operation of deleting or disabling an Alert won't fail if it fails to delete an already deleted task (a task might preemptively self delete if its underlying alert object was deleted, even if the overall delete operation wasn't deleted). --- .../plugins/alerting/server/alerts_client.ts | 7 ++- .../lib/delete_task_if_it_exists.test.ts | 44 +++++++++++++++++++ .../server/lib/delete_task_if_it_exists.ts | 17 +++++++ .../lib/is_alert_not_found_error.test.ts | 31 +++++++++++++ .../server/lib/is_alert_not_found_error.ts | 11 +++++ .../server/task_runner/task_runner.test.ts | 33 ++++++++++++++ .../server/task_runner/task_runner.ts | 30 ++++++++----- .../tasks/visualizations/task_runner.test.ts | 8 +--- .../lib/is_task_not_found_error.test.ts | 31 +++++++++++++ .../server/lib/is_task_not_found_error.ts | 11 +++++ .../task_manager/server/task_pool.test.ts | 25 +++++++++++ .../plugins/task_manager/server/task_pool.ts | 13 +++++- 12 files changed, 240 insertions(+), 21 deletions(-) create mode 100644 x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.test.ts create mode 100644 x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.ts create mode 100644 x-pack/plugins/alerting/server/lib/is_alert_not_found_error.test.ts create mode 100644 x-pack/plugins/alerting/server/lib/is_alert_not_found_error.ts create mode 100644 x-pack/plugins/task_manager/server/lib/is_task_not_found_error.test.ts create mode 100644 x-pack/plugins/task_manager/server/lib/is_task_not_found_error.ts diff --git a/x-pack/plugins/alerting/server/alerts_client.ts b/x-pack/plugins/alerting/server/alerts_client.ts index 6f8478df58a53..3e4c26d3444c9 100644 --- a/x-pack/plugins/alerting/server/alerts_client.ts +++ b/x-pack/plugins/alerting/server/alerts_client.ts @@ -34,6 +34,7 @@ import { import { EncryptedSavedObjectsPluginStart } from '../../../plugins/encrypted_saved_objects/server'; import { TaskManagerStartContract } from '../../../plugins/task_manager/server'; import { taskInstanceToAlertTaskInstance } from './task_runner/alert_task_instance'; +import { deleteTaskIfItExists } from './lib/delete_task_if_it_exists'; type NormalizedAlertAction = Omit; export type CreateAPIKeyResult = @@ -268,7 +269,7 @@ export class AlertsClient { const removeResult = await this.savedObjectsClient.delete('alert', id); await Promise.all([ - taskIdToRemove ? this.taskManager.remove(taskIdToRemove) : null, + taskIdToRemove ? deleteTaskIfItExists(this.taskManager, taskIdToRemove) : null, apiKeyToInvalidate ? this.invalidateApiKey({ apiKey: apiKeyToInvalidate }) : null, ]); @@ -510,7 +511,9 @@ export class AlertsClient { ); await Promise.all([ - attributes.scheduledTaskId ? this.taskManager.remove(attributes.scheduledTaskId) : null, + attributes.scheduledTaskId + ? deleteTaskIfItExists(this.taskManager, attributes.scheduledTaskId) + : null, apiKeyToInvalidate ? this.invalidateApiKey({ apiKey: apiKeyToInvalidate }) : null, ]); } diff --git a/x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.test.ts b/x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.test.ts new file mode 100644 index 0000000000000..84a1743387c9c --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import uuid from 'uuid'; +import { taskManagerMock } from '../../../task_manager/server/mocks'; +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; +import { deleteTaskIfItExists } from './delete_task_if_it_exists'; + +describe('deleteTaskIfItExists', () => { + test('removes the task by its ID', async () => { + const tm = taskManagerMock.createStart(); + const id = uuid.v4(); + + expect(await deleteTaskIfItExists(tm, id)).toBe(undefined); + + expect(tm.remove).toHaveBeenCalledWith(id); + }); + + test('handles 404 errors caused by the task not existing', async () => { + const tm = taskManagerMock.createStart(); + const id = uuid.v4(); + + tm.remove.mockRejectedValue(SavedObjectsErrorHelpers.createGenericNotFoundError('task', id)); + + expect(await deleteTaskIfItExists(tm, id)).toBe(undefined); + + expect(tm.remove).toHaveBeenCalledWith(id); + }); + + test('throws if any other errro is caused by task removal', async () => { + const tm = taskManagerMock.createStart(); + const id = uuid.v4(); + + const error = SavedObjectsErrorHelpers.createInvalidVersionError(uuid.v4()); + tm.remove.mockRejectedValue(error); + + expect(deleteTaskIfItExists(tm, id)).rejects.toBe(error); + + expect(tm.remove).toHaveBeenCalledWith(id); + }); +}); diff --git a/x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.ts b/x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.ts new file mode 100644 index 0000000000000..53bb1b5cb5d53 --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/delete_task_if_it_exists.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { TaskManagerStartContract } from '../../../task_manager/server'; +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; + +export async function deleteTaskIfItExists(taskManager: TaskManagerStartContract, taskId: string) { + try { + await taskManager.remove(taskId); + } catch (err) { + if (!SavedObjectsErrorHelpers.isNotFoundError(err)) { + throw err; + } + } +} diff --git a/x-pack/plugins/alerting/server/lib/is_alert_not_found_error.test.ts b/x-pack/plugins/alerting/server/lib/is_alert_not_found_error.test.ts new file mode 100644 index 0000000000000..46ceee3ce420b --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/is_alert_not_found_error.test.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { isAlertSavedObjectNotFoundError } from './is_alert_not_found_error'; +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; +import uuid from 'uuid'; + +describe('isAlertSavedObjectNotFoundError', () => { + test('identifies SavedObjects Not Found errors', () => { + const id = uuid.v4(); + // ensure the error created by SO parses as a string with the format we expect + expect( + `${SavedObjectsErrorHelpers.createGenericNotFoundError('alert', id)}`.includes(`alert/${id}`) + ).toBe(true); + + const errorBySavedObjectsHelper = SavedObjectsErrorHelpers.createGenericNotFoundError( + 'alert', + id + ); + + expect(isAlertSavedObjectNotFoundError(errorBySavedObjectsHelper, id)).toBe(true); + }); + + test('identifies generic errors', () => { + const id = uuid.v4(); + expect(isAlertSavedObjectNotFoundError(new Error(`not found`), id)).toBe(false); + }); +}); diff --git a/x-pack/plugins/alerting/server/lib/is_alert_not_found_error.ts b/x-pack/plugins/alerting/server/lib/is_alert_not_found_error.ts new file mode 100644 index 0000000000000..0aa83ad0e883c --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/is_alert_not_found_error.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; + +export function isAlertSavedObjectNotFoundError(err: Error, alertId: string) { + return SavedObjectsErrorHelpers.isNotFoundError(err) && `${err}`.includes(alertId); +} diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 4e6d959f0ce60..31cc893f785cb 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -16,6 +16,7 @@ import { PluginStartContract as ActionsPluginStart } from '../../../actions/serv import { actionsMock } from '../../../actions/server/mocks'; import { eventLoggerMock } from '../../../event_log/server/event_logger.mock'; import { IEventLogger } from '../../../event_log/server'; +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; const alertType = { id: 'test', @@ -665,4 +666,36 @@ describe('Task Runner', () => { } `); }); + + test('avoids rescheduling a failed Alert Task Runner when it throws due to failing to fetch the alert', async () => { + savedObjectsClient.get.mockImplementation(() => { + throw SavedObjectsErrorHelpers.createGenericNotFoundError('task', '1'); + }); + + const taskRunner = new TaskRunner( + alertType, + mockedTaskInstance, + taskRunnerFactoryInitializerParams + ); + + encryptedSavedObjectsPlugin.getDecryptedAsInternalUser.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [], + }); + + const runnerResult = await taskRunner.run(); + + expect(runnerResult).toMatchInlineSnapshot(` + Object { + "runAt": undefined, + "state": Object { + "previousStartedAt": 1970-01-01T00:00:00.000Z, + }, + } + `); + }); }); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index 190cdc184930c..1d4b12e96bc76 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -26,12 +26,13 @@ import { taskInstanceToAlertTaskInstance } from './alert_task_instance'; import { AlertInstances } from '../alert_instance/alert_instance'; import { EVENT_LOG_ACTIONS } from '../plugin'; import { IEvent, IEventLogger } from '../../../event_log/server'; +import { isAlertSavedObjectNotFoundError } from '../lib/is_alert_not_found_error'; const FALLBACK_RETRY_INTERVAL: IntervalSchedule = { interval: '5m' }; interface AlertTaskRunResult { state: AlertTaskState; - runAt: Date; + runAt: Date | undefined; } interface AlertTaskInstance extends ConcreteTaskInstance { @@ -328,22 +329,29 @@ export class TaskRunner { }; }, (err: Error) => { - this.logger.error(`Executing Alert "${alertId}" has resulted in Error: ${err.message}`); + const message = `Executing Alert "${alertId}" has resulted in Error: ${err.message}`; + if (isAlertSavedObjectNotFoundError(err, alertId)) { + this.logger.debug(message); + } else { + this.logger.error(message); + } return { ...originalState, previousStartedAt, }; } ), - runAt: resolveErr(runAt, () => - getNextRunAt( - new Date(), - // if we fail at this point we wish to recover but don't have access to the Alert's - // attributes, so we'll use a default interval to prevent the underlying task from - // falling into a failed state - FALLBACK_RETRY_INTERVAL - ) - ), + runAt: resolveErr(runAt, err => { + return isAlertSavedObjectNotFoundError(err, alertId) + ? undefined + : getNextRunAt( + new Date(), + // if we fail at this point we wish to recover but don't have access to the Alert's + // attributes, so we'll use a default interval to prevent the underlying task from + // falling into a failed state + FALLBACK_RETRY_INTERVAL + ); + }), }; } } diff --git a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts index dff5e24db3c6e..6a47983a6f4d9 100644 --- a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.test.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import moment from 'moment'; import { getMockCallWithInternal, getMockConfig, @@ -13,6 +12,7 @@ import { } from '../../../test_utils'; import { visualizationsTaskRunner } from './task_runner'; import { TaskInstance } from '../../../../../task_manager/server'; +import { getNextMidnight } from '../../get_next_midnight'; describe('visualizationsTaskRunner', () => { let mockTaskInstance: TaskInstance; @@ -41,12 +41,6 @@ describe('visualizationsTaskRunner', () => { }); test('Summarizes visualization response data', async () => { - const getNextMidnight = () => - moment() - .add(1, 'days') - .startOf('day') - .toDate(); - const runner = visualizationsTaskRunner(mockTaskInstance, getMockConfig(), getMockEs()); const result = await runner(); diff --git a/x-pack/plugins/task_manager/server/lib/is_task_not_found_error.test.ts b/x-pack/plugins/task_manager/server/lib/is_task_not_found_error.test.ts new file mode 100644 index 0000000000000..65922ea8e6de7 --- /dev/null +++ b/x-pack/plugins/task_manager/server/lib/is_task_not_found_error.test.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { isTaskSavedObjectNotFoundError } from './is_task_not_found_error'; +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; +import uuid from 'uuid'; + +describe('isTaskSavedObjectNotFoundError', () => { + test('identifies SavedObjects Not Found errors', () => { + const id = uuid.v4(); + // ensure the error created by SO parses as a string with the format we expect + expect( + `${SavedObjectsErrorHelpers.createGenericNotFoundError('task', id)}`.includes(`task/${id}`) + ).toBe(true); + + const errorBySavedObjectsHelper = SavedObjectsErrorHelpers.createGenericNotFoundError( + 'task', + id + ); + + expect(isTaskSavedObjectNotFoundError(errorBySavedObjectsHelper, id)).toBe(true); + }); + + test('identifies generic errors', () => { + const id = uuid.v4(); + expect(isTaskSavedObjectNotFoundError(new Error(`not found`), id)).toBe(false); + }); +}); diff --git a/x-pack/plugins/task_manager/server/lib/is_task_not_found_error.ts b/x-pack/plugins/task_manager/server/lib/is_task_not_found_error.ts new file mode 100644 index 0000000000000..8cc1c08f2a967 --- /dev/null +++ b/x-pack/plugins/task_manager/server/lib/is_task_not_found_error.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; + +export function isTaskSavedObjectNotFoundError(err: Error, taskId: string) { + return SavedObjectsErrorHelpers.isNotFoundError(err) && `${err}`.includes(taskId); +} diff --git a/x-pack/plugins/task_manager/server/task_pool.test.ts b/x-pack/plugins/task_manager/server/task_pool.test.ts index a827c1436c9bd..fb87b6290a3da 100644 --- a/x-pack/plugins/task_manager/server/task_pool.test.ts +++ b/x-pack/plugins/task_manager/server/task_pool.test.ts @@ -8,6 +8,7 @@ import sinon from 'sinon'; import { TaskPool, TaskPoolRunResult } from './task_pool'; import { mockLogger, resolvable, sleep } from './test_utils'; import { asOk } from './lib/result_type'; +import { SavedObjectsErrorHelpers } from '../../../../src/core/server'; describe('TaskPool', () => { test('occupiedWorkers are a sum of running tasks', async () => { @@ -101,6 +102,30 @@ describe('TaskPool', () => { expect(result).toEqual(TaskPoolRunResult.RunningAllClaimedTasks); }); + test('should not log when running a Task fails due to the Task SO having been deleted while in flight', async () => { + const logger = mockLogger(); + const pool = new TaskPool({ + maxWorkers: 3, + logger, + }); + + const taskFailedToRun = mockTask(); + taskFailedToRun.run.mockImplementation(async () => { + throw SavedObjectsErrorHelpers.createGenericNotFoundError('task', taskFailedToRun.id); + }); + + const result = await pool.run([mockTask(), taskFailedToRun, mockTask()]); + + expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "Task TaskType \\"shooooo\\" failed in attempt to run: Saved object [task/foo] not found", + ] + `); + expect(logger.warn).not.toHaveBeenCalled(); + + expect(result).toEqual(TaskPoolRunResult.RunningAllClaimedTasks); + }); + test('Running a task which fails still takes up capacity', async () => { const logger = mockLogger(); const pool = new TaskPool({ diff --git a/x-pack/plugins/task_manager/server/task_pool.ts b/x-pack/plugins/task_manager/server/task_pool.ts index 90f1880a159da..8999fb48680ce 100644 --- a/x-pack/plugins/task_manager/server/task_pool.ts +++ b/x-pack/plugins/task_manager/server/task_pool.ts @@ -11,6 +11,7 @@ import { performance } from 'perf_hooks'; import { Logger } from './types'; import { TaskRunner } from './task_runner'; +import { isTaskSavedObjectNotFoundError } from './lib/is_task_not_found_error'; interface Opts { maxWorkers: number; @@ -125,7 +126,17 @@ export class TaskPool { taskRunner .run() .catch(err => { - this.logger.warn(`Task ${taskRunner.toString()} failed in attempt to run: ${err.message}`); + // If a task Saved Object can't be found by an in flight task runner + // we asssume the underlying task has been deleted while it was running + // so we will log this as a debug, rather than a warn + const errorLogLine = `Task ${taskRunner.toString()} failed in attempt to run: ${ + err.message + }`; + if (isTaskSavedObjectNotFoundError(err, taskRunner.id)) { + this.logger.debug(errorLogLine); + } else { + this.logger.warn(errorLogLine); + } }) .then(() => this.running.delete(taskRunner)); } From c885ea53792456383fb145414b891c134f97593e Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Wed, 15 Apr 2020 06:43:03 -0500 Subject: [PATCH 13/80] Because onThreshold is changed even when it hasn't changed add a check (#63555) * Because onThreshold is changed even when it hasn't changed add a check * Fix join --- .../infra/public/components/alerting/metrics/expression.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx b/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx index 6cf4e5bed2e6f..7de52840777f9 100644 --- a/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx +++ b/x-pack/plugins/infra/public/components/alerting/metrics/expression.tsx @@ -399,7 +399,9 @@ export const ExpressionRow: React.FC = props => { const updateThreshold = useCallback( t => { - setAlertParams(expressionId, { ...expression, threshold: t }); + if (t.join() !== expression.threshold.join()) { + setAlertParams(expressionId, { ...expression, threshold: t }); + } }, [expressionId, expression, setAlertParams] ); From 5deb74e6c4ebf0c482c874c7c59902b6445a48b7 Mon Sep 17 00:00:00 2001 From: patrykkopycinski Date: Wed, 15 Apr 2020 14:34:29 +0200 Subject: [PATCH 14/80] [SIEM][Detection Engine] Increase UI unit tests coverage (#62230) --- .../siem/public/mock/test_providers.tsx | 27 ++++++ .../activity_monitor/index.test.tsx | 18 ++++ .../index.test.tsx | 18 ++++ .../no_api_integration_callout/index.test.tsx | 18 ++++ .../no_write_signals_callout/index.test.tsx | 18 ++++ .../components/signals/index.test.tsx | 43 +++++++++ .../components/signals/index.tsx | 2 +- .../signals_filter_group/index.test.tsx | 18 ++++ .../signals_utility_bar/batch_actions.tsx | 92 ------------------- .../signals_utility_bar/index.test.tsx | 33 +++++++ .../signals_histogram_panel/index.test.tsx | 29 ++++++ .../signals_histogram.test.tsx | 22 +++++ .../components/user_info/index.test.tsx | 50 ++++++++++ .../detection_engine.test.tsx | 43 +++++++++ .../detection_engine/detection_engine.tsx | 2 +- .../detection_engine_empty_page.test.tsx | 19 ++++ .../detection_engine_no_signal_index.test.tsx | 19 ++++ ...ction_engine_user_unauthenticated.test.tsx | 19 ++++ .../public/pages/detection_engine/helpers.ts | 18 ---- .../pages/detection_engine/index.test.tsx | 19 ++++ .../detection_engine/rules/all/index.test.tsx | 40 ++++++++ .../rules_table_filters.test.tsx | 20 ++++ .../tags_filter_popover.test.tsx | 25 +++++ .../components/accordion_title/index.test.tsx | 18 ++++ .../components/add_item_form/index.test.tsx | 32 +++++++ .../all_rules_tables/index.test.tsx | 46 ++++++++++ .../anomaly_threshold_slider/index.test.tsx | 24 +++++ .../anomaly_threshold_slider/index.tsx | 4 +- .../ml_job_description.test.tsx | 54 +++++++++++ .../description_step/ml_job_description.tsx | 12 ++- .../rules/components/mitre/helpers.test.tsx | 13 +++ .../rules/components/mitre/index.test.tsx | 31 +++++++ .../components/ml_job_select/index.test.tsx | 31 +++++++ .../optional_field_label/index.test.tsx | 17 ++++ .../components/pick_timeline/index.test.tsx | 31 +++++++ .../load_empty_prompt.test.tsx | 24 +++++ .../pre_packaged_rules/load_empty_prompt.tsx | 2 + .../update_callout.test.tsx | 36 ++++++++ .../rules/components/query_bar/index.test.tsx | 37 ++++++++ .../read_only_callout/index.test.tsx | 18 ++++ .../rule_actions_field/index.test.tsx | 33 +++++++ .../components/rule_status/helpers.test.tsx | 13 +++ .../components/rule_status/index.test.tsx | 18 ++++ .../schedule_item_form/index.test.tsx | 31 +++++++ .../select_rule_type/index.test.tsx | 25 +++++ .../components/severity_badge/index.test.tsx | 18 ++++ .../components/status_icon/index.test.tsx | 22 +++++ .../step_content_wrapper/index.test.tsx | 18 ++++ .../components/step_content_wrapper/index.tsx | 2 + .../step_define_rule/index.test.tsx | 20 ++++ .../components/step_panel/index.test.tsx | 22 +++++ .../rules/components/step_panel/index.tsx | 2 + .../step_rule_actions/index.test.tsx | 22 +++++ .../components/step_rule_actions/schema.tsx | 2 + .../step_schedule_rule/index.test.tsx | 27 ++++++ .../components/step_schedule_rule/schema.tsx | 2 + .../throttle_select_field/index.test.tsx | 24 +++++ .../rules/create/index.test.tsx | 23 +++++ .../rules/details/failure_history.test.tsx | 27 ++++++ .../rules/details/index.test.tsx | 47 ++++++++++ .../detection_engine/rules/details/index.tsx | 2 +- .../details/status_failed_callout.test.tsx | 18 ++++ .../rules/edit/index.test.tsx | 33 +++++++ .../detection_engine/rules/helpers.test.tsx | 18 +++- .../detection_engine/rules/index.test.tsx | 27 ++++++ .../detection_engine/rules/utils.test.ts | 24 +++++ 66 files changed, 1442 insertions(+), 120 deletions(-) create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.test.tsx delete mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/batch_actions.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/components/user_info/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_no_signal_index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx delete mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/helpers.ts create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/failure_history.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.test.tsx create mode 100644 x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/utils.test.ts diff --git a/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx b/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx index c7692755c1330..952f7f51b63f2 100644 --- a/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx +++ b/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx @@ -20,6 +20,7 @@ import { ThemeProvider } from 'styled-components'; import { createStore, State } from '../store'; import { mockGlobalState } from './global_state'; import { createKibanaContextProviderMock } from './kibana_react'; +import { FieldHook, useForm } from '../shared_imports'; jest.mock('ui/new_platform'); @@ -91,3 +92,29 @@ const TestProviderWithoutDragAndDropComponent: React.FC = ({ ); export const TestProviderWithoutDragAndDrop = React.memo(TestProviderWithoutDragAndDropComponent); + +export const useFormFieldMock = (options?: Partial): FieldHook => { + const { form } = useForm(); + + return { + path: 'path', + type: 'type', + value: [], + isPristine: false, + isValidating: false, + isValidated: false, + isChangingValue: false, + form, + errors: [], + isValid: true, + getErrorsMessages: jest.fn(), + onChange: jest.fn(), + setValue: jest.fn(), + setErrors: jest.fn(), + clearErrors: jest.fn(), + validate: jest.fn(), + reset: jest.fn(), + __serializeOutput: jest.fn(), + ...options, + }; +}; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.test.tsx new file mode 100644 index 0000000000000..c5a4057b64ea7 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { ActivityMonitor } from './index'; + +describe('activity_monitor', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('[title="Activity monitor"]')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.test.tsx new file mode 100644 index 0000000000000..a2685017f86d6 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { DetectionEngineHeaderPage } from './index'; + +describe('detection_engine_header_page', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('[title="Title"]')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.test.tsx new file mode 100644 index 0000000000000..0e2589150e858 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { NoApiIntegrationKeyCallOut } from './index'; + +describe('no_api_integration_callout', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiCallOut')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.test.tsx new file mode 100644 index 0000000000000..2e6890e60fc61 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { NoWriteSignalsCallOut } from './index'; + +describe('no_write_signals_callout', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiCallOut')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.test.tsx new file mode 100644 index 0000000000000..b66a9fc881045 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { SignalsTableComponent } from './index'; + +describe('SignalsTableComponent', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[title="Signals"]')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx index 6cdb2f326901e..ce8ae2054b2c7 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/index.tsx @@ -61,7 +61,7 @@ interface OwnProps { type SignalsTableComponentProps = OwnProps & PropsFromRedux; -const SignalsTableComponent: React.FC = ({ +export const SignalsTableComponent: React.FC = ({ canUserCRUD, clearEventsDeleted, clearEventsLoading, diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.test.tsx new file mode 100644 index 0000000000000..dd30bb1b0a74d --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { SignalsTableFilterGroup } from './index'; + +describe('SignalsTableFilterGroup', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiFilterButton')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/batch_actions.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/batch_actions.tsx deleted file mode 100644 index bb45ff68cb01d..0000000000000 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/batch_actions.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { EuiContextMenuItem } from '@elastic/eui'; -import React from 'react'; -import * as i18n from './translations'; -import { TimelineNonEcsData } from '../../../../../graphql/types'; -import { SendSignalsToTimeline, UpdateSignalsStatus } from '../types'; -import { FILTER_CLOSED, FILTER_OPEN } from '../signals_filter_group'; - -interface GetBatchItems { - areEventsLoading: boolean; - allEventsSelected: boolean; - selectedEventIds: Readonly>; - updateSignalsStatus: UpdateSignalsStatus; - sendSignalsToTimeline: SendSignalsToTimeline; - closePopover: () => void; - isFilteredToOpen: boolean; -} -/** - * Returns ViewInTimeline / UpdateSignalStatus actions to be display within an EuiContextMenuPanel - * - * @param areEventsLoading are any events loading - * @param allEventsSelected are all events on all pages selected - * @param selectedEventIds - * @param updateSignalsStatus function for updating signal status - * @param sendSignalsToTimeline function for sending signals to timeline - * @param closePopover - * @param isFilteredToOpen currently selected filter options - */ -export const getBatchItems = ({ - areEventsLoading, - allEventsSelected, - selectedEventIds, - updateSignalsStatus, - sendSignalsToTimeline, - closePopover, - isFilteredToOpen, -}: GetBatchItems) => { - const allDisabled = areEventsLoading || Object.keys(selectedEventIds).length === 0; - const sendToTimelineDisabled = allEventsSelected || uniqueRuleCount(selectedEventIds) > 1; - const filterString = isFilteredToOpen - ? i18n.BATCH_ACTION_CLOSE_SELECTED - : i18n.BATCH_ACTION_OPEN_SELECTED; - - return [ - { - closePopover(); - sendSignalsToTimeline(); - }} - > - {i18n.BATCH_ACTION_VIEW_SELECTED_IN_TIMELINE} - , - - { - closePopover(); - await updateSignalsStatus({ - signalIds: Object.keys(selectedEventIds), - status: isFilteredToOpen ? FILTER_CLOSED : FILTER_OPEN, - }); - }} - > - {filterString} - , - ]; -}; - -/** - * Returns the number of unique rules for a given list of signals - * - * @param signals - */ -export const uniqueRuleCount = ( - signals: Readonly> -): number => { - const ruleIds = Object.values(signals).flatMap( - data => data.find(d => d.field === 'signal.rule.id')?.value - ); - - return Array.from(new Set(ruleIds)).length; -}; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.test.tsx new file mode 100644 index 0000000000000..6cab43b5285b5 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.test.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { SignalsUtilityBar } from './index'; + +jest.mock('../../../../../lib/kibana'); + +describe('SignalsUtilityBar', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[dataTestSubj="openCloseSignal"]')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.test.tsx new file mode 100644 index 0000000000000..6921c49d8a8b4 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.test.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { SignalsHistogramPanel } from './index'; + +jest.mock('../../../../lib/kibana'); +jest.mock('../../../../components/navigation/use_get_url_search'); + +describe('SignalsHistogramPanel', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[id="detections-histogram"]')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.test.tsx new file mode 100644 index 0000000000000..5eb9beaaaf76a --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.test.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { SignalsHistogram } from './signals_histogram'; + +jest.mock('../../../../lib/kibana'); + +describe('SignalsHistogram', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('Chart')).toBeTruthy(); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/user_info/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/user_info/index.test.tsx new file mode 100644 index 0000000000000..b3d710de5e94e --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/components/user_info/index.test.tsx @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { renderHook } from '@testing-library/react-hooks'; +import { useUserInfo } from './index'; + +import { usePrivilegeUser } from '../../../../containers/detection_engine/signals/use_privilege_user'; +import { useSignalIndex } from '../../../../containers/detection_engine/signals/use_signal_index'; +import { useKibana } from '../../../../lib/kibana'; +jest.mock('../../../../containers/detection_engine/signals/use_privilege_user'); +jest.mock('../../../../containers/detection_engine/signals/use_signal_index'); +jest.mock('../../../../lib/kibana'); + +describe('useUserInfo', () => { + beforeAll(() => { + (usePrivilegeUser as jest.Mock).mockReturnValue({}); + (useSignalIndex as jest.Mock).mockReturnValue({}); + (useKibana as jest.Mock).mockReturnValue({ + services: { + application: { + capabilities: { + siem: { + crud: true, + }, + }, + }, + }, + }); + }); + it('returns default state', () => { + const { result } = renderHook(() => useUserInfo()); + + expect(result).toEqual({ + current: { + canUserCRUD: null, + hasEncryptionKey: null, + hasIndexManage: null, + hasIndexWrite: null, + isAuthenticated: null, + isSignalIndexExists: null, + loading: true, + signalIndexName: null, + }, + error: undefined, + }); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.test.tsx new file mode 100644 index 0000000000000..779e9a4557f2a --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; +import { useParams } from 'react-router-dom'; + +import '../../mock/match_media'; +import { setAbsoluteRangeDatePicker } from '../../store/inputs/actions'; +import { DetectionEnginePageComponent } from './detection_engine'; +import { useUserInfo } from './components/user_info'; + +jest.mock('./components/user_info'); +jest.mock('../../lib/kibana'); +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + + return { + ...originalModule, + useParams: jest.fn(), + }; +}); + +describe('DetectionEnginePageComponent', () => { + beforeAll(() => { + (useParams as jest.Mock).mockReturnValue({}); + (useUserInfo as jest.Mock).mockReturnValue({}); + }); + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('WithSource')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx index 1bd7ab2c4f1ae..a26d7f5672106 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine.tsx @@ -59,7 +59,7 @@ const detectionsTabs: Record = { }, }; -const DetectionEnginePageComponent: React.FC = ({ +export const DetectionEnginePageComponent: React.FC = ({ filters, query, setAbsoluteRangeDatePicker, diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.test.tsx new file mode 100644 index 0000000000000..f64526fd2f7c4 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.test.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { DetectionEngineEmptyPage } from './detection_engine_empty_page'; +jest.mock('../../lib/kibana'); + +describe('DetectionEngineEmptyPage', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EmptyPage')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_no_signal_index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_no_signal_index.test.tsx new file mode 100644 index 0000000000000..e9f05f7aafe3c --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_no_signal_index.test.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { DetectionEngineNoIndex } from './detection_engine_no_signal_index'; +jest.mock('../../lib/kibana'); + +describe('DetectionEngineNoIndex', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EmptyPage')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx new file mode 100644 index 0000000000000..e71f4de2b010b --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { DetectionEngineUserUnauthenticated } from './detection_engine_user_unauthenticated'; +jest.mock('../../lib/kibana'); + +describe('DetectionEngineUserUnauthenticated', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EmptyPage')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/helpers.ts b/x-pack/legacy/plugins/siem/public/pages/detection_engine/helpers.ts deleted file mode 100644 index 1399df0fcf6d1..0000000000000 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/helpers.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export const sampleChartOptions = [ - { text: 'Risk scores', value: 'risk_scores' }, - { text: 'Severities', value: 'severities' }, - { text: 'Top destination IPs', value: 'destination_ips' }, - { text: 'Top event actions', value: 'event_actions' }, - { text: 'Top event categories', value: 'event_categories' }, - { text: 'Top host names', value: 'host_names' }, - { text: 'Top rule types', value: 'rule_types' }, - { text: 'Top rules', value: 'rules' }, - { text: 'Top source IPs', value: 'source_ips' }, - { text: 'Top users', value: 'users' }, -]; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/index.test.tsx new file mode 100644 index 0000000000000..6c4980f1d1500 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/index.test.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import '../../mock/match_media'; +import { DetectionEngineContainer } from './index'; + +describe('DetectionEngineContainer', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('ManageUserInfo')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.test.tsx new file mode 100644 index 0000000000000..f4955c2a93b8d --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/index.test.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AllRules } from './index'; + +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + + return { + ...originalModule, + useHistory: jest.fn(), + }; +}); + +describe('AllRules', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[title="All rules"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx new file mode 100644 index 0000000000000..92f69d79110d2 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { RulesTableFilters } from './rules_table_filters'; + +describe('RulesTableFilters', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="show-elastic-rules-filter-button"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx new file mode 100644 index 0000000000000..e31b8394e07d6 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { TagsFilterPopover } from './tags_filter_popover'; + +describe('TagsFilterPopover', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('EuiPopover')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.test.tsx new file mode 100644 index 0000000000000..9202da3336565 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AccordionTitle } from './index'; + +describe('AccordionTitle', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('h6').text()).toContain('title'); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.test.tsx new file mode 100644 index 0000000000000..eafa89a33f596 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.test.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AddItem } from './index'; +import { useFormFieldMock } from '../../../../../../public/mock/test_providers'; + +describe('AddItem', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ( + + ); + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[iconType="plusInCircle"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.test.tsx new file mode 100644 index 0000000000000..3dab83bca2946 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.test.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useRef } from 'react'; +import { shallow } from 'enzyme'; + +import { AllRulesTables } from './index'; + +describe('AllRulesTables', () => { + it('renders correctly', () => { + const Component = () => { + const ref = useRef(); + + return ( + + ); + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="rules-table"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.test.tsx new file mode 100644 index 0000000000000..c0e957d94261f --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.test.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AnomalyThresholdSlider } from './index'; +import { useFormFieldMock } from '../../../../../mock'; + +describe('AnomalyThresholdSlider', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ; + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('EuiRange')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.tsx index 19d1c698cbd9b..01fddf98b97d8 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.tsx @@ -16,10 +16,10 @@ interface AnomalyThresholdSliderProps { type Event = React.ChangeEvent; type EventArg = Event | React.MouseEvent; -export const AnomalyThresholdSlider: React.FC = ({ +export const AnomalyThresholdSlider = ({ describedByIds = [], field, -}) => { +}: AnomalyThresholdSliderProps) => { const threshold = field.value as number; const onThresholdChange = useCallback( (event: EventArg) => { diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.test.tsx new file mode 100644 index 0000000000000..59231c31d15bb --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.test.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { MlJobDescription, AuditIcon, JobStatusBadge } from './ml_job_description'; +jest.mock('../../../../../lib/kibana'); + +const job = { + moduleId: 'moduleId', + defaultIndexPattern: 'defaultIndexPattern', + isCompatible: true, + isInstalled: true, + isElasticJob: true, + datafeedId: 'datafeedId', + datafeedIndices: [], + datafeedState: 'datafeedState', + description: 'description', + groups: [], + hasDatafeed: true, + id: 'id', + isSingleMetricViewerJob: false, + jobState: 'jobState', + memory_status: 'memory_status', + processed_record_count: 0, +}; + +describe('MlJobDescription', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('[data-test-subj="machineLearningJobId"]')).toHaveLength(1); + }); +}); + +describe('AuditIcon', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiToolTip')).toHaveLength(0); + }); +}); + +describe('JobStatusBadge', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiBadge')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx index 5a9593f1a6de2..1664ea320bc1e 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx @@ -20,7 +20,7 @@ enum MessageLevels { error = 'error', } -const AuditIcon: React.FC<{ +const AuditIconComponent: React.FC<{ message: SiemJob['auditMessage']; }> = ({ message }) => { if (!message) { @@ -45,7 +45,9 @@ const AuditIcon: React.FC<{ ); }; -export const JobStatusBadge: React.FC<{ job: SiemJob }> = ({ job }) => { +export const AuditIcon = React.memo(AuditIconComponent); + +const JobStatusBadgeComponent: React.FC<{ job: SiemJob }> = ({ job }) => { const isStarted = isJobStarted(job.jobState, job.datafeedState); const color = isStarted ? 'secondary' : 'danger'; const text = isStarted ? ML_JOB_STARTED : ML_JOB_STOPPED; @@ -57,6 +59,8 @@ export const JobStatusBadge: React.FC<{ job: SiemJob }> = ({ job }) => { ); }; +export const JobStatusBadge = React.memo(JobStatusBadgeComponent); + const JobLink = styled(EuiLink)` margin-right: ${({ theme }) => theme.eui.euiSizeS}; `; @@ -65,7 +69,7 @@ const Wrapper = styled.div` overflow: hidden; `; -export const MlJobDescription: React.FC<{ job: SiemJob }> = ({ job }) => { +const MlJobDescriptionComponent: React.FC<{ job: SiemJob }> = ({ job }) => { const jobUrl = useKibana().services.application.getUrlForApp( `ml#/jobs?mlManagement=(jobId:${encodeURI(job.id)})` ); @@ -83,6 +87,8 @@ export const MlJobDescription: React.FC<{ job: SiemJob }> = ({ job }) => { ); }; +export const MlJobDescription = React.memo(MlJobDescriptionComponent); + export const buildMlJobDescription = ( jobId: string, label: string, diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.test.tsx new file mode 100644 index 0000000000000..dc201eb21c911 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.test.tsx @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { isMitreAttackInvalid } from './helpers'; + +describe('isMitreAttackInvalid', () => { + it('returns true if tacticName is empty', () => { + expect(isMitreAttackInvalid('', undefined)).toBe(true); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.test.tsx new file mode 100644 index 0000000000000..3e8d542682456 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.test.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { AddMitreThreat } from './index'; +import { useFormFieldMock } from '../../../../../mock'; + +describe('AddMitreThreat', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ( + + ); + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="addMitre"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.test.tsx new file mode 100644 index 0000000000000..dea27d8d04536 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.test.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { MlJobSelect } from './index'; +import { useSiemJobs } from '../../../../../components/ml_popover/hooks/use_siem_jobs'; +import { useFormFieldMock } from '../../../../../mock'; +jest.mock('../../../../../components/ml_popover/hooks/use_siem_jobs'); +jest.mock('../../../../../lib/kibana'); + +describe('MlJobSelect', () => { + beforeAll(() => { + (useSiemJobs as jest.Mock).mockReturnValue([false, []]); + }); + + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ; + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="mlJobSelect"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.test.tsx new file mode 100644 index 0000000000000..789f12f290a34 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.test.tsx @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { shallow } from 'enzyme'; + +import { OptionalFieldLabel } from './index'; + +describe('OptionalFieldLabel', () => { + it('renders correctly', () => { + const wrapper = shallow(OptionalFieldLabel); + + expect(wrapper.find('EuiTextColor')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.test.tsx new file mode 100644 index 0000000000000..fefc9697176c4 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.test.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { PickTimeline } from './index'; +import { useFormFieldMock } from '../../../../../mock'; + +describe('PickTimeline', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ( + + ); + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="pick-timeline"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.test.tsx new file mode 100644 index 0000000000000..8ace42fc5c3f9 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.test.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { PrePackagedRulesPrompt } from './load_empty_prompt'; + +describe('PrePackagedRulesPrompt', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('EmptyPrompt')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.tsx index 1cff4751e8188..5d136265ef1f2 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.tsx @@ -15,6 +15,8 @@ const EmptyPrompt = styled(EuiEmptyPrompt)` align-self: center; /* Corrects horizontal centering in IE11 */ `; +EmptyPrompt.displayName = 'EmptyPrompt'; + interface PrePackagedRulesPromptProps { createPrePackagedRules: () => void; loading: boolean; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.test.tsx new file mode 100644 index 0000000000000..807da79fb7a1a --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.test.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { UpdatePrePackagedRulesCallOut } from './update_callout'; +import { useKibana } from '../../../../../lib/kibana'; +jest.mock('../../../../../lib/kibana'); + +describe('UpdatePrePackagedRulesCallOut', () => { + beforeAll(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + docLinks: { + ELASTIC_WEBSITE_URL: '', + DOC_LINK_VERSION: '', + }, + }, + }); + }); + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('EuiCallOut')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.test.tsx new file mode 100644 index 0000000000000..cdd06ad58bb4b --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.test.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { QueryBarDefineRule } from './index'; +import { useFormFieldMock } from '../../../../../mock'; + +jest.mock('../../../../../lib/kibana'); + +describe('QueryBarDefineRule', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ( + + ); + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="query-bar-define-rule"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.test.tsx new file mode 100644 index 0000000000000..e761cb3323b2c --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { ReadOnlyCallOut } from './index'; + +describe('ReadOnlyCallOut', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiCallOut')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.test.tsx new file mode 100644 index 0000000000000..4cfad36b2933f --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.test.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { RuleActionsField } from './index'; +import { useKibana } from '../../../../../lib/kibana'; +import { useFormFieldMock } from '../../../../../mock'; +jest.mock('../../../../../lib/kibana'); + +describe('RuleActionsField', () => { + it('should not render ActionForm is no actions are supported', () => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + triggers_actions_ui: { + actionTypeRegistry: {}, + }, + }, + }); + const Component = () => { + const field = useFormFieldMock(); + + return ; + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('ActionForm')).toHaveLength(0); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.test.tsx new file mode 100644 index 0000000000000..aba30e4b7f3ca --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.test.tsx @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getStatusColor } from './helpers'; + +describe('rule_status helpers', () => { + it('getStatusColor returns subdued if null was provided', () => { + expect(getStatusColor(null)).toBe('subdued'); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.test.tsx new file mode 100644 index 0000000000000..6e230de11c4f3 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { RuleStatus } from './index'; + +describe('RuleStatus', () => { + it('renders loader correctly', () => { + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="rule-status-loader"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.test.tsx new file mode 100644 index 0000000000000..3829af02ca4f1 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.test.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { ScheduleItem } from './index'; +import { useFormFieldMock } from '../../../../../mock'; + +describe('ScheduleItem', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ( + + ); + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="schedule-item"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.test.tsx new file mode 100644 index 0000000000000..3d832d61abb28 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.test.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { SelectRuleType } from './index'; +import { useFormFieldMock } from '../../../../../mock'; +jest.mock('../../../../../lib/kibana'); + +describe('SelectRuleType', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ; + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('[data-test-subj="selectRuleType"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.test.tsx new file mode 100644 index 0000000000000..a9dddfedc2bab --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { SeverityBadge } from './index'; + +describe('SeverityBadge', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiHealth')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.test.tsx new file mode 100644 index 0000000000000..89b8a56e79054 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.test.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { TestProviders } from '../../../../../mock'; +import { RuleStatusIcon } from './index'; +jest.mock('../../../../../lib/kibana'); + +describe('RuleStatusIcon', () => { + it('renders correctly', () => { + const wrapper = shallow(, { + wrappingComponent: TestProviders, + }); + + expect(wrapper.find('EuiAvatar')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.test.tsx new file mode 100644 index 0000000000000..af0547ea03261 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { StepContentWrapper } from './index'; + +describe('StepContentWrapper', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('div')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.tsx index b04a321dab05b..a7343a87a7ef8 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.tsx @@ -16,3 +16,5 @@ StyledDiv.defaultProps = { }; export const StepContentWrapper = React.memo(StyledDiv); + +StepContentWrapper.displayName = 'StepContentWrapper'; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.test.tsx new file mode 100644 index 0000000000000..ebef6348d477e --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.test.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { StepDefineRule } from './index'; + +jest.mock('../../../../../lib/kibana'); + +describe('StepDefineRule', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('Form[data-test-subj="stepDefineRule"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.test.tsx new file mode 100644 index 0000000000000..ce01d6995a2d8 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.test.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { StepPanel } from './index'; + +describe('StepPanel', () => { + it('renders correctly', () => { + const wrapper = shallow( + +
+ + ); + + expect(wrapper.find('MyPanel')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.tsx index 88cecadb8b137..1923ed09252dd 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.tsx @@ -20,6 +20,8 @@ const MyPanel = styled(EuiPanel)` position: relative; `; +MyPanel.displayName = 'MyPanel'; + const StepPanelComponent: React.FC = ({ children, loading, title }) => ( {loading && } diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.test.tsx new file mode 100644 index 0000000000000..69d118ba9f28e --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.test.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { StepRuleActions } from './index'; + +jest.mock('../../../../../lib/kibana'); + +describe('StepRuleActions', () => { + it('renders correctly', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="stepRuleActions"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/schema.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/schema.tsx index bc3b0dfe720bc..1b27d0e0fcc0e 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/schema.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/schema.tsx @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +/* istanbul ignore file */ + import { i18n } from '@kbn/i18n'; import { FormSchema } from '../../../../../shared_imports'; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.test.tsx new file mode 100644 index 0000000000000..98de933590d60 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.test.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow, mount } from 'enzyme'; + +import { TestProviders } from '../../../../../mock'; +import { StepScheduleRule } from './index'; + +describe('StepScheduleRule', () => { + it('renders correctly', () => { + const wrapper = mount(, { + wrappingComponent: TestProviders, + }); + + expect(wrapper.find('Form[data-test-subj="stepScheduleRule"]')).toHaveLength(1); + }); + + it('renders correctly if isReadOnlyView', () => { + const wrapper = shallow(); + + expect(wrapper.find('StepContentWrapper')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/schema.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/schema.tsx index 8fbfdf5f25a51..e79aec2be6e15 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/schema.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/schema.tsx @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +/* istanbul ignore file */ + import { i18n } from '@kbn/i18n'; import { OptionalFieldLabel } from '../optional_field_label'; diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.test.tsx new file mode 100644 index 0000000000000..0ab19b671494e --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.test.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { ThrottleSelectField } from './index'; +import { useFormFieldMock } from '../../../../../mock'; + +describe('ThrottleSelectField', () => { + it('renders correctly', () => { + const Component = () => { + const field = useFormFieldMock(); + + return ; + }; + const wrapper = shallow(); + + expect(wrapper.dive().find('SelectField')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.test.tsx new file mode 100644 index 0000000000000..db32be652d0f7 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.test.tsx @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { TestProviders } from '../../../../mock'; +import { CreateRulePage } from './index'; +import { useUserInfo } from '../../components/user_info'; + +jest.mock('../../components/user_info'); + +describe('CreateRulePage', () => { + it('renders correctly', () => { + (useUserInfo as jest.Mock).mockReturnValue({}); + const wrapper = shallow(, { wrappingComponent: TestProviders }); + + expect(wrapper.find('[title="Create new rule"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/failure_history.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/failure_history.test.tsx new file mode 100644 index 0000000000000..a83ff4c54b076 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/failure_history.test.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { TestProviders } from '../../../../mock'; +import { FailureHistory } from './failure_history'; +import { useRuleStatus } from '../../../../containers/detection_engine/rules'; +jest.mock('../../../../containers/detection_engine/rules'); + +describe('FailureHistory', () => { + beforeAll(() => { + (useRuleStatus as jest.Mock).mockReturnValue([false, null]); + }); + + it('renders correctly', () => { + const wrapper = shallow(, { + wrappingComponent: TestProviders, + }); + + expect(wrapper.find('EuiBasicTable')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.test.tsx new file mode 100644 index 0000000000000..19c6f39a9bc7e --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.test.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import '../../../../mock/match_media'; +import { TestProviders } from '../../../../mock'; +import { RuleDetailsPageComponent } from './index'; +import { setAbsoluteRangeDatePicker } from '../../../../store/inputs/actions'; +import { useUserInfo } from '../../components/user_info'; +import { useParams } from 'react-router-dom'; + +jest.mock('../../components/user_info'); +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + + return { + ...originalModule, + useParams: jest.fn(), + }; +}); + +describe('RuleDetailsPageComponent', () => { + beforeAll(() => { + (useUserInfo as jest.Mock).mockReturnValue({}); + (useParams as jest.Mock).mockReturnValue({}); + }); + + it('renders correctly', () => { + const wrapper = shallow( + , + { + wrappingComponent: TestProviders, + } + ); + + expect(wrapper.find('WithSource')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx index 2b648a3b3f825..14e5f2b90882e 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx @@ -88,7 +88,7 @@ const ruleDetailTabs = [ }, ]; -const RuleDetailsPageComponent: FC = ({ +export const RuleDetailsPageComponent: FC = ({ filters, query, setAbsoluteRangeDatePicker, diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.test.tsx new file mode 100644 index 0000000000000..3394b0fc8c5c0 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.test.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { RuleStatusFailedCallOut } from './status_failed_callout'; + +describe('RuleStatusFailedCallOut', () => { + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('EuiCallOut')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.test.tsx new file mode 100644 index 0000000000000..d22bc12abf9fa --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.test.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { TestProviders } from '../../../../mock'; +import { EditRulePage } from './index'; +import { useUserInfo } from '../../components/user_info'; +import { useParams } from 'react-router-dom'; + +jest.mock('../../components/user_info'); +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + + return { + ...originalModule, + useParams: jest.fn(), + }; +}); + +describe('EditRulePage', () => { + it('renders correctly', () => { + (useUserInfo as jest.Mock).mockReturnValue({}); + (useParams as jest.Mock).mockReturnValue({}); + const wrapper = shallow(, { wrappingComponent: TestProviders }); + + expect(wrapper.find('[title="Edit rule settings"]')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx index 443dbd2c93a35..1c01a19573cd6 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx @@ -302,11 +302,25 @@ describe('rule helpers', () => { test('returns expected ActionsStepRule rule object', () => { const mockedRule = { ...mockRule('test-id'), - actions: [], + actions: [ + { + id: 'id', + group: 'group', + params: {}, + action_type_id: 'action_type_id', + }, + ], }; const result: ActionsStepRule = getActionsStepsData(mockedRule); const expected = { - actions: [], + actions: [ + { + id: 'id', + group: 'group', + params: {}, + actionTypeId: 'action_type_id', + }, + ], enabled: mockedRule.enabled, isNew: false, throttle: 'no_actions', diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.test.tsx new file mode 100644 index 0000000000000..3fa81ca3ced08 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.test.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { RulesPage } from './index'; +import { useUserInfo } from '../components/user_info'; +import { usePrePackagedRules } from '../../../containers/detection_engine/rules'; + +jest.mock('../components/user_info'); +jest.mock('../../../containers/detection_engine/rules'); + +describe('RulesPage', () => { + beforeAll(() => { + (useUserInfo as jest.Mock).mockReturnValue({}); + (usePrePackagedRules as jest.Mock).mockReturnValue({}); + }); + it('renders correctly', () => { + const wrapper = shallow(); + + expect(wrapper.find('AllRules')).toHaveLength(1); + }); +}); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/utils.test.ts b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/utils.test.ts new file mode 100644 index 0000000000000..34a521ed32b12 --- /dev/null +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/utils.test.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getBreadcrumbs } from './utils'; + +describe('getBreadcrumbs', () => { + it('returns default value for incorrect params', () => { + expect( + getBreadcrumbs( + { + pageName: 'pageName', + detailName: 'detailName', + tabName: undefined, + search: '', + pathName: 'pathName', + }, + [] + ) + ).toEqual([{ href: '#/link-to/detections', text: 'Detections' }]); + }); +}); From 423a297f753e36dc98b107ecd48971d25ebefbb7 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Wed, 15 Apr 2020 09:23:57 -0400 Subject: [PATCH 15/80] [Ingest] Use agent.yml template when creating a datasource stream from a package (#62631) --- .../datasource_to_agent_datasource.test.ts | 34 ++--- .../datasource_to_agent_datasource.ts | 35 +---- .../common/types/models/datasource.ts | 1 + .../enrollment_token_list_page/index.tsx | 13 +- .../server/routes/datasource/handlers.ts | 37 ++++- .../ingest_manager/server/saved_objects.ts | 1 + .../server/services/datasource.test.ts | 137 ++++++++++++++++++ .../server/services/datasource.ts | 69 ++++++++- .../server/services/epm/agent/agent.test.ts | 46 +++--- .../server/services/epm/agent/agent.ts | 19 +-- .../epm/agent/tests/input.generated.yaml | 5 - .../server/services/epm/agent/tests/input.yml | 7 - .../services/epm/agent/tests/manifest.yml | 20 --- .../server/services/epm/packages/assets.ts | 10 ++ .../ingest_manager/server/services/setup.ts | 16 +- 15 files changed, 311 insertions(+), 139 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/server/services/datasource.test.ts delete mode 100644 x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.generated.yaml delete mode 100644 x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.yml delete mode 100644 x-pack/plugins/ingest_manager/server/services/epm/agent/tests/manifest.yml diff --git a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts index b897c03e89f82..3496ea782ee99 100644 --- a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts +++ b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts @@ -38,6 +38,10 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { fooVar: { value: 'foo-value' }, fooVar2: { value: [1, 2] }, }, + pkg_stream: { + fooKey: 'fooValue1', + fooKey2: ['fooValue2'], + }, }, { id: 'test-logs-bar', @@ -95,7 +99,7 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { }); }); - it('returns agent datasource config with flattened input and stream configs', () => { + it('returns agent datasource config with flattened input and package stream', () => { expect(storedDatasourceToAgentDatasource({ ...mockDatasource, inputs: [mockInput] })).toEqual({ id: 'mock-datasource', namespace: 'default', @@ -105,34 +109,18 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { { type: 'test-logs', enabled: true, - inputVar: 'input-value', - inputVar3: { - testField: 'test', - }, streams: [ { id: 'test-logs-foo', enabled: true, dataset: 'foo', - fooVar: 'foo-value', - fooVar2: [1, 2], + fooKey: 'fooValue1', + fooKey2: ['fooValue2'], }, { id: 'test-logs-bar', enabled: true, dataset: 'bar', - barVar: 'bar-value', - barVar2: [1, 2], - barVar3: [ - { - namespace: 'mockNamespace', - anotherProp: 'test', - }, - { - namespace: 'mockNamespace2', - anotherProp: 'test2', - }, - ], }, ], }, @@ -160,17 +148,13 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { { type: 'test-logs', enabled: true, - inputVar: 'input-value', - inputVar3: { - testField: 'test', - }, streams: [ { id: 'test-logs-foo', enabled: true, dataset: 'foo', - fooVar: 'foo-value', - fooVar2: [1, 2], + fooKey: 'fooValue1', + fooKey2: ['fooValue2'], }, ], }, diff --git a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts index 20bbbec8919d6..b509878b7f945 100644 --- a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts +++ b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts @@ -3,38 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { safeLoad } from 'js-yaml'; -import { - Datasource, - NewDatasource, - DatasourceConfigRecord, - DatasourceConfigRecordEntry, - FullAgentConfigDatasource, -} from '../types'; +import { Datasource, NewDatasource, FullAgentConfigDatasource } from '../types'; import { DEFAULT_OUTPUT } from '../constants'; -const configReducer = ( - configResult: DatasourceConfigRecord, - configEntry: [string, DatasourceConfigRecordEntry] -): DatasourceConfigRecord => { - const [configName, { type: configType, value: configValue }] = configEntry; - if (configValue !== undefined && configValue !== '') { - if (configType === 'yaml') { - try { - const yamlValue = safeLoad(configValue); - if (yamlValue) { - configResult[configName] = yamlValue; - } - } catch (e) { - // Silently swallow parsing error - } - } else { - configResult[configName] = configValue; - } - } - return configResult; -}; - export const storedDatasourceToAgentDatasource = ( datasource: Datasource | NewDatasource ): FullAgentConfigDatasource => { @@ -50,14 +21,14 @@ export const storedDatasourceToAgentDatasource = ( .map(input => { const fullInput = { ...input, - ...Object.entries(input.config || {}).reduce(configReducer, {}), streams: input.streams .filter(stream => stream.enabled) .map(stream => { const fullStream = { ...stream, - ...Object.entries(stream.config || {}).reduce(configReducer, {}), + ...stream.pkg_stream, }; + delete fullStream.pkg_stream; delete fullStream.config; return fullStream; }), diff --git a/x-pack/plugins/ingest_manager/common/types/models/datasource.ts b/x-pack/plugins/ingest_manager/common/types/models/datasource.ts index ee4d24ab11777..48243a12120f9 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/datasource.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/datasource.ts @@ -23,6 +23,7 @@ export interface DatasourceInputStream { dataset: string; processors?: string[]; config?: DatasourceConfigRecord; + pkg_stream?: any; } export interface DatasourceInput { diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx index e4f7202aeee10..7520f88215efe 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx @@ -72,7 +72,7 @@ const ApiKeyField: React.FunctionComponent<{ apiKeyId: string }> = ({ apiKeyId } {key} ) : ( - •••••••••••••••••••••••••• + ••••••••••••••••••••• )} @@ -151,11 +151,10 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { defaultMessage: 'Name', }), truncateText: true, - width: '300px', textOnly: true, render: (name: string) => { return ( - + {name} ); @@ -166,7 +165,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { name: i18n.translate('xpack.ingestManager.enrollmentTokensList.secretTitle', { defaultMessage: 'Secret', }), - width: '245px', + width: '215px', render: (apiKeyId: string) => { return ; }, @@ -186,7 +185,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { name: i18n.translate('xpack.ingestManager.enrollmentTokensList.createdAtTitle', { defaultMessage: 'Created on', }), - width: '200px', + width: '150px', render: (createdAt: string) => { return createdAt ? ( @@ -198,7 +197,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { name: i18n.translate('xpack.ingestManager.enrollmentTokensList.activeTitle', { defaultMessage: 'Active', }), - width: '80px', + width: '70px', render: (active: boolean) => { return ( @@ -212,7 +211,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { name: i18n.translate('xpack.ingestManager.enrollmentTokensList.actionsTitle', { defaultMessage: 'Actions', }), - width: '100px', + width: '70px', render: (_: any, apiKey: EnrollmentAPIKey) => { return ( apiKey.active && ( diff --git a/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts index 7ae562cf130ab..56d6053a1451b 100644 --- a/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { TypeOf } from '@kbn/config-schema'; +import Boom from 'boom'; import { RequestHandler } from 'src/core/server'; import { appContextService, datasourceService } from '../../services'; import { ensureInstalledPackage } from '../../services/epm/packages'; @@ -75,6 +76,7 @@ export const createDatasourceHandler: RequestHandler< const soClient = context.core.savedObjects.client; const callCluster = context.core.elasticsearch.adminClient.callAsCurrentUser; const user = (await appContextService.getSecurity()?.authc.getCurrentUser(request)) || undefined; + const newData = { ...request.body }; try { // Make sure the datasource package is installed if (request.body.package?.name) { @@ -83,10 +85,18 @@ export const createDatasourceHandler: RequestHandler< pkgName: request.body.package.name, callCluster, }); + + newData.inputs = (await datasourceService.assignPackageStream( + { + pkgName: request.body.package.name, + pkgVersion: request.body.package.version, + }, + request.body.inputs + )) as TypeOf['inputs']; } // Create datasource - const datasource = await datasourceService.create(soClient, request.body, { user }); + const datasource = await datasourceService.create(soClient, newData, { user }); const body: CreateDatasourceResponse = { item: datasource, success: true }; return response.ok({ body, @@ -107,14 +117,33 @@ export const updateDatasourceHandler: RequestHandler< const soClient = context.core.savedObjects.client; const user = (await appContextService.getSecurity()?.authc.getCurrentUser(request)) || undefined; try { - const datasource = await datasourceService.update( + const datasource = await datasourceService.get(soClient, request.params.datasourceId); + + if (!datasource) { + throw Boom.notFound('Datasource not found'); + } + + const newData = { ...request.body }; + const pkg = newData.package || datasource.package; + const inputs = newData.inputs || datasource.inputs; + if (pkg && (newData.inputs || newData.package)) { + newData.inputs = (await datasourceService.assignPackageStream( + { + pkgName: pkg.name, + pkgVersion: pkg.version, + }, + inputs + )) as TypeOf['inputs']; + } + + const updatedDatasource = await datasourceService.update( soClient, request.params.datasourceId, - request.body, + newData, { user } ); return response.ok({ - body: { item: datasource, success: true }, + body: { item: updatedDatasource, success: true }, }); } catch (e) { return response.customError({ diff --git a/x-pack/plugins/ingest_manager/server/saved_objects.ts b/x-pack/plugins/ingest_manager/server/saved_objects.ts index 6800cb4056700..1c36fda36847d 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects.ts @@ -137,6 +137,7 @@ export const savedObjectMappings = { dataset: { type: 'keyword' }, processors: { type: 'keyword' }, config: { type: 'flattened' }, + pkg_stream: { type: 'flattened' }, }, }, }, diff --git a/x-pack/plugins/ingest_manager/server/services/datasource.test.ts b/x-pack/plugins/ingest_manager/server/services/datasource.test.ts new file mode 100644 index 0000000000000..09c59998388d1 --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/services/datasource.test.ts @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { datasourceService } from './datasource'; + +async function mockedGetAssetsData(_a: any, _b: any, dataset: string) { + if (dataset === 'dataset1') { + return [ + { + buffer: Buffer.from(` +type: log +metricset: ["dataset1"] +paths: +{{#each paths}} +- {{this}} +{{/each}} +`), + }, + ]; + } + return []; +} + +jest.mock('./epm/packages/assets', () => { + return { + getAssetsDataForPackageKey: mockedGetAssetsData, + }; +}); + +describe('Datasource service', () => { + describe('assignPackageStream', () => { + it('should work with cofig variables from the stream', async () => { + const inputs = await datasourceService.assignPackageStream( + { + pkgName: 'package', + pkgVersion: '1.0.0', + }, + [ + { + type: 'log', + enabled: true, + streams: [ + { + id: 'dataset01', + dataset: 'package.dataset1', + enabled: true, + config: { + paths: { + value: ['/var/log/set.log'], + }, + }, + }, + ], + }, + ] + ); + + expect(inputs).toEqual([ + { + type: 'log', + enabled: true, + streams: [ + { + id: 'dataset01', + dataset: 'package.dataset1', + enabled: true, + config: { + paths: { + value: ['/var/log/set.log'], + }, + }, + pkg_stream: { + metricset: ['dataset1'], + paths: ['/var/log/set.log'], + type: 'log', + }, + }, + ], + }, + ]); + }); + + it('should work with config variables at the input level', async () => { + const inputs = await datasourceService.assignPackageStream( + { + pkgName: 'package', + pkgVersion: '1.0.0', + }, + [ + { + type: 'log', + enabled: true, + config: { + paths: { + value: ['/var/log/set.log'], + }, + }, + streams: [ + { + id: 'dataset01', + dataset: 'package.dataset1', + enabled: true, + }, + ], + }, + ] + ); + + expect(inputs).toEqual([ + { + type: 'log', + enabled: true, + config: { + paths: { + value: ['/var/log/set.log'], + }, + }, + streams: [ + { + id: 'dataset01', + dataset: 'package.dataset1', + enabled: true, + pkg_stream: { + metricset: ['dataset1'], + paths: ['/var/log/set.log'], + type: 'log', + }, + }, + ], + }, + ]); + }); + }); +}); diff --git a/x-pack/plugins/ingest_manager/server/services/datasource.ts b/x-pack/plugins/ingest_manager/server/services/datasource.ts index 1b8f2a690b94d..f27252aaa9a84 100644 --- a/x-pack/plugins/ingest_manager/server/services/datasource.ts +++ b/x-pack/plugins/ingest_manager/server/services/datasource.ts @@ -4,16 +4,28 @@ * you may not use this file except in compliance with the Elastic License. */ import { SavedObjectsClientContract } from 'src/core/server'; +import { safeLoad } from 'js-yaml'; import { AuthenticatedUser } from '../../../security/server'; -import { DeleteDatasourcesResponse, packageToConfigDatasource } from '../../common'; +import { + DeleteDatasourcesResponse, + packageToConfigDatasource, + DatasourceInput, + DatasourceInputStream, +} from '../../common'; import { DATASOURCE_SAVED_OBJECT_TYPE } from '../constants'; import { NewDatasource, Datasource, ListWithKuery } from '../types'; import { agentConfigService } from './agent_config'; import { getPackageInfo, getInstallation } from './epm/packages'; import { outputService } from './output'; +import { getAssetsDataForPackageKey } from './epm/packages/assets'; +import { createStream } from './epm/agent/agent'; const SAVED_OBJECT_TYPE = DATASOURCE_SAVED_OBJECT_TYPE; +function getDataset(st: string) { + return st.split('.')[1]; +} + class DatasourceService { public async create( soClient: SavedObjectsClientContract, @@ -187,6 +199,61 @@ class DatasourceService { } } } + + public async assignPackageStream( + pkgInfo: { pkgName: string; pkgVersion: string }, + inputs: DatasourceInput[] + ): Promise { + const inputsPromises = inputs.map(input => _assignPackageStreamToInput(pkgInfo, input)); + return Promise.all(inputsPromises); + } +} + +const _isAgentStream = (p: string) => !!p.match(/agent\/stream\/stream\.yml/); + +async function _assignPackageStreamToInput( + pkgInfo: { pkgName: string; pkgVersion: string }, + input: DatasourceInput +) { + const streamsPromises = input.streams.map(stream => + _assignPackageStreamToStream(pkgInfo, input, stream) + ); + + const streams = await Promise.all(streamsPromises); + return { ...input, streams }; +} + +async function _assignPackageStreamToStream( + pkgInfo: { pkgName: string; pkgVersion: string }, + input: DatasourceInput, + stream: DatasourceInputStream +) { + if (!stream.enabled) { + return { ...stream, pkg_stream: undefined }; + } + const dataset = getDataset(stream.dataset); + const assetsData = await getAssetsDataForPackageKey(pkgInfo, _isAgentStream, dataset); + + const [pkgStream] = assetsData; + if (!pkgStream || !pkgStream.buffer) { + throw new Error(`Stream template not found for dataset ${dataset}`); + } + + // Populate template variables from input config and stream config + const data: { [k: string]: string | string[] } = {}; + if (input.config) { + for (const key of Object.keys(input.config)) { + data[key] = input.config[key].value; + } + } + if (stream.config) { + for (const key of Object.keys(stream.config)) { + data[key] = stream.config[key].value; + } + } + const yaml = safeLoad(createStream(data, pkgStream.buffer.toString())); + stream.pkg_stream = yaml; + return { ...stream }; } export const datasourceService = new DatasourceService(); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.test.ts index 4f75ba0332418..21de625532f03 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.test.ts @@ -4,29 +4,31 @@ * you may not use this file except in compliance with the Elastic License. */ -import fs from 'fs'; -import * as yaml from 'js-yaml'; -import path from 'path'; -import { createInput } from './agent'; +import { createStream } from './agent'; -test('test converting input and manifest into template', () => { - const manifest = yaml.safeLoad( - fs.readFileSync(path.join(__dirname, 'tests/manifest.yml'), 'utf8') - ); +test('Test creating a stream from template', () => { + const streamTemplate = ` +input: log +paths: +{{#each paths}} + - {{this}} +{{/each}} +exclude_files: [".gz$"] +processors: + - add_locale: ~ + `; + const vars = { + paths: ['/usr/local/var/log/nginx/access.log'], + }; - const inputTemplate = fs.readFileSync(path.join(__dirname, 'tests/input.yml'), 'utf8'); - const output = createInput(manifest.vars, inputTemplate); + const output = createStream(vars, streamTemplate); - // Golden file path - const generatedFile = path.join(__dirname, './tests/input.generated.yaml'); - - // Regenerate the file if `-generate` flag is used - if (process.argv.includes('-generate')) { - fs.writeFileSync(generatedFile, output); - } - - const outputData = fs.readFileSync(generatedFile, 'utf-8'); - - // Check that content file and generated file are equal - expect(outputData).toBe(output); + expect(output).toBe(` +input: log +paths: + - /usr/local/var/log/nginx/access.log +exclude_files: [".gz$"] +processors: + - add_locale: ~ + `); }); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.ts b/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.ts index c7dd3dab38bc1..5d9a6d409aa1a 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/agent/agent.ts @@ -5,19 +5,12 @@ */ import Handlebars from 'handlebars'; -import { RegistryVarsEntry } from '../../../types'; -/** - * This takes a dataset object as input and merges it with the input template. - * It returns the resolved template as a string. - */ -export function createInput(vars: RegistryVarsEntry[], inputTemplate: string): string { - const view: Record = {}; - - for (const v of vars) { - view[v.name] = v.default; - } +interface StreamVars { + [k: string]: string | string[]; +} - const template = Handlebars.compile(inputTemplate); - return template(view); +export function createStream(vars: StreamVars, streamTemplate: string) { + const template = Handlebars.compile(streamTemplate); + return template(vars); } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.generated.yaml b/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.generated.yaml deleted file mode 100644 index 451ed554ce259..0000000000000 --- a/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.generated.yaml +++ /dev/null @@ -1,5 +0,0 @@ -type: log -paths: - - "/var/log/nginx/access.log*" - -tags: nginx diff --git a/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.yml b/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.yml deleted file mode 100644 index 65a23fc2fa9ad..0000000000000 --- a/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/input.yml +++ /dev/null @@ -1,7 +0,0 @@ -type: log -paths: -{{#each paths}} - - "{{this}}" -{{/each}} - -tags: {{tags}} diff --git a/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/manifest.yml b/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/manifest.yml deleted file mode 100644 index 46a38179fe132..0000000000000 --- a/x-pack/plugins/ingest_manager/server/services/epm/agent/tests/manifest.yml +++ /dev/null @@ -1,20 +0,0 @@ -title: Nginx Acess Logs -release: beta -type: logs -ingest_pipeline: default - -vars: - - name: paths - # Should we define this as array? How will the UI best make sense of it? - type: textarea - default: - - /var/log/nginx/access.log* - # I suggest to use ECS fields for this config options here: https://github.com/elastic/ecs/blob/master/schemas/os.yml - # This would need to be based on a predefined definition on what can be filtered on - os.darwin: - - /usr/local/var/log/nginx/access.log* - os.windows: - - c:/programdata/nginx/logs/*access.log* - - name: tags - default: [nginx] - type: text diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts index 7026d9eae24c3..50d347c69cc24 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts @@ -71,3 +71,13 @@ export async function getAssetsData( return entries; } + +export async function getAssetsDataForPackageKey( + { pkgName, pkgVersion }: { pkgName: string; pkgVersion: string }, + filter = (path: string): boolean => true, + datasetName?: string +): Promise { + const registryPkgInfo = await Registry.fetchInfo(pkgName, pkgVersion); + + return getAssetsData(registryPkgInfo, filter, datasetName); +} diff --git a/x-pack/plugins/ingest_manager/server/services/setup.ts b/x-pack/plugins/ingest_manager/server/services/setup.ts index bbaf083fb8396..167a24481aba5 100644 --- a/x-pack/plugins/ingest_manager/server/services/setup.ts +++ b/x-pack/plugins/ingest_manager/server/services/setup.ts @@ -123,8 +123,18 @@ async function addPackageToConfig( pkgName: packageToInstall.name, pkgVersion: packageToInstall.version, }); - await datasourceService.create( - soClient, - packageToConfigDatasource(packageInfo, config.id, defaultOutput.id, undefined, config.namespace) + + const newDatasource = packageToConfigDatasource( + packageInfo, + config.id, + defaultOutput.id, + undefined, + config.namespace + ); + newDatasource.inputs = await datasourceService.assignPackageStream( + { pkgName: packageToInstall.name, pkgVersion: packageToInstall.version }, + newDatasource.inputs ); + + await datasourceService.create(soClient, newDatasource); } From 88d352392590ee08bc5ddbcfaf667d5d638a996b Mon Sep 17 00:00:00 2001 From: Alexander Reelsen Date: Wed, 15 Apr 2020 15:30:26 +0200 Subject: [PATCH 16/80] Add processors to devtools console autocomplete (#60553) This add completion support for the csv, circle, geoip, html strip, inference, set security user, urldecode and user agent processors to the dev tools console. --- .../server/lib/spec_definitions/js/ingest.ts | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/plugins/console/server/lib/spec_definitions/js/ingest.ts b/src/plugins/console/server/lib/spec_definitions/js/ingest.ts index 1182dc075f42f..20dbeda5e0b3d 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/ingest.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/ingest.ts @@ -57,6 +57,49 @@ const bytesProcessorDefinition = { }, }; +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest-circle-processor.html +const circleProcessorDefinition = { + circle: { + __template: { + field: '', + error_distance: '', + shape_type: '', + }, + field: '', + target_field: '', + error_distance: '', + shape_type: { + __one_of: ['geo_shape', 'shape'], + }, + ignore_missing: { + __one_of: [false, true], + }, + ...commonPipelineParams, + }, +}; + +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/csv-processor.html +const csvProcessorDefinition = { + csv: { + __template: { + field: '', + target_fields: [''], + }, + field: '', + target_fields: [''], + separator: '', + quote: '', + empty_value: '', + trim: { + __one_of: [true, false], + }, + ignore_missing: { + __one_of: [false, true], + }, + ...commonPipelineParams, + }, +}; + // Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/convert-processor.html const convertProcessorDefinition = { convert: { @@ -174,6 +217,25 @@ const foreachProcessorDefinition = { }, }; +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/geoip-processor.html +const geoipProcessorDefinition = { + geoip: { + __template: { + field: '', + }, + field: '', + target_field: '', + database_file: '', + properties: [''], + ignore_missing: { + __one_of: [false, true], + }, + first_only: { + __one_of: [false, true], + }, + }, +}; + // Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/grok-processor.html const grokProcessorDefinition = { grok: { @@ -209,6 +271,37 @@ const gsubProcessorDefinition = { }, }; +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/htmlstrip-processor.html +const htmlStripProcessorDefinition = { + html_strip: { + __template: { + field: '', + }, + field: '', + target_field: '', + ignore_missing: { + __one_of: [false, true], + }, + ...commonPipelineParams, + }, +}; + +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/inference-processor.html +const inferenceProcessorDefinition = { + inference: { + __template: { + model_id: '', + field_map: {}, + inference_config: {}, + }, + model_id: '', + field_map: {}, + inference_config: {}, + target_field: '', + ...commonPipelineParams, + }, +}; + // Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/join-processor.html const joinProcessorDefinition = { join: { @@ -338,6 +431,18 @@ const setProcessorDefinition = { }, }; +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest-node-set-security-user-processor.html +const setSecurityUserProcessorDefinition = { + set_security_user: { + __template: { + field: '', + }, + field: '', + properties: [''], + ...commonPipelineParams, + }, +}; + // Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/split-processor.html const splitProcessorDefinition = { split: { @@ -394,10 +499,43 @@ const uppercaseProcessorDefinition = { }, }; +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/urldecode-processor.html +const urlDecodeProcessorDefinition = { + urldecode: { + __template: { + field: '', + }, + field: '', + target_field: '', + ignore_missing: { + __one_of: [false, true], + }, + ...commonPipelineParams, + }, +}; + +// Based on https://www.elastic.co/guide/en/elasticsearch/reference/master/user-agent-processor.html +const userAgentProcessorDefinition = { + user_agent: { + __template: { + field: '', + }, + field: '', + target_field: '', + regex_file: '', + properties: [''], + ignore_missing: { + __one_of: [false, true], + }, + }, +}; + const processorDefinition = { __one_of: [ appendProcessorDefinition, bytesProcessorDefinition, + csvProcessorDefinition, + circleProcessorDefinition, convertProcessorDefinition, dateProcessorDefinition, dateIndexNameProcessorDefinition, @@ -406,8 +544,11 @@ const processorDefinition = { dropProcessorDefinition, failProcessorDefinition, foreachProcessorDefinition, + geoipProcessorDefinition, grokProcessorDefinition, gsubProcessorDefinition, + htmlStripProcessorDefinition, + inferenceProcessorDefinition, joinProcessorDefinition, jsonProcessorDefinition, kvProcessorDefinition, @@ -417,10 +558,13 @@ const processorDefinition = { renameProcessorDefinition, scriptProcessorDefinition, setProcessorDefinition, + setSecurityUserProcessorDefinition, splitProcessorDefinition, sortProcessorDefinition, trimProcessorDefinition, uppercaseProcessorDefinition, + urlDecodeProcessorDefinition, + userAgentProcessorDefinition, ], }; From 3b64a65ed6a103f86badcaa4d90cf3a992c9dbc0 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 15 Apr 2020 15:41:42 +0200 Subject: [PATCH 17/80] [Drilldowns] improve action.getHref() for drilldowns (#63228) getHref on Action interfaces in uiActions plugin is now async. getHref is now used only to support right click behaviour. execute() takes control on regular click. --- .../lib/actions/edit_panel_action.test.tsx | 2 +- .../public/lib/actions/edit_panel_action.ts | 11 ++++-- .../ui_actions/public/actions/action.ts | 6 ++-- .../public/actions/action_definition.ts | 2 +- .../public/actions/create_action.ts | 1 - .../build_eui_context_menu_panels.tsx | 36 ++++++++++++++----- .../public/triggers/trigger_internal.ts | 7 ---- .../public/sample_panel_link.ts | 6 ++-- 8 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx b/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx index ce733bba6dda5..d07bf915845e9 100644 --- a/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx +++ b/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx @@ -56,7 +56,7 @@ test('getHref returns the edit urls', async () => { if (action.getHref) { const embeddable = new EditableEmbeddable({ id: '123', viewMode: ViewMode.EDIT }, true); expect( - action.getHref({ + await action.getHref({ embeddable, }) ).toBe(embeddable.getOutput().editUrl); diff --git a/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts b/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts index 9125dc0813f98..044e7b5d35ad8 100644 --- a/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts +++ b/src/plugins/embeddable/public/lib/actions/edit_panel_action.ts @@ -62,11 +62,16 @@ export class EditPanelAction implements Action { return Boolean(canEditEmbeddable && inDashboardEditMode); } - public async execute() { - return; + public async execute(context: ActionContext) { + const href = await this.getHref(context); + if (href) { + // TODO: when apps start using browser router instead of hash router this has to be fixed + // https://github.com/elastic/kibana/issues/58217 + window.location.href = href; + } } - public getHref({ embeddable }: ActionContext): string { + public async getHref({ embeddable }: ActionContext): Promise { const editUrl = embeddable ? embeddable.getOutput().editUrl : undefined; return editUrl ? editUrl : ''; } diff --git a/src/plugins/ui_actions/public/actions/action.ts b/src/plugins/ui_actions/public/actions/action.ts index f532c2c8aa219..feaa1f6a60e2f 100644 --- a/src/plugins/ui_actions/public/actions/action.ts +++ b/src/plugins/ui_actions/public/actions/action.ts @@ -63,9 +63,11 @@ export interface Action { isCompatible(context: Context): Promise; /** - * If this returns something truthy, this is used in addition to the `execute` method when clicked. + * If this returns something truthy, this will be used as [href] attribute on a link if possible (e.g. in context menu item) + * to support right click -> open in a new tab behavior. + * For regular click navigation is prevented and `execute()` takes control. */ - getHref?(context: Context): string | undefined; + getHref?(context: Context): Promise; /** * Executes the action. diff --git a/src/plugins/ui_actions/public/actions/action_definition.ts b/src/plugins/ui_actions/public/actions/action_definition.ts index 3eaa13572a826..79fda78401abd 100644 --- a/src/plugins/ui_actions/public/actions/action_definition.ts +++ b/src/plugins/ui_actions/public/actions/action_definition.ts @@ -63,7 +63,7 @@ export interface ActionDefinition { /** * If this returns something truthy, this is used in addition to the `execute` method when clicked. */ - getHref?(context: ActionContextMapping[T]): string | undefined; + getHref?(context: ActionContextMapping[T]): Promise; /** * Executes the action. diff --git a/src/plugins/ui_actions/public/actions/create_action.ts b/src/plugins/ui_actions/public/actions/create_action.ts index 90a9415c0b497..cc66f221e4082 100644 --- a/src/plugins/ui_actions/public/actions/create_action.ts +++ b/src/plugins/ui_actions/public/actions/create_action.ts @@ -28,7 +28,6 @@ export function createAction(action: ActionDefinition): id: action.type, isCompatible: () => Promise.resolve(true), getDisplayName: () => '', - getHref: () => undefined, ...action, }; } diff --git a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx index 3dce2c1f4c257..d26740ffdf033 100644 --- a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx +++ b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx @@ -71,7 +71,7 @@ async function buildEuiContextMenuPanelItems({ } items.push( - convertPanelActionToContextMenuItem({ + await convertPanelActionToContextMenuItem({ action, actionContext, closeMenu, @@ -88,9 +88,9 @@ async function buildEuiContextMenuPanelItems({ * * @param {ContextMenuAction} action * @param {Embeddable} embeddable - * @return {EuiContextMenuPanelItemDescriptor} + * @return {Promise} */ -function convertPanelActionToContextMenuItem({ +async function convertPanelActionToContextMenuItem({ action, actionContext, closeMenu, @@ -98,7 +98,7 @@ function convertPanelActionToContextMenuItem({ action: Action; actionContext: A; closeMenu: () => void; -}): EuiContextMenuPanelItemDescriptor { +}): Promise { const menuPanelItem: EuiContextMenuPanelItemDescriptor = { name: action.MenuItem ? React.createElement(uiToReactComponent(action.MenuItem), { @@ -110,13 +110,33 @@ function convertPanelActionToContextMenuItem({ 'data-test-subj': `embeddablePanelAction-${action.id}`, }; - menuPanelItem.onClick = () => { - action.execute(actionContext); + menuPanelItem.onClick = event => { + if (event.currentTarget instanceof HTMLAnchorElement) { + // from react-router's + if ( + !event.defaultPrevented && // onClick prevented default + event.button === 0 && // ignore everything but left clicks + (!event.currentTarget.target || event.currentTarget.target === '_self') && // let browser handle "target=_blank" etc. + !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) // ignore clicks with modifier keys + ) { + event.preventDefault(); + action.execute(actionContext); + } else { + // let browser handle navigation + } + } else { + // not a link + action.execute(actionContext); + } + closeMenu(); }; - if (action.getHref && action.getHref(actionContext)) { - menuPanelItem.href = action.getHref(actionContext); + if (action.getHref) { + const href = await action.getHref(actionContext); + if (href) { + menuPanelItem.href = href; + } } return menuPanelItem; diff --git a/src/plugins/ui_actions/public/triggers/trigger_internal.ts b/src/plugins/ui_actions/public/triggers/trigger_internal.ts index 5b670df354f78..1fc92d7c0cb1b 100644 --- a/src/plugins/ui_actions/public/triggers/trigger_internal.ts +++ b/src/plugins/ui_actions/public/triggers/trigger_internal.ts @@ -55,13 +55,6 @@ export class TriggerInternal { action: Action, context: TriggerContextMapping[T] ) { - const href = action.getHref && action.getHref(context); - - if (href) { - window.location.href = href; - return; - } - await action.execute(context); } diff --git a/test/plugin_functional/plugins/kbn_sample_panel_action/public/sample_panel_link.ts b/test/plugin_functional/plugins/kbn_sample_panel_action/public/sample_panel_link.ts index b0f1219a815a3..faa774b8485b1 100644 --- a/test/plugin_functional/plugins/kbn_sample_panel_action/public/sample_panel_link.ts +++ b/test/plugin_functional/plugins/kbn_sample_panel_action/public/sample_panel_link.ts @@ -26,6 +26,8 @@ export const createSamplePanelLink = (): Action => createAction({ type: SAMPLE_PANEL_LINK, getDisplayName: () => 'Sample panel Link', - execute: async () => {}, - getHref: () => 'https://example.com/kibana/test', + execute: async () => { + window.location.href = 'https://example.com/kibana/test'; + }, + getHref: async () => 'https://example.com/kibana/test', }); From 6f1fe676f2c5fc053a0cb6e76d2355026dceae67 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Wed, 15 Apr 2020 06:43:17 -0700 Subject: [PATCH 18/80] Fixed inability to clear numeric field in a "Group over top docs" condition (#63543) --- .../public/common/expression_items/group_by_over.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/group_by_over.tsx b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/group_by_over.tsx index 6ad52a5416163..619d85d99719b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/expression_items/group_by_over.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/common/expression_items/group_by_over.tsx @@ -146,16 +146,13 @@ export const GroupByExpression = ({ {groupByTypes[groupBy].sizeRequired ? ( - 0 && termSize !== undefined} - error={errors.termSize} - > + 0} error={errors.termSize}> 0 && termSize !== undefined} - value={termSize} + isInvalid={errors.termSize.length > 0} + value={termSize || ''} onChange={e => { const { value } = e.target; - const termSizeVal = value !== '' ? parseFloat(value) : MIN_TERM_SIZE; + const termSizeVal = value !== '' ? parseFloat(value) : undefined; onChangeSelectedTermSize(termSizeVal); }} min={MIN_TERM_SIZE} From d1d0a44d5d46673d2409cb1b44b8bf0c81107b35 Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Wed, 15 Apr 2020 06:59:47 -0700 Subject: [PATCH 19/80] Closes #63113 by limiting service maps to only draw certain shapes in IE 11 without icons (#63558) --- .../app/ServiceMap/Popover/Contents.tsx | 36 +++++++++++++++---- .../app/ServiceMap/cytoscapeOptions.ts | 34 +++++++++++++----- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx index 52263878ca915..491ebdc5aad15 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx @@ -27,6 +27,30 @@ interface ContentsProps { selectedNodeServiceName: string; } +// IE 11 does not handle flex properties as expected. With browser detection, +// we can use regular div elements to render contents that are almost identical. +// +// This method of detecting IE is from a Stack Overflow answer: +// https://stackoverflow.com/a/21825207 +// +// @ts-ignore `documentMode` is not recognized as a valid property of `document`. +const isIE11 = !!window.MSInputMethodContext && !!document.documentMode; + +const FlexColumnGroup = (props: { + children: React.ReactNode; + style: React.CSSProperties; + direction: 'column'; + gutterSize: 's'; +}) => { + if (isIE11) { + const { direction, gutterSize, ...rest } = props; + return
; + } + return ; +}; +const FlexColumnItem = (props: { children: React.ReactNode }) => + isIE11 ?
: ; + export function Contents({ selectedNodeData, isService, @@ -36,18 +60,18 @@ export function Contents({ }: ContentsProps) { const frameworkName = selectedNodeData[SERVICE_FRAMEWORK_NAME]; return ( - - +

{label}

-
- + + {isService ? ( )} - + {isService && ( )} -
+ ); } diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts index 92f66f698f044..bf0e052b951ae 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts @@ -12,6 +12,17 @@ import { } from '../../../../../../../plugins/apm/common/elasticsearch_fieldnames'; import { defaultIcon, iconForNode } from './icons'; +// IE 11 does not properly load some SVGs or draw certain shapes. This causes +// a runtime error and the map fails work at all. We would prefer to do some +// kind of feature detection rather than browser detection, but some of these +// limitations are not well documented for older browsers. +// +// This method of detecting IE is from a Stack Overflow answer: +// https://stackoverflow.com/a/21825207 +// +// @ts-ignore `documentMode` is not recognized as a valid property of `document`. +const isIE11 = !!window.MSInputMethodContext && !!document.documentMode; + export const animationOptions: cytoscape.AnimationOptions = { duration: parseInt(theme.euiAnimSpeedNormal, 10), // @ts-ignore The cubic-bezier options here are not recognized by the cytoscape types @@ -37,8 +48,9 @@ const style: cytoscape.Stylesheet[] = [ // used here. // // @ts-ignore - 'background-image': (el: cytoscape.NodeSingular) => - iconForNode(el) ?? defaultIcon, + 'background-image': isIE11 + ? undefined + : (el: cytoscape.NodeSingular) => iconForNode(el) ?? defaultIcon, 'background-height': (el: cytoscape.NodeSingular) => isService(el) ? '60%' : '40%', 'background-width': (el: cytoscape.NodeSingular) => @@ -65,7 +77,7 @@ const style: cytoscape.Stylesheet[] = [ 'min-zoomed-font-size': parseInt(theme.euiSizeL, 10), 'overlay-opacity': 0, shape: (el: cytoscape.NodeSingular) => - isService(el) ? 'ellipse' : 'diamond', + isService(el) ? (isIE11 ? 'rectangle' : 'ellipse') : 'diamond', 'text-background-color': theme.euiColorLightestShade, 'text-background-opacity': 0, 'text-background-padding': theme.paddingSizes.xs, @@ -87,12 +99,12 @@ const style: cytoscape.Stylesheet[] = [ 'line-color': lineColor, 'overlay-opacity': 0, 'target-arrow-color': lineColor, - 'target-arrow-shape': 'triangle', + 'target-arrow-shape': isIE11 ? 'none' : 'triangle', // The DefinitelyTyped definitions don't specify this property since it's // fairly new. // // @ts-ignore - 'target-distance-from-node': theme.paddingSizes.xs, + 'target-distance-from-node': isIE11 ? undefined : theme.paddingSizes.xs, width: 1, 'source-arrow-shape': 'none', 'z-index': zIndexEdge @@ -101,12 +113,16 @@ const style: cytoscape.Stylesheet[] = [ { selector: 'edge[bidirectional]', style: { - 'source-arrow-shape': 'triangle', + 'source-arrow-shape': isIE11 ? 'none' : 'triangle', 'source-arrow-color': lineColor, - 'target-arrow-shape': 'triangle', + 'target-arrow-shape': isIE11 ? 'none' : 'triangle', // @ts-ignore - 'source-distance-from-node': parseInt(theme.paddingSizes.xs, 10), - 'target-distance-from-node': parseInt(theme.paddingSizes.xs, 10) + 'source-distance-from-node': isIE11 + ? undefined + : parseInt(theme.paddingSizes.xs, 10), + 'target-distance-from-node': isIE11 + ? undefined + : parseInt(theme.paddingSizes.xs, 10) } }, // @ts-ignore DefinitelyTyped says visibility is "none" but it's From 23a5734d07eb7dfb03039729a2b3d589384e4077 Mon Sep 17 00:00:00 2001 From: Daniil Suleiman <31325372+sulemanof@users.noreply.github.com> Date: Wed, 15 Apr 2020 17:03:20 +0300 Subject: [PATCH 20/80] [NP] TSVB (#63237) * Move TSVB into new platform * Get rid of isFunction checks * Remove extra import of styling constants * Move styles importing into plugin.ts Co-authored-by: Elastic Machine --- .github/CODEOWNERS | 2 +- .../core_plugins/vis_type_timeseries/index.ts | 45 ------------------- .../vis_type_timeseries/package.json | 6 --- src/plugins/vis_type_timeseries/kibana.json | 2 + .../public/application}/_mixins.scss | 0 .../public/application}/_tvb_editor.scss | 0 .../public/application}/_variables.scss | 0 .../components/_annotations_editor.scss | 0 .../components/_color_picker.scss | 0 .../application}/components/_color_rules.scss | 0 .../components/_custom_color_picker.scss | 0 .../application}/components/_error.scss | 0 .../application}/components/_index.scss | 0 .../components/_markdown_editor.scss | 0 .../application}/components/_no_data.scss | 0 .../components/_series_editor.scss | 0 .../application}/components/_vis_editor.scss | 0 .../components/_vis_editor_visualization.scss | 0 .../application}/components/_vis_picker.scss | 0 .../components/_vis_with_splits.scss | 0 .../components/add_delete_buttons.js | 0 .../components/add_delete_buttons.test.js | 0 .../components/aggs/_agg_row.scss | 0 .../application}/components/aggs/_index.scss | 0 .../application}/components/aggs/agg.js | 0 .../application}/components/aggs/agg_row.js | 0 .../components/aggs/agg_select.js | 0 .../application}/components/aggs/aggs.js | 0 .../components/aggs/calculation.js | 0 .../components/aggs/cumulative_sum.js | 0 .../components/aggs/derivative.js | 0 .../components/aggs/field_select.js | 0 .../components/aggs/filter_ratio.js | 0 .../application}/components/aggs/math.js | 0 .../components/aggs/metric_select.js | 0 .../components/aggs/moving_average.js | 0 .../components/aggs/percentile.js | 0 .../components/aggs/percentile_rank/index.js | 0 .../aggs/percentile_rank/multi_value_row.js | 0 .../aggs/percentile_rank/percentile_rank.js | 0 .../percentile_rank/percentile_rank_values.js | 0 .../components/aggs/percentile_ui.js | 0 .../components/aggs/positive_only.js | 0 .../components/aggs/positive_rate.js | 0 .../components/aggs/serial_diff.js | 0 .../components/aggs/series_agg.js | 0 .../application}/components/aggs/static.js | 0 .../application}/components/aggs/std_agg.js | 0 .../components/aggs/std_deviation.js | 0 .../components/aggs/std_sibling.js | 0 .../aggs/temporary_unsupported_agg.js | 0 .../application}/components/aggs/top_hit.js | 0 .../components/aggs/unsupported_agg.js | 0 .../application}/components/aggs/vars.js | 0 .../components/annotations_editor.js | 0 .../application}/components/color_picker.js | 0 .../components/color_picker.test.js | 0 .../application}/components/color_rules.js | 0 .../components/color_rules.test.js | 0 .../components/custom_color_picker.js | 0 .../components/data_format_picker.js | 0 .../public/application}/components/error.js | 0 .../__snapshots__/icon_select.test.js.snap | 0 .../components/icon_select/icon_select.js | 0 .../icon_select/icon_select.test.js | 0 .../application}/components/index_pattern.js | 0 .../components/lib/agg_to_component.js | 0 .../components/lib/calculate_siblings.js | 0 .../components/lib/calculate_siblings.test.js | 0 .../application}/components/lib/charts.js | 0 .../components/lib/collection_actions.js | 14 ++---- .../components/lib/collection_actions.test.js | 0 .../components/lib/convert_series_to_vars.js | 0 .../lib/convert_series_to_vars.test.js | 0 .../components/lib/create_change_handler.js | 0 .../components/lib/create_number_handler.js | 4 +- .../lib/create_number_handler.test.js | 0 .../components/lib/create_select_handler.js | 8 ++-- .../lib/create_select_handler.test.js | 0 .../components/lib/create_text_handler.js | 4 +- .../lib/create_text_handler.test.js | 0 .../components/lib/create_xaxis_formatter.js | 0 .../application}/components/lib/detect_ie.js | 0 .../application}/components/lib/durations.js | 0 .../components/lib/durations.test.js | 0 .../components/lib/get_axis_label_string.js | 0 .../lib/get_axis_label_string.test.js | 0 .../lib/get_default_query_language.js | 2 +- .../components/lib/get_display_name.js | 0 .../components/lib/get_interval.js | 0 .../components/lib/new_metric_agg_fn.js | 0 .../components/lib/new_series_fn.js | 0 .../components/lib/re_id_series.js | 0 .../components/lib/re_id_series.test.js | 0 .../application}/components/lib/reorder.js | 0 .../components/lib/replace_vars.js | 0 .../components/lib/replace_vars.test.js | 0 .../components/lib/series_change_handler.js | 0 .../application}/components/lib/stacked.js | 0 .../components/lib/tick_formatter.js | 2 +- .../components/lib/tick_formatter.test.js | 2 +- .../components/markdown_editor.js | 0 .../public/application}/components/no_data.js | 0 .../application}/components/panel_config.js | 0 .../components/panel_config/_index.scss | 0 .../panel_config/_panel_config.scss | 0 .../components/panel_config/gauge.js | 0 .../components/panel_config/gauge.test.js | 0 .../components/panel_config/markdown.js | 0 .../components/panel_config/metric.js | 0 .../components/panel_config/table.js | 0 .../components/panel_config/timeseries.js | 0 .../components/panel_config/top_n.js | 0 .../components/query_bar_wrapper.js | 0 .../public/application}/components/series.js | 0 .../application}/components/series_config.js | 0 .../components/series_drag_handler.js | 0 .../application}/components/series_editor.js | 0 .../public/application}/components/split.js | 0 .../splits/__snapshots__/terms.test.js.snap | 0 .../components/splits/everything.js | 0 .../application}/components/splits/filter.js | 0 .../components/splits/filter_items.js | 0 .../application}/components/splits/filters.js | 0 .../components/splits/group_by_select.js | 0 .../application}/components/splits/terms.js | 0 .../components/splits/terms.test.js | 0 .../components/splits/unsupported_split.js | 0 .../application}/components/svg/bomb_icon.js | 0 .../application}/components/svg/fire_icon.js | 0 .../application}/components/vis_editor.js | 4 +- .../components/vis_editor_visualization.js | 0 .../application}/components/vis_picker.js | 0 .../components/vis_types/_index.scss | 0 .../components/vis_types/_vis_types.scss | 0 .../components/vis_types/gauge/series.js | 0 .../components/vis_types/gauge/series.test.js | 0 .../components/vis_types/gauge/vis.js | 0 .../vis_types/markdown/_markdown.scss | 0 .../components/vis_types/markdown/series.js | 0 .../components/vis_types/markdown/vis.js | 0 .../components/vis_types/metric/series.js | 0 .../vis_types/metric/series.test.js | 0 .../components/vis_types/metric/vis.js | 0 .../components/vis_types/table/config.js | 0 .../components/vis_types/table/is_sortable.js | 0 .../components/vis_types/table/series.js | 0 .../components/vis_types/table/vis.js | 2 +- .../components/vis_types/timeseries/config.js | 0 .../components/vis_types/timeseries/series.js | 0 .../components/vis_types/timeseries/vis.js | 2 +- .../components/vis_types/top_n/series.js | 0 .../components/vis_types/top_n/vis.js | 0 .../components/vis_with_splits.js | 0 .../application}/components/visualization.js | 0 .../public/application}/components/yes_no.js | 0 .../application}/components/yes_no.test.js | 0 .../contexts/form_validation_context.js | 0 .../contexts/query_input_bar_context.ts | 0 .../application}/contexts/vis_data_context.js | 0 .../public/application}/editor_controller.js | 10 ++--- .../public/application}/index.scss | 2 - .../public/application/index.ts} | 17 ++----- .../application}/lib/check_ui_restrictions.js | 0 .../application}/lib/create_brush_handler.js | 0 .../lib/create_brush_handler.test.js | 0 .../public/application}/lib/fetch_fields.js | 4 +- .../public/application}/lib/get_timezone.ts | 0 .../public/application/lib/index.ts | 22 +++++++++ .../application}/lib/set_is_reversed.js | 2 +- .../application}/lib/validate_interval.js | 0 .../visualizations/constants/chart.js | 0 .../visualizations/constants/icons.js | 0 .../visualizations/constants/index.js | 0 .../visualizations/lib/active_cursor.js | 0 .../visualizations/lib/calc_dimensions.js | 0 .../lib/calculate_coordinates.js | 0 .../visualizations/lib/get_value_by.js | 0 .../visualizations/views/_annotation.scss | 0 .../visualizations/views/_gauge.scss | 0 .../visualizations/views/_index.scss | 0 .../visualizations/views/_metric.scss | 0 .../visualizations/views/_top_n.scss | 0 .../visualizations/views/annotation.js | 0 .../visualizations/views/gauge.js | 0 .../visualizations/views/gauge_vis.js | 0 .../visualizations/views/metric.js | 0 .../timeseries/__mocks__/@elastic/charts.js | 0 .../__snapshots__/area_decorator.test.js.snap | 0 .../__snapshots__/bar_decorator.test.js.snap | 0 .../timeseries/decorators/area_decorator.js | 0 .../decorators/area_decorator.test.js | 0 .../timeseries/decorators/bar_decorator.js | 0 .../decorators/bar_decorator.test.js | 0 .../visualizations/views/timeseries/index.js | 2 +- .../model/__snapshots__/charts.test.js.snap | 0 .../views/timeseries/model/charts.js | 0 .../views/timeseries/model/charts.test.js | 0 .../__snapshots__/series_styles.test.js.snap | 0 .../views/timeseries/utils/series_styles.js | 0 .../timeseries/utils/series_styles.test.js | 0 .../views/timeseries/utils/stack_format.js | 0 .../timeseries/utils/stack_format.test.js | 0 .../views/timeseries/utils/theme.test.ts | 0 .../views/timeseries/utils/theme.ts | 0 .../visualizations/views/top_n.js | 0 .../vis_type_timeseries/public/index.ts | 2 +- .../vis_type_timeseries/public/metrics_fn.ts | 8 +--- .../public/metrics_type.ts | 12 ++--- .../vis_type_timeseries/public/plugin.ts | 9 ++-- .../public/request_handler.js | 3 +- .../vis_type_timeseries/public/services.ts | 4 +- 212 files changed, 66 insertions(+), 130 deletions(-) delete mode 100644 src/legacy/core_plugins/vis_type_timeseries/index.ts delete mode 100644 src/legacy/core_plugins/vis_type_timeseries/package.json rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/_mixins.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/_tvb_editor.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/_variables.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_annotations_editor.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_color_picker.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_color_rules.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_custom_color_picker.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_error.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_index.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_markdown_editor.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_no_data.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_series_editor.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_vis_editor.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_vis_editor_visualization.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_vis_picker.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/_vis_with_splits.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/add_delete_buttons.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/add_delete_buttons.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/_agg_row.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/_index.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/agg.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/agg_row.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/agg_select.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/aggs.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/calculation.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/cumulative_sum.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/derivative.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/field_select.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/filter_ratio.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/math.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/metric_select.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/moving_average.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/percentile.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/percentile_rank/index.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/percentile_rank/multi_value_row.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/percentile_rank/percentile_rank.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/percentile_rank/percentile_rank_values.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/percentile_ui.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/positive_only.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/positive_rate.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/serial_diff.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/series_agg.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/static.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/std_agg.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/std_deviation.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/std_sibling.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/temporary_unsupported_agg.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/top_hit.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/unsupported_agg.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/aggs/vars.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/annotations_editor.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/color_picker.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/color_picker.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/color_rules.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/color_rules.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/custom_color_picker.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/data_format_picker.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/error.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/icon_select/__snapshots__/icon_select.test.js.snap (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/icon_select/icon_select.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/icon_select/icon_select.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/index_pattern.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/agg_to_component.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/calculate_siblings.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/calculate_siblings.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/charts.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/collection_actions.js (82%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/collection_actions.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/convert_series_to_vars.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/convert_series_to_vars.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_change_handler.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_number_handler.js (92%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_number_handler.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_select_handler.js (86%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_select_handler.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_text_handler.js (92%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_text_handler.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/create_xaxis_formatter.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/detect_ie.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/durations.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/durations.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/get_axis_label_string.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/get_axis_label_string.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/get_default_query_language.js (94%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/get_display_name.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/get_interval.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/new_metric_agg_fn.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/new_series_fn.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/re_id_series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/re_id_series.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/reorder.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/replace_vars.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/replace_vars.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/series_change_handler.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/stacked.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/tick_formatter.js (97%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/lib/tick_formatter.test.js (98%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/markdown_editor.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/no_data.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/_index.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/_panel_config.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/gauge.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/gauge.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/markdown.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/metric.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/table.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/timeseries.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/panel_config/top_n.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/query_bar_wrapper.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/series_config.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/series_drag_handler.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/series_editor.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/split.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/__snapshots__/terms.test.js.snap (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/everything.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/filter.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/filter_items.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/filters.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/group_by_select.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/terms.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/terms.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/splits/unsupported_split.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/svg/bomb_icon.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/svg/fire_icon.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_editor.js (99%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_editor_visualization.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_picker.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/_index.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/_vis_types.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/gauge/series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/gauge/series.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/gauge/vis.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/markdown/_markdown.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/markdown/series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/markdown/vis.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/metric/series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/metric/series.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/metric/vis.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/table/config.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/table/is_sortable.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/table/series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/table/vis.js (99%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/timeseries/config.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/timeseries/series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/timeseries/vis.js (99%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/top_n/series.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_types/top_n/vis.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/vis_with_splits.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/visualization.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/yes_no.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/components/yes_no.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/contexts/form_validation_context.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/contexts/query_input_bar_context.ts (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/contexts/vis_data_context.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/editor_controller.js (94%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/index.scss (85%) rename src/{legacy/core_plugins/vis_type_timeseries/public/legacy.ts => plugins/vis_type_timeseries/public/application/index.ts} (58%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/lib/check_ui_restrictions.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/lib/create_brush_handler.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/lib/create_brush_handler.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/lib/fetch_fields.js (92%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/lib/get_timezone.ts (100%) create mode 100644 src/plugins/vis_type_timeseries/public/application/lib/index.ts rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/lib/set_is_reversed.js (97%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/lib/validate_interval.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/constants/chart.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/constants/icons.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/constants/index.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/lib/active_cursor.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/lib/calc_dimensions.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/lib/calculate_coordinates.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/lib/get_value_by.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/_annotation.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/_gauge.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/_index.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/_metric.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/_top_n.scss (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/annotation.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/gauge.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/gauge_vis.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/metric.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/__mocks__/@elastic/charts.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/decorators/__snapshots__/area_decorator.test.js.snap (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/decorators/__snapshots__/bar_decorator.test.js.snap (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/decorators/area_decorator.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/decorators/area_decorator.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/decorators/bar_decorator.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/decorators/bar_decorator.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/index.js (99%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/model/__snapshots__/charts.test.js.snap (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/model/charts.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/model/charts.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/utils/__snapshots__/series_styles.test.js.snap (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/utils/series_styles.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/utils/series_styles.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/utils/stack_format.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/utils/stack_format.test.js (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/utils/theme.test.ts (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/timeseries/utils/theme.ts (100%) rename src/{legacy/core_plugins/vis_type_timeseries/public => plugins/vis_type_timeseries/public/application}/visualizations/views/top_n.js (100%) rename src/{legacy/core_plugins => plugins}/vis_type_timeseries/public/index.ts (93%) rename src/{legacy/core_plugins => plugins}/vis_type_timeseries/public/metrics_fn.ts (92%) rename src/{legacy/core_plugins => plugins}/vis_type_timeseries/public/metrics_type.ts (85%) rename src/{legacy/core_plugins => plugins}/vis_type_timeseries/public/plugin.ts (89%) rename src/{legacy/core_plugins => plugins}/vis_type_timeseries/public/request_handler.js (95%) rename src/{legacy/core_plugins => plugins}/vis_type_timeseries/public/services.ts (90%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 71d857c1c9041..5e40dc044b97a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,13 +12,13 @@ /src/legacy/core_plugins/kibana/public/visualize/ @elastic/kibana-app /src/legacy/core_plugins/kibana/public/local_application_service/ @elastic/kibana-app /src/legacy/core_plugins/kibana/public/dev_tools/ @elastic/kibana-app -/src/legacy/core_plugins/metrics/ @elastic/kibana-app /src/legacy/core_plugins/vis_type_vislib/ @elastic/kibana-app /src/legacy/core_plugins/vis_type_xy/ @elastic/kibana-app /src/plugins/kibana_legacy/ @elastic/kibana-app /src/plugins/timelion/ @elastic/kibana-app /src/plugins/dashboard/ @elastic/kibana-app /src/plugins/discover/ @elastic/kibana-app +/src/plugins/vis_type_timeseries/ @elastic/kibana-app # Core UI # Exclude tutorials folder for now because they are not owned by Kibana app and most will move out soon diff --git a/src/legacy/core_plugins/vis_type_timeseries/index.ts b/src/legacy/core_plugins/vis_type_timeseries/index.ts deleted file mode 100644 index 596fd5b581a71..0000000000000 --- a/src/legacy/core_plugins/vis_type_timeseries/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { resolve } from 'path'; -import { Legacy } from 'kibana'; - -import { LegacyPluginApi, LegacyPluginInitializer } from '../../../../src/legacy/types'; - -const metricsPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => - new Plugin({ - id: 'metrics', - require: ['kibana', 'elasticsearch'], - publicDir: resolve(__dirname, 'public'), - uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - hacks: [resolve(__dirname, 'public/legacy')], - injectDefaultVars: server => ({}), - }, - config(Joi: any) { - return Joi.object({ - enabled: Joi.boolean().default(true), - chartResolution: Joi.number().default(150), - minimumBucketSize: Joi.number().default(10), - }).default(); - }, - } as Legacy.PluginSpecOptions); - -// eslint-disable-next-line import/no-default-export -export default metricsPluginInitializer; diff --git a/src/legacy/core_plugins/vis_type_timeseries/package.json b/src/legacy/core_plugins/vis_type_timeseries/package.json deleted file mode 100644 index 6b4874dfe6a68..0000000000000 --- a/src/legacy/core_plugins/vis_type_timeseries/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "author": "Chris Cowan", - "name": "metrics", - "version": "kibana" -} - diff --git a/src/plugins/vis_type_timeseries/kibana.json b/src/plugins/vis_type_timeseries/kibana.json index d77f4ac92da16..305e159ac2505 100644 --- a/src/plugins/vis_type_timeseries/kibana.json +++ b/src/plugins/vis_type_timeseries/kibana.json @@ -3,5 +3,7 @@ "version": "8.0.0", "kibanaVersion": "kibana", "server": true, + "ui": true, + "requiredPlugins": ["data", "expressions", "visualizations"], "optionalPlugins": ["usageCollection"] } diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/_mixins.scss b/src/plugins/vis_type_timeseries/public/application/_mixins.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/_mixins.scss rename to src/plugins/vis_type_timeseries/public/application/_mixins.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/_tvb_editor.scss b/src/plugins/vis_type_timeseries/public/application/_tvb_editor.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/_tvb_editor.scss rename to src/plugins/vis_type_timeseries/public/application/_tvb_editor.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/_variables.scss b/src/plugins/vis_type_timeseries/public/application/_variables.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/_variables.scss rename to src/plugins/vis_type_timeseries/public/application/_variables.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_annotations_editor.scss b/src/plugins/vis_type_timeseries/public/application/components/_annotations_editor.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_annotations_editor.scss rename to src/plugins/vis_type_timeseries/public/application/components/_annotations_editor.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_color_picker.scss b/src/plugins/vis_type_timeseries/public/application/components/_color_picker.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_color_picker.scss rename to src/plugins/vis_type_timeseries/public/application/components/_color_picker.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_color_rules.scss b/src/plugins/vis_type_timeseries/public/application/components/_color_rules.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_color_rules.scss rename to src/plugins/vis_type_timeseries/public/application/components/_color_rules.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_custom_color_picker.scss b/src/plugins/vis_type_timeseries/public/application/components/_custom_color_picker.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_custom_color_picker.scss rename to src/plugins/vis_type_timeseries/public/application/components/_custom_color_picker.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_error.scss b/src/plugins/vis_type_timeseries/public/application/components/_error.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_error.scss rename to src/plugins/vis_type_timeseries/public/application/components/_error.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_index.scss b/src/plugins/vis_type_timeseries/public/application/components/_index.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_index.scss rename to src/plugins/vis_type_timeseries/public/application/components/_index.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_markdown_editor.scss b/src/plugins/vis_type_timeseries/public/application/components/_markdown_editor.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_markdown_editor.scss rename to src/plugins/vis_type_timeseries/public/application/components/_markdown_editor.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_no_data.scss b/src/plugins/vis_type_timeseries/public/application/components/_no_data.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_no_data.scss rename to src/plugins/vis_type_timeseries/public/application/components/_no_data.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_series_editor.scss b/src/plugins/vis_type_timeseries/public/application/components/_series_editor.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_series_editor.scss rename to src/plugins/vis_type_timeseries/public/application/components/_series_editor.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_editor.scss b/src/plugins/vis_type_timeseries/public/application/components/_vis_editor.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_editor.scss rename to src/plugins/vis_type_timeseries/public/application/components/_vis_editor.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_editor_visualization.scss b/src/plugins/vis_type_timeseries/public/application/components/_vis_editor_visualization.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_editor_visualization.scss rename to src/plugins/vis_type_timeseries/public/application/components/_vis_editor_visualization.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_picker.scss b/src/plugins/vis_type_timeseries/public/application/components/_vis_picker.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_picker.scss rename to src/plugins/vis_type_timeseries/public/application/components/_vis_picker.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_with_splits.scss b/src/plugins/vis_type_timeseries/public/application/components/_vis_with_splits.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/_vis_with_splits.scss rename to src/plugins/vis_type_timeseries/public/application/components/_vis_with_splits.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/add_delete_buttons.js b/src/plugins/vis_type_timeseries/public/application/components/add_delete_buttons.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/add_delete_buttons.js rename to src/plugins/vis_type_timeseries/public/application/components/add_delete_buttons.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/add_delete_buttons.test.js b/src/plugins/vis_type_timeseries/public/application/components/add_delete_buttons.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/add_delete_buttons.test.js rename to src/plugins/vis_type_timeseries/public/application/components/add_delete_buttons.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/_agg_row.scss b/src/plugins/vis_type_timeseries/public/application/components/aggs/_agg_row.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/_agg_row.scss rename to src/plugins/vis_type_timeseries/public/application/components/aggs/_agg_row.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/_index.scss b/src/plugins/vis_type_timeseries/public/application/components/aggs/_index.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/_index.scss rename to src/plugins/vis_type_timeseries/public/application/components/aggs/_index.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/agg.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/agg.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_row.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/agg_row.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_row.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/agg_row.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/agg_select.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/agg_select.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/agg_select.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/aggs.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/aggs.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/aggs.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/aggs.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/calculation.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/calculation.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/calculation.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/calculation.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/cumulative_sum.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/cumulative_sum.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/cumulative_sum.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/cumulative_sum.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/derivative.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/derivative.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/derivative.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/derivative.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/field_select.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/field_select.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/field_select.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/field_select.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/filter_ratio.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/math.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/math.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/math.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/math.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/metric_select.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/metric_select.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/metric_select.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/metric_select.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/moving_average.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/moving_average.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/moving_average.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/moving_average.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/percentile.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/percentile.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/index.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/index.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/index.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/index.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/multi_value_row.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/multi_value_row.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/multi_value_row.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/multi_value_row.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/percentile_rank.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/percentile_rank.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/percentile_rank.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/percentile_rank.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/percentile_rank_values.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/percentile_rank_values.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_rank/percentile_rank_values.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_rank/percentile_rank_values.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_ui.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_ui.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/percentile_ui.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/percentile_ui.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/positive_only.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/positive_only.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/positive_only.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/positive_only.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/positive_rate.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/positive_rate.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/positive_rate.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/positive_rate.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/serial_diff.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/serial_diff.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/serial_diff.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/serial_diff.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/series_agg.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/series_agg.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/series_agg.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/series_agg.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/static.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/static.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/static.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/static.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/std_agg.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/std_agg.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/std_agg.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/std_agg.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/std_deviation.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/std_deviation.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/std_deviation.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/std_deviation.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/std_sibling.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/std_sibling.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/std_sibling.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/std_sibling.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/temporary_unsupported_agg.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/temporary_unsupported_agg.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/temporary_unsupported_agg.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/temporary_unsupported_agg.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/top_hit.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/top_hit.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/top_hit.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/top_hit.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/unsupported_agg.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/unsupported_agg.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/unsupported_agg.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/unsupported_agg.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/vars.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/vars.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/aggs/vars.js rename to src/plugins/vis_type_timeseries/public/application/components/aggs/vars.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/annotations_editor.js b/src/plugins/vis_type_timeseries/public/application/components/annotations_editor.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/annotations_editor.js rename to src/plugins/vis_type_timeseries/public/application/components/annotations_editor.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/color_picker.js b/src/plugins/vis_type_timeseries/public/application/components/color_picker.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/color_picker.js rename to src/plugins/vis_type_timeseries/public/application/components/color_picker.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/color_picker.test.js b/src/plugins/vis_type_timeseries/public/application/components/color_picker.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/color_picker.test.js rename to src/plugins/vis_type_timeseries/public/application/components/color_picker.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.js b/src/plugins/vis_type_timeseries/public/application/components/color_rules.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.js rename to src/plugins/vis_type_timeseries/public/application/components/color_rules.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.test.js b/src/plugins/vis_type_timeseries/public/application/components/color_rules.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.test.js rename to src/plugins/vis_type_timeseries/public/application/components/color_rules.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/custom_color_picker.js b/src/plugins/vis_type_timeseries/public/application/components/custom_color_picker.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/custom_color_picker.js rename to src/plugins/vis_type_timeseries/public/application/components/custom_color_picker.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/data_format_picker.js b/src/plugins/vis_type_timeseries/public/application/components/data_format_picker.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/data_format_picker.js rename to src/plugins/vis_type_timeseries/public/application/components/data_format_picker.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/error.js b/src/plugins/vis_type_timeseries/public/application/components/error.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/error.js rename to src/plugins/vis_type_timeseries/public/application/components/error.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/__snapshots__/icon_select.test.js.snap b/src/plugins/vis_type_timeseries/public/application/components/icon_select/__snapshots__/icon_select.test.js.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/__snapshots__/icon_select.test.js.snap rename to src/plugins/vis_type_timeseries/public/application/components/icon_select/__snapshots__/icon_select.test.js.snap diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/icon_select.js b/src/plugins/vis_type_timeseries/public/application/components/icon_select/icon_select.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/icon_select.js rename to src/plugins/vis_type_timeseries/public/application/components/icon_select/icon_select.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/icon_select.test.js b/src/plugins/vis_type_timeseries/public/application/components/icon_select/icon_select.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/icon_select/icon_select.test.js rename to src/plugins/vis_type_timeseries/public/application/components/icon_select/icon_select.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/index_pattern.js b/src/plugins/vis_type_timeseries/public/application/components/index_pattern.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/index_pattern.js rename to src/plugins/vis_type_timeseries/public/application/components/index_pattern.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js b/src/plugins/vis_type_timeseries/public/application/components/lib/agg_to_component.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/agg_to_component.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/agg_to_component.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/calculate_siblings.js b/src/plugins/vis_type_timeseries/public/application/components/lib/calculate_siblings.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/calculate_siblings.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/calculate_siblings.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/calculate_siblings.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/calculate_siblings.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/calculate_siblings.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/calculate_siblings.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/charts.js b/src/plugins/vis_type_timeseries/public/application/components/lib/charts.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/charts.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/charts.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/collection_actions.js b/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.js similarity index 82% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/collection_actions.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.js index 79cbe98b3d3db..3eae18111bb4d 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/collection_actions.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.js @@ -18,7 +18,6 @@ */ import uuid from 'uuid'; -import _ from 'lodash'; const newFn = () => ({ id: uuid.v1() }); @@ -30,9 +29,7 @@ export function handleChange(props, doc) { if (row.id === doc.id) return doc; return row; }); - if (_.isFunction(props.onChange)) { - props.onChange(_.assign({}, model, part)); - } + props.onChange?.({ ...model, ...part }); } export function handleDelete(props, doc) { @@ -40,20 +37,15 @@ export function handleDelete(props, doc) { const collection = model[name] || []; const part = {}; part[name] = collection.filter(row => row.id !== doc.id); - if (_.isFunction(props.onChange)) { - props.onChange(_.assign({}, model, part)); - } + props.onChange?.({ ...model, ...part }); } export function handleAdd(props, fn = newFn) { - if (!_.isFunction(fn)) fn = newFn; const { model, name } = props; const collection = model[name] || []; const part = {}; part[name] = collection.concat([fn()]); - if (_.isFunction(props.onChange)) { - props.onChange(_.assign({}, model, part)); - } + props.onChange?.({ ...model, ...part }); } export const collectionActions = { handleAdd, handleDelete, handleChange }; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/collection_actions.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/collection_actions.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/convert_series_to_vars.js b/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/convert_series_to_vars.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/convert_series_to_vars.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/convert_series_to_vars.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_change_handler.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_change_handler.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_change_handler.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_change_handler.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_number_handler.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.js similarity index 92% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_number_handler.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.js index fd432add43295..3bc8fd87f73dd 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_number_handler.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.js @@ -25,8 +25,6 @@ export const createNumberHandler = handleChange => { if (!detectIE() || e.keyCode === 13) e.preventDefault(); const value = Number(_.get(e, 'target.value', defaultValue)); - if (_.isFunction(handleChange)) { - return handleChange({ [name]: value }); - } + return handleChange?.({ [name]: value }); }; }; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_number_handler.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_number_handler.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_select_handler.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.js similarity index 86% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_select_handler.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.js index 30937b97d353f..cfc6a4dc57871 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_select_handler.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.js @@ -21,10 +21,8 @@ import _ from 'lodash'; export const createSelectHandler = handleChange => { return name => selectedOptions => { - if (_.isFunction(handleChange)) { - return handleChange({ - [name]: _.get(selectedOptions, '[0].value', null), - }); - } + return handleChange?.({ + [name]: _.get(selectedOptions, '[0].value', null), + }); }; }; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_select_handler.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_select_handler.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_text_handler.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.js similarity index 92% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_text_handler.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.js index 8e2624488d954..82cc071b59d51 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_text_handler.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.js @@ -26,8 +26,6 @@ export const createTextHandler = handleChange => { if (!detectIE() || e.keyCode === 13) e.preventDefault(); const value = _.get(e, 'target.value', defaultValue); - if (_.isFunction(handleChange)) { - return handleChange({ [name]: value }); - } + return handleChange?.({ [name]: value }); }; }; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_text_handler.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_text_handler.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_xaxis_formatter.js b/src/plugins/vis_type_timeseries/public/application/components/lib/create_xaxis_formatter.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/create_xaxis_formatter.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/create_xaxis_formatter.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/detect_ie.js b/src/plugins/vis_type_timeseries/public/application/components/lib/detect_ie.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/detect_ie.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/detect_ie.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/durations.js b/src/plugins/vis_type_timeseries/public/application/components/lib/durations.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/durations.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/durations.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/durations.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/durations.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/durations.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/durations.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_axis_label_string.js b/src/plugins/vis_type_timeseries/public/application/components/lib/get_axis_label_string.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_axis_label_string.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/get_axis_label_string.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_axis_label_string.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/get_axis_label_string.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_axis_label_string.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/get_axis_label_string.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_default_query_language.js b/src/plugins/vis_type_timeseries/public/application/components/lib/get_default_query_language.js similarity index 94% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_default_query_language.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/get_default_query_language.js index 26723da5ab5c9..972f937ad109d 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_default_query_language.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/get_default_query_language.js @@ -17,7 +17,7 @@ * under the License. */ -import { getUISettings } from '../../services'; +import { getUISettings } from '../../../services'; export function getDefaultQueryLanguage() { return getUISettings().get('search:queryLanguage'); diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_display_name.js b/src/plugins/vis_type_timeseries/public/application/components/lib/get_display_name.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_display_name.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/get_display_name.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_interval.js b/src/plugins/vis_type_timeseries/public/application/components/lib/get_interval.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/get_interval.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/get_interval.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/new_metric_agg_fn.js b/src/plugins/vis_type_timeseries/public/application/components/lib/new_metric_agg_fn.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/new_metric_agg_fn.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/new_metric_agg_fn.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/new_series_fn.js b/src/plugins/vis_type_timeseries/public/application/components/lib/new_series_fn.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/new_series_fn.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/new_series_fn.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/re_id_series.js b/src/plugins/vis_type_timeseries/public/application/components/lib/re_id_series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/re_id_series.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/re_id_series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/re_id_series.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/re_id_series.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/re_id_series.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/re_id_series.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/reorder.js b/src/plugins/vis_type_timeseries/public/application/components/lib/reorder.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/reorder.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/reorder.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/replace_vars.js b/src/plugins/vis_type_timeseries/public/application/components/lib/replace_vars.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/replace_vars.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/replace_vars.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/replace_vars.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/replace_vars.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/replace_vars.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/replace_vars.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/series_change_handler.js b/src/plugins/vis_type_timeseries/public/application/components/lib/series_change_handler.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/series_change_handler.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/series_change_handler.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/stacked.js b/src/plugins/vis_type_timeseries/public/application/components/lib/stacked.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/stacked.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/stacked.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/tick_formatter.js b/src/plugins/vis_type_timeseries/public/application/components/lib/tick_formatter.js similarity index 97% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/tick_formatter.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/tick_formatter.js index 3ab8e0f6b885e..fd316e66a16fb 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/tick_formatter.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/tick_formatter.js @@ -20,7 +20,7 @@ import handlebars from 'handlebars/dist/handlebars'; import { isNumber } from 'lodash'; import { inputFormats, outputFormats, isDuration } from '../lib/durations'; -import { getFieldFormats } from '../../services'; +import { getFieldFormats } from '../../../services'; export const createTickFormatter = (format = '0,0.[00]', template, getConfig = null) => { const fieldFormats = getFieldFormats(); diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/tick_formatter.test.js b/src/plugins/vis_type_timeseries/public/application/components/lib/tick_formatter.test.js similarity index 98% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/lib/tick_formatter.test.js rename to src/plugins/vis_type_timeseries/public/application/components/lib/tick_formatter.test.js index e87cba126bb46..ee10b254a9e15 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/lib/tick_formatter.test.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/tick_formatter.test.js @@ -19,7 +19,7 @@ import { createTickFormatter } from './tick_formatter'; import { getFieldFormatsRegistry } from '../../../../../../test_utils/public/stub_field_formats'; -import { setFieldFormats } from '../../services'; +import { setFieldFormats } from '../../../services'; const mockUiSettings = { get: item => { diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/markdown_editor.js b/src/plugins/vis_type_timeseries/public/application/components/markdown_editor.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/markdown_editor.js rename to src/plugins/vis_type_timeseries/public/application/components/markdown_editor.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/no_data.js b/src/plugins/vis_type_timeseries/public/application/components/no_data.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/no_data.js rename to src/plugins/vis_type_timeseries/public/application/components/no_data.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/_index.scss b/src/plugins/vis_type_timeseries/public/application/components/panel_config/_index.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/_index.scss rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/_index.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/_panel_config.scss b/src/plugins/vis_type_timeseries/public/application/components/panel_config/_panel_config.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/_panel_config.scss rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/_panel_config.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/gauge.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/gauge.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/gauge.test.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/gauge.test.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/markdown.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/markdown.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/markdown.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/markdown.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/metric.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/metric.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/metric.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/metric.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/table.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/table.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/table.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/table.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/timeseries.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/timeseries.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/top_n.js b/src/plugins/vis_type_timeseries/public/application/components/panel_config/top_n.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/panel_config/top_n.js rename to src/plugins/vis_type_timeseries/public/application/components/panel_config/top_n.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/query_bar_wrapper.js b/src/plugins/vis_type_timeseries/public/application/components/query_bar_wrapper.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/query_bar_wrapper.js rename to src/plugins/vis_type_timeseries/public/application/components/query_bar_wrapper.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/series.js b/src/plugins/vis_type_timeseries/public/application/components/series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/series.js rename to src/plugins/vis_type_timeseries/public/application/components/series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/series_config.js b/src/plugins/vis_type_timeseries/public/application/components/series_config.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/series_config.js rename to src/plugins/vis_type_timeseries/public/application/components/series_config.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/series_drag_handler.js b/src/plugins/vis_type_timeseries/public/application/components/series_drag_handler.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/series_drag_handler.js rename to src/plugins/vis_type_timeseries/public/application/components/series_drag_handler.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/series_editor.js b/src/plugins/vis_type_timeseries/public/application/components/series_editor.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/series_editor.js rename to src/plugins/vis_type_timeseries/public/application/components/series_editor.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/split.js b/src/plugins/vis_type_timeseries/public/application/components/split.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/split.js rename to src/plugins/vis_type_timeseries/public/application/components/split.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/__snapshots__/terms.test.js.snap b/src/plugins/vis_type_timeseries/public/application/components/splits/__snapshots__/terms.test.js.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/__snapshots__/terms.test.js.snap rename to src/plugins/vis_type_timeseries/public/application/components/splits/__snapshots__/terms.test.js.snap diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/everything.js b/src/plugins/vis_type_timeseries/public/application/components/splits/everything.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/everything.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/everything.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/filter.js b/src/plugins/vis_type_timeseries/public/application/components/splits/filter.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/filter.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/filter.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/filter_items.js b/src/plugins/vis_type_timeseries/public/application/components/splits/filter_items.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/filter_items.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/filter_items.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/filters.js b/src/plugins/vis_type_timeseries/public/application/components/splits/filters.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/filters.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/filters.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/group_by_select.js b/src/plugins/vis_type_timeseries/public/application/components/splits/group_by_select.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/group_by_select.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/group_by_select.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/terms.js b/src/plugins/vis_type_timeseries/public/application/components/splits/terms.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/terms.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/terms.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/terms.test.js b/src/plugins/vis_type_timeseries/public/application/components/splits/terms.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/terms.test.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/terms.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/splits/unsupported_split.js b/src/plugins/vis_type_timeseries/public/application/components/splits/unsupported_split.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/splits/unsupported_split.js rename to src/plugins/vis_type_timeseries/public/application/components/splits/unsupported_split.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/svg/bomb_icon.js b/src/plugins/vis_type_timeseries/public/application/components/svg/bomb_icon.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/svg/bomb_icon.js rename to src/plugins/vis_type_timeseries/public/application/components/svg/bomb_icon.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/svg/fire_icon.js b/src/plugins/vis_type_timeseries/public/application/components/svg/fire_icon.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/svg/fire_icon.js rename to src/plugins/vis_type_timeseries/public/application/components/svg/fire_icon.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js b/src/plugins/vis_type_timeseries/public/application/components/vis_editor.js similarity index 99% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_editor.js index b4845696fc8c0..7075e86eb56bf 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_editor.js @@ -30,7 +30,7 @@ import { createBrushHandler } from '../lib/create_brush_handler'; import { fetchFields } from '../lib/fetch_fields'; import { extractIndexPatterns } from '../../../../../plugins/vis_type_timeseries/common/extract_index_patterns'; import { esKuery } from '../../../../../plugins/data/public'; -import { getSavedObjectsClient, getUISettings, getDataStart, getCoreStart } from '../services'; +import { getSavedObjectsClient, getUISettings, getDataStart, getCoreStart } from '../../services'; import { CoreStartContextProvider } from '../contexts/query_input_bar_context'; import { KibanaContextProvider } from '../../../../../plugins/kibana_react/public'; @@ -96,7 +96,7 @@ export class VisEditor extends Component { return true; }; - handleChange = async partialModel => { + handleChange = partialModel => { if (isEmpty(partialModel)) { return; } diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor_visualization.js b/src/plugins/vis_type_timeseries/public/application/components/vis_editor_visualization.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor_visualization.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_editor_visualization.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_picker.js b/src/plugins/vis_type_timeseries/public/application/components/vis_picker.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_picker.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_picker.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/_index.scss b/src/plugins/vis_type_timeseries/public/application/components/vis_types/_index.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/_index.scss rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/_index.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/_vis_types.scss b/src/plugins/vis_type_timeseries/public/application/components/vis_types/_vis_types.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/_vis_types.scss rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/_vis_types.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/gauge/series.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/gauge/series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/gauge/series.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/gauge/series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/gauge/series.test.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/gauge/series.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/gauge/series.test.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/gauge/series.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/gauge/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/gauge/vis.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/gauge/vis.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/gauge/vis.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/markdown/_markdown.scss b/src/plugins/vis_type_timeseries/public/application/components/vis_types/markdown/_markdown.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/markdown/_markdown.scss rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/markdown/_markdown.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/markdown/series.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/markdown/series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/markdown/series.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/markdown/series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/markdown/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/markdown/vis.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/markdown/vis.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/markdown/vis.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/metric/series.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/metric/series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/metric/series.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/metric/series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/metric/series.test.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/metric/series.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/metric/series.test.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/metric/series.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/metric/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/metric/vis.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/metric/vis.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/metric/vis.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/config.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/config.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/config.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/table/config.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/is_sortable.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/is_sortable.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/is_sortable.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/table/is_sortable.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/series.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/series.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/table/series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js similarity index 99% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/vis.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js index 1fe9358cbfea9..c6f1db149928c 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/table/vis.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js @@ -27,7 +27,7 @@ import { EuiToolTip, EuiIcon } from '@elastic/eui'; import { replaceVars } from '../../lib/replace_vars'; import { fieldFormats } from '../../../../../../../plugins/data/public'; import { FormattedMessage } from '@kbn/i18n/react'; -import { getFieldFormats } from '../../../services'; +import { getFieldFormats } from '../../../../services'; import { METRIC_TYPES } from '../../../../../../../plugins/vis_type_timeseries/common/metric_types'; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/timeseries/config.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/config.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/timeseries/config.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/config.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/timeseries/series.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/timeseries/series.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/timeseries/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js similarity index 99% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/timeseries/vis.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js index f559bc38b6c58..1004f7ee96a54 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/timeseries/vis.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_types/timeseries/vis.js @@ -34,7 +34,7 @@ import { getInterval } from '../../lib/get_interval'; import { areFieldsDifferent } from '../../lib/charts'; import { createXaxisFormatter } from '../../lib/create_xaxis_formatter'; import { STACKED_OPTIONS } from '../../../visualizations/constants'; -import { getCoreStart, getUISettings } from '../../../services'; +import { getCoreStart, getUISettings } from '../../../../services'; export class TimeseriesVisualization extends Component { static propTypes = { diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/top_n/series.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/top_n/series.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/top_n/series.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/top_n/series.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/top_n/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/top_n/vis.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_types/top_n/vis.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_types/top_n/vis.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_with_splits.js b/src/plugins/vis_type_timeseries/public/application/components/vis_with_splits.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/vis_with_splits.js rename to src/plugins/vis_type_timeseries/public/application/components/vis_with_splits.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/visualization.js b/src/plugins/vis_type_timeseries/public/application/components/visualization.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/visualization.js rename to src/plugins/vis_type_timeseries/public/application/components/visualization.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/yes_no.js b/src/plugins/vis_type_timeseries/public/application/components/yes_no.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/yes_no.js rename to src/plugins/vis_type_timeseries/public/application/components/yes_no.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/yes_no.test.js b/src/plugins/vis_type_timeseries/public/application/components/yes_no.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/components/yes_no.test.js rename to src/plugins/vis_type_timeseries/public/application/components/yes_no.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/contexts/form_validation_context.js b/src/plugins/vis_type_timeseries/public/application/contexts/form_validation_context.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/contexts/form_validation_context.js rename to src/plugins/vis_type_timeseries/public/application/contexts/form_validation_context.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/contexts/query_input_bar_context.ts b/src/plugins/vis_type_timeseries/public/application/contexts/query_input_bar_context.ts similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/contexts/query_input_bar_context.ts rename to src/plugins/vis_type_timeseries/public/application/contexts/query_input_bar_context.ts diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/contexts/vis_data_context.js b/src/plugins/vis_type_timeseries/public/application/contexts/vis_data_context.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/contexts/vis_data_context.js rename to src/plugins/vis_type_timeseries/public/application/contexts/vis_data_context.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/editor_controller.js b/src/plugins/vis_type_timeseries/public/application/editor_controller.js similarity index 94% rename from src/legacy/core_plugins/vis_type_timeseries/public/editor_controller.js rename to src/plugins/vis_type_timeseries/public/application/editor_controller.js index 16a6348712065..af50d3a06d1fc 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/editor_controller.js +++ b/src/plugins/vis_type_timeseries/public/application/editor_controller.js @@ -20,7 +20,8 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { fetchIndexPatternFields } from './lib/fetch_fields'; -import { getSavedObjectsClient, getUISettings, getI18n } from './services'; +import { getSavedObjectsClient, getUISettings, getI18n } from '../services'; +import { VisEditor } from './components/vis_editor'; export class EditorController { constructor(el, vis, eventEmitter, embeddableHandler) { @@ -55,19 +56,14 @@ export class EditorController { this.state.isLoaded = true; }; - getComponent = () => { - return this.state.vis.type.editorConfig.component; - }; - async render(params) { - const Component = this.getComponent(); const I18nContext = getI18n().Context; !this.state.isLoaded && (await this.fetchDefaultParams()); render( - = { - expressions: npSetup.plugins.expressions, - visualizations: npSetup.plugins.visualizations, -}; - -const pluginInstance = plugin({} as PluginInitializerContext); - -export const setup = pluginInstance.setup(npSetup.core, plugins); -export const start = pluginInstance.start(npStart.core, npStart.plugins); +// @ts-ignore +export { EditorController } from './editor_controller'; +export * from './lib'; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/lib/check_ui_restrictions.js b/src/plugins/vis_type_timeseries/public/application/lib/check_ui_restrictions.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/lib/check_ui_restrictions.js rename to src/plugins/vis_type_timeseries/public/application/lib/check_ui_restrictions.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/lib/create_brush_handler.js b/src/plugins/vis_type_timeseries/public/application/lib/create_brush_handler.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/lib/create_brush_handler.js rename to src/plugins/vis_type_timeseries/public/application/lib/create_brush_handler.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/lib/create_brush_handler.test.js b/src/plugins/vis_type_timeseries/public/application/lib/create_brush_handler.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/lib/create_brush_handler.test.js rename to src/plugins/vis_type_timeseries/public/application/lib/create_brush_handler.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/lib/fetch_fields.js b/src/plugins/vis_type_timeseries/public/application/lib/fetch_fields.js similarity index 92% rename from src/legacy/core_plugins/vis_type_timeseries/public/lib/fetch_fields.js rename to src/plugins/vis_type_timeseries/public/application/lib/fetch_fields.js index 9c64d0da2d88a..f986e300ac5a5 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/lib/fetch_fields.js +++ b/src/plugins/vis_type_timeseries/public/application/lib/fetch_fields.js @@ -17,8 +17,8 @@ * under the License. */ import { i18n } from '@kbn/i18n'; -import { extractIndexPatterns } from '../../../../../plugins/vis_type_timeseries/common/extract_index_patterns'; -import { getCoreStart } from '../services'; +import { extractIndexPatterns } from '../../../common/extract_index_patterns'; +import { getCoreStart } from '../../services'; export async function fetchFields(indexPatterns = ['*']) { const patterns = Array.isArray(indexPatterns) ? indexPatterns : [indexPatterns]; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/lib/get_timezone.ts b/src/plugins/vis_type_timeseries/public/application/lib/get_timezone.ts similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/lib/get_timezone.ts rename to src/plugins/vis_type_timeseries/public/application/lib/get_timezone.ts diff --git a/src/plugins/vis_type_timeseries/public/application/lib/index.ts b/src/plugins/vis_type_timeseries/public/application/lib/index.ts new file mode 100644 index 0000000000000..2362762df152c --- /dev/null +++ b/src/plugins/vis_type_timeseries/public/application/lib/index.ts @@ -0,0 +1,22 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// @ts-ignore +export { validateInterval } from './validate_interval'; +export { getTimezone } from './get_timezone'; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/lib/set_is_reversed.js b/src/plugins/vis_type_timeseries/public/application/lib/set_is_reversed.js similarity index 97% rename from src/legacy/core_plugins/vis_type_timeseries/public/lib/set_is_reversed.js rename to src/plugins/vis_type_timeseries/public/application/lib/set_is_reversed.js index 9f66bcd161916..070cf34c879d2 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/lib/set_is_reversed.js +++ b/src/plugins/vis_type_timeseries/public/application/lib/set_is_reversed.js @@ -18,7 +18,7 @@ */ import color from 'color'; -import { getUISettings } from '../services'; +import { getUISettings } from '../../services'; const isDarkTheme = () => getUISettings().get('theme:darkMode'); diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/lib/validate_interval.js b/src/plugins/vis_type_timeseries/public/application/lib/validate_interval.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/lib/validate_interval.js rename to src/plugins/vis_type_timeseries/public/application/lib/validate_interval.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/constants/chart.js b/src/plugins/vis_type_timeseries/public/application/visualizations/constants/chart.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/constants/chart.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/constants/chart.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/constants/icons.js b/src/plugins/vis_type_timeseries/public/application/visualizations/constants/icons.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/constants/icons.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/constants/icons.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/constants/index.js b/src/plugins/vis_type_timeseries/public/application/visualizations/constants/index.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/constants/index.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/constants/index.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/active_cursor.js b/src/plugins/vis_type_timeseries/public/application/visualizations/lib/active_cursor.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/active_cursor.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/lib/active_cursor.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/calc_dimensions.js b/src/plugins/vis_type_timeseries/public/application/visualizations/lib/calc_dimensions.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/calc_dimensions.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/lib/calc_dimensions.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/calculate_coordinates.js b/src/plugins/vis_type_timeseries/public/application/visualizations/lib/calculate_coordinates.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/calculate_coordinates.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/lib/calculate_coordinates.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/get_value_by.js b/src/plugins/vis_type_timeseries/public/application/visualizations/lib/get_value_by.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/lib/get_value_by.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/lib/get_value_by.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_annotation.scss b/src/plugins/vis_type_timeseries/public/application/visualizations/views/_annotation.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_annotation.scss rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/_annotation.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_gauge.scss b/src/plugins/vis_type_timeseries/public/application/visualizations/views/_gauge.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_gauge.scss rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/_gauge.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_index.scss b/src/plugins/vis_type_timeseries/public/application/visualizations/views/_index.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_index.scss rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/_index.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_metric.scss b/src/plugins/vis_type_timeseries/public/application/visualizations/views/_metric.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_metric.scss rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/_metric.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_top_n.scss b/src/plugins/vis_type_timeseries/public/application/visualizations/views/_top_n.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/_top_n.scss rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/_top_n.scss diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/annotation.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/annotation.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/annotation.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/annotation.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/gauge.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/gauge.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/gauge.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/gauge.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/gauge_vis.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/gauge_vis.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/gauge_vis.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/gauge_vis.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/metric.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/metric.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/metric.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/metric.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/__mocks__/@elastic/charts.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/__mocks__/@elastic/charts.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/__mocks__/@elastic/charts.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/__mocks__/@elastic/charts.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/__snapshots__/area_decorator.test.js.snap b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/__snapshots__/area_decorator.test.js.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/__snapshots__/area_decorator.test.js.snap rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/__snapshots__/area_decorator.test.js.snap diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/__snapshots__/bar_decorator.test.js.snap b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/__snapshots__/bar_decorator.test.js.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/__snapshots__/bar_decorator.test.js.snap rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/__snapshots__/bar_decorator.test.js.snap diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/area_decorator.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/area_decorator.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/area_decorator.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/area_decorator.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/area_decorator.test.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/area_decorator.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/area_decorator.test.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/area_decorator.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/bar_decorator.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/bar_decorator.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/bar_decorator.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/bar_decorator.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/bar_decorator.test.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/bar_decorator.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/decorators/bar_decorator.test.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/decorators/bar_decorator.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/index.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js similarity index 99% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/index.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js index 3ce3aae2649e1..b1c3c7ac6b67a 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/index.js +++ b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js @@ -33,7 +33,7 @@ import { import { EuiIcon } from '@elastic/eui'; import { getTimezone } from '../../../lib/get_timezone'; import { eventBus, ACTIVE_CURSOR } from '../../lib/active_cursor'; -import { getUISettings } from '../../../services'; +import { getUISettings } from '../../../../services'; import { GRID_LINE_CONFIG, ICON_TYPES_MAP, STACKED_OPTIONS } from '../../constants'; import { AreaSeriesDecorator } from './decorators/area_decorator'; import { BarSeriesDecorator } from './decorators/bar_decorator'; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/model/__snapshots__/charts.test.js.snap b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/model/__snapshots__/charts.test.js.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/model/__snapshots__/charts.test.js.snap rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/model/__snapshots__/charts.test.js.snap diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/model/charts.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/model/charts.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/model/charts.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/model/charts.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/model/charts.test.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/model/charts.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/model/charts.test.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/model/charts.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/__snapshots__/series_styles.test.js.snap b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/__snapshots__/series_styles.test.js.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/__snapshots__/series_styles.test.js.snap rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/__snapshots__/series_styles.test.js.snap diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/series_styles.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/series_styles.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/series_styles.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/series_styles.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/series_styles.test.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/series_styles.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/series_styles.test.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/series_styles.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/stack_format.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/stack_format.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/stack_format.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/stack_format.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/stack_format.test.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/stack_format.test.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/stack_format.test.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/stack_format.test.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/theme.test.ts b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/theme.test.ts similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/theme.test.ts rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/theme.test.ts diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/theme.ts b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/theme.ts similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/timeseries/utils/theme.ts rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/utils/theme.ts diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/top_n.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/top_n.js similarity index 100% rename from src/legacy/core_plugins/vis_type_timeseries/public/visualizations/views/top_n.js rename to src/plugins/vis_type_timeseries/public/application/visualizations/views/top_n.js diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/index.ts b/src/plugins/vis_type_timeseries/public/index.ts similarity index 93% rename from src/legacy/core_plugins/vis_type_timeseries/public/index.ts rename to src/plugins/vis_type_timeseries/public/index.ts index 16b099ba16ae9..fbf4a81b6ad1b 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/index.ts +++ b/src/plugins/vis_type_timeseries/public/index.ts @@ -17,7 +17,7 @@ * under the License. */ -import { PluginInitializerContext } from '../../../../core/public'; +import { PluginInitializerContext } from '../../../core/public'; import { MetricsPlugin as Plugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/metrics_fn.ts b/src/plugins/vis_type_timeseries/public/metrics_fn.ts similarity index 92% rename from src/legacy/core_plugins/vis_type_timeseries/public/metrics_fn.ts rename to src/plugins/vis_type_timeseries/public/metrics_fn.ts index 1f9cbecc2a354..008b13cce6565 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/metrics_fn.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_fn.ts @@ -19,12 +19,8 @@ import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { - ExpressionFunctionDefinition, - KibanaContext, - Render, -} from '../../../../plugins/expressions/public'; -import { PersistedState } from '../../../../plugins/visualizations/public'; +import { ExpressionFunctionDefinition, KibanaContext, Render } from '../../expressions/public'; +import { PersistedState } from '../../visualizations/public'; // @ts-ignore import { metricsRequestHandler } from './request_handler'; diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/metrics_type.ts b/src/plugins/vis_type_timeseries/public/metrics_type.ts similarity index 85% rename from src/legacy/core_plugins/vis_type_timeseries/public/metrics_type.ts rename to src/plugins/vis_type_timeseries/public/metrics_type.ts index 1db35c406eb13..f83881a619a59 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/metrics_type.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_type.ts @@ -21,11 +21,10 @@ import { i18n } from '@kbn/i18n'; // @ts-ignore import { metricsRequestHandler } from './request_handler'; +import { EditorController } from './application'; // @ts-ignore -import { EditorController } from './editor_controller'; -// @ts-ignore -import { PANEL_TYPES } from '../../../../plugins/vis_type_timeseries/common/panel_types'; -import { defaultFeedbackMessage } from '../../../../plugins/kibana_utils/public'; +import { PANEL_TYPES } from '../common/panel_types'; +import { defaultFeedbackMessage } from '../../kibana_utils/public'; export const metricsVisDefinition = { name: 'metrics', @@ -69,12 +68,9 @@ export const metricsVisDefinition = { show_legend: 1, show_grid: 1, }, - component: require('./components/vis_editor').VisEditor, + component: require('./application/components/vis_editor').VisEditor, }, editor: EditorController, - editorConfig: { - component: require('./components/vis_editor').VisEditor, - }, options: { showQueryBar: false, showFilterBar: false, diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/plugin.ts b/src/plugins/vis_type_timeseries/public/plugin.ts similarity index 89% rename from src/legacy/core_plugins/vis_type_timeseries/public/plugin.ts rename to src/plugins/vis_type_timeseries/public/plugin.ts index 0310ecf6cfd87..e6c92c31450e7 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/plugin.ts +++ b/src/plugins/vis_type_timeseries/public/plugin.ts @@ -16,9 +16,12 @@ * specific language governing permissions and limitations * under the License. */ + +import './application/index.scss'; + import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'kibana/public'; -import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; +import { Plugin as ExpressionsPublicPlugin } from '../../expressions/public'; +import { VisualizationsSetup } from '../../visualizations/public'; import { createMetricsFn } from './metrics_fn'; import { metricsVisDefinition } from './metrics_type'; @@ -30,7 +33,7 @@ import { setCoreStart, setDataStart, } from './services'; -import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { DataPublicPluginStart } from '../../data/public'; /** @internal */ export interface MetricsPluginSetupDependencies { diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/request_handler.js b/src/plugins/vis_type_timeseries/public/request_handler.js similarity index 95% rename from src/legacy/core_plugins/vis_type_timeseries/public/request_handler.js rename to src/plugins/vis_type_timeseries/public/request_handler.js index 2cac1567a6eb7..bd6c6d9553930 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/request_handler.js +++ b/src/plugins/vis_type_timeseries/public/request_handler.js @@ -17,8 +17,7 @@ * under the License. */ -import { validateInterval } from './lib/validate_interval'; -import { getTimezone } from './lib/get_timezone'; +import { getTimezone, validateInterval } from './application'; import { getUISettings, getDataStart, getCoreStart } from './services'; export const metricsRequestHandler = async ({ diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/services.ts b/src/plugins/vis_type_timeseries/public/services.ts similarity index 90% rename from src/legacy/core_plugins/vis_type_timeseries/public/services.ts rename to src/plugins/vis_type_timeseries/public/services.ts index 64ee897247b89..d93a376584eac 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/services.ts +++ b/src/plugins/vis_type_timeseries/public/services.ts @@ -18,8 +18,8 @@ */ import { I18nStart, SavedObjectsStart, IUiSettingsClient, CoreStart } from 'src/core/public'; -import { createGetterSetter } from '../../../../plugins/kibana_utils/public'; -import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { createGetterSetter } from '../../kibana_utils/public'; +import { DataPublicPluginStart } from '../../data/public'; export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); From 3342f9e80e982dd0e4cc6d13c115f2de9ef2f3b7 Mon Sep 17 00:00:00 2001 From: Nicolas Ruflin Date: Wed, 15 Apr 2020 16:44:14 +0200 Subject: [PATCH 21/80] [Ingest] Add details to indexing strategy around allow chars (#63560) Add some recommendation around what chars should be used if a dataset or namespace contains a `-`. --- docs/ingest_manager/index.asciidoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/ingest_manager/index.asciidoc b/docs/ingest_manager/index.asciidoc index 1254f412e14c5..22afa88c919e4 100644 --- a/docs/ingest_manager/index.asciidoc +++ b/docs/ingest_manager/index.asciidoc @@ -113,7 +113,7 @@ Ingest Management enforces an indexing strategy to allow the system to automatic {type}-{dataset}-{namespace} ``` -The `{type}` can be `logs` or `metrics`. The `{namespace}` is the part where the user can use free form. The only two requirement are that it has only characters allowed in an Elasticsearch index name and does NOT contain a `-`. The `dataset` is defined by the data that is indexed. The same requirements as for the namespace apply. It is expected that the fields for type, namespace and dataset are part of each event and are constant keywords. +The `{type}` can be `logs` or `metrics`. The `{namespace}` is the part where the user can use free form. The only two requirement are that it has only characters allowed in an Elasticsearch index name and does NOT contain a `-`. The `dataset` is defined by the data that is indexed. The same requirements as for the namespace apply. It is expected that the fields for type, namespace and dataset are part of each event and are constant keywords. If there is a dataset or a namespace with a `-` inside, it is recommended to replace it either by a `.` or a `_`. Note: More `{type}`s might be added in the future like `apm` and `endpoint`. @@ -126,6 +126,8 @@ This indexing strategy has a few advantages: * Having a global metrics and logs template, allows to create new indices on demand which still follow the convention. This is common in the case of k8s as an example. * Constant keywords allow to narrow down the indices we need to access for querying very efficiently. This is especially relevant in environments which a large number of indices or with indices on slower nodes. +Overall it creates smaller indices in size, makes querying more efficient and allows users to define their own naming parts in namespace and still benefiting from all features that can be built on top of the indexing startegy. + === Ingest Pipeline The ingest pipelines for a specific dataset will have the following naming scheme: From 6fc4840baef492bf2085ae55a8215d4906a53430 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 15 Apr 2020 15:48:04 +0100 Subject: [PATCH 22/80] [ML] Changing file data visualizer max upload setting to string (#63502) --- .../ml/common/constants/file_datavisualizer.ts | 6 ++++-- x-pack/plugins/ml/common/types/ml_config.ts | 4 ++-- .../file_based/components/utils/utils.ts | 12 +++++++++--- .../plugins/ml/server/routes/file_data_visualizer.ts | 6 +++--- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/ml/common/constants/file_datavisualizer.ts b/x-pack/plugins/ml/common/constants/file_datavisualizer.ts index 675247af2db99..7e18b36fd7bab 100644 --- a/x-pack/plugins/ml/common/constants/file_datavisualizer.ts +++ b/x-pack/plugins/ml/common/constants/file_datavisualizer.ts @@ -4,8 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -export const MAX_BYTES = 104857600; // 100MB -export const ABSOLUTE_MAX_BYTES = 1073741274; // 1GB +export const MAX_FILE_SIZE = '100MB'; +export const MAX_FILE_SIZE_BYTES = 104857600; // 100MB + +export const ABSOLUTE_MAX_FILE_SIZE_BYTES = 1073741274; // 1GB export const FILE_SIZE_DISPLAY_FORMAT = '0,0.[0] b'; // Value to use in the Elasticsearch index mapping meta data to identify the diff --git a/x-pack/plugins/ml/common/types/ml_config.ts b/x-pack/plugins/ml/common/types/ml_config.ts index 8fd9fd22bad8a..f2ddadccb2170 100644 --- a/x-pack/plugins/ml/common/types/ml_config.ts +++ b/x-pack/plugins/ml/common/types/ml_config.ts @@ -5,11 +5,11 @@ */ import { schema, TypeOf } from '@kbn/config-schema'; -import { MAX_BYTES } from '../constants/file_datavisualizer'; +import { MAX_FILE_SIZE } from '../constants/file_datavisualizer'; export const configSchema = schema.object({ file_data_visualizer: schema.object({ - max_file_size_bytes: schema.number({ defaultValue: MAX_BYTES }), + max_file_size: schema.string({ defaultValue: MAX_FILE_SIZE }), }), }); diff --git a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts index ecef01aae0519..7b6464570e55c 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts +++ b/x-pack/plugins/ml/public/application/datavisualizer/file_based/components/utils/utils.ts @@ -9,7 +9,8 @@ import numeral from '@elastic/numeral'; import { ml } from '../../../../services/ml_api_service'; import { AnalysisResult, InputOverrides } from '../../../../../../common/types/file_datavisualizer'; import { - ABSOLUTE_MAX_BYTES, + MAX_FILE_SIZE_BYTES, + ABSOLUTE_MAX_FILE_SIZE_BYTES, FILE_SIZE_DISPLAY_FORMAT, } from '../../../../../../common/constants/file_datavisualizer'; import { getMlConfig } from '../../../../util/dependency_cache'; @@ -61,8 +62,13 @@ export function readFile(file: File) { } export function getMaxBytes() { - const maxBytes = getMlConfig().file_data_visualizer.max_file_size_bytes; - return maxBytes < ABSOLUTE_MAX_BYTES ? maxBytes : ABSOLUTE_MAX_BYTES; + const maxFileSize = getMlConfig().file_data_visualizer.max_file_size; + // @ts-ignore + const maxBytes = numeral(maxFileSize.toUpperCase()).value(); + if (maxBytes < MAX_FILE_SIZE_BYTES) { + return MAX_FILE_SIZE_BYTES; + } + return maxBytes < ABSOLUTE_MAX_FILE_SIZE_BYTES ? maxBytes : ABSOLUTE_MAX_FILE_SIZE_BYTES; } export function getMaxBytesFormatted() { diff --git a/x-pack/plugins/ml/server/routes/file_data_visualizer.ts b/x-pack/plugins/ml/server/routes/file_data_visualizer.ts index b915d13aa9720..9f30847d9eb2e 100644 --- a/x-pack/plugins/ml/server/routes/file_data_visualizer.ts +++ b/x-pack/plugins/ml/server/routes/file_data_visualizer.ts @@ -6,7 +6,7 @@ import { schema } from '@kbn/config-schema'; import { RequestHandlerContext } from 'kibana/server'; -import { MAX_BYTES } from '../../common/constants/file_datavisualizer'; +import { MAX_FILE_SIZE_BYTES } from '../../common/constants/file_datavisualizer'; import { InputOverrides, Settings, @@ -79,7 +79,7 @@ export function fileDataVisualizerRoutes({ router, mlLicense }: RouteInitializat options: { body: { accepts: ['text/*', 'application/json'], - maxBytes: MAX_BYTES, + maxBytes: MAX_FILE_SIZE_BYTES, }, }, }, @@ -121,7 +121,7 @@ export function fileDataVisualizerRoutes({ router, mlLicense }: RouteInitializat options: { body: { accepts: ['application/json'], - maxBytes: MAX_BYTES, + maxBytes: MAX_FILE_SIZE_BYTES, }, }, }, From 02bcc8e78bbf954cc57d01dbcf7d7664b91c127b Mon Sep 17 00:00:00 2001 From: Brandon Morelli Date: Wed, 15 Apr 2020 07:54:26 -0700 Subject: [PATCH 23/80] [APM] docs: restructure APM documentation for 7.7 (#63280) --- docs/apm/advanced-queries.asciidoc | 30 ++++++++------ docs/apm/agent-configuration.asciidoc | 27 ++++++------ docs/apm/api.asciidoc | 6 ++- docs/apm/apm-alerts.asciidoc | 28 +++++++------ docs/apm/bottlenecks.asciidoc | 25 ----------- docs/apm/custom-links.asciidoc | 20 +++++---- docs/apm/deployment-annotations.asciidoc | 17 ++++++++ docs/apm/error-reports-watcher.asciidoc | 18 ++++++++ docs/apm/errors.asciidoc | 22 ++-------- docs/apm/filters.asciidoc | 11 +++-- docs/apm/getting-started.asciidoc | 51 ++++++++++++++++------- docs/apm/how-to-guides.asciidoc | 32 ++++++++++++++ docs/apm/images/dynamic-config.svg | 1 + docs/apm/index.asciidoc | 40 +++++++++++------- docs/apm/machine-learning.asciidoc | 27 ++++++++++++ docs/apm/metrics.asciidoc | 19 +-------- docs/apm/service-maps.asciidoc | 53 +++++++++++++++++++----- docs/apm/services.asciidoc | 6 +-- docs/apm/set-up.asciidoc | 35 ++++++++++++++++ docs/apm/settings.asciidoc | 11 +++-- docs/apm/spans.asciidoc | 5 ++- docs/apm/traces.asciidoc | 9 +++- docs/apm/transactions.asciidoc | 19 ++------- docs/apm/troubleshooting.asciidoc | 27 +++++++----- docs/apm/using-the-apm-ui.asciidoc | 51 ----------------------- docs/settings/apm-settings.asciidoc | 31 +++++++------- 26 files changed, 372 insertions(+), 249 deletions(-) delete mode 100644 docs/apm/bottlenecks.asciidoc create mode 100644 docs/apm/deployment-annotations.asciidoc create mode 100644 docs/apm/error-reports-watcher.asciidoc create mode 100644 docs/apm/how-to-guides.asciidoc create mode 100644 docs/apm/images/dynamic-config.svg create mode 100644 docs/apm/machine-learning.asciidoc create mode 100644 docs/apm/set-up.asciidoc delete mode 100644 docs/apm/using-the-apm-ui.asciidoc diff --git a/docs/apm/advanced-queries.asciidoc b/docs/apm/advanced-queries.asciidoc index add6f601489e1..f89f994e59e57 100644 --- a/docs/apm/advanced-queries.asciidoc +++ b/docs/apm/advanced-queries.asciidoc @@ -1,14 +1,11 @@ +[role="xpack"] [[advanced-queries]] -=== Advanced queries +=== Query your data -When querying in the APM app, you're simply searching and selecting data from fields in Elasticsearch documents. -Queries entered into the query bar are also added as parameters to the URL, -so it's easy to share a specific query or view with others. - -You can begin to see some of the transaction fields available for filtering: - -[role="screenshot"] -image::apm/images/apm-query-bar.png[Example of the Kibana Query bar in APM app in Kibana] +Querying your APM data is a powerful tool that can make finding bottlenecks in your code even easier. +Imagine you have a user that complains about a slow response time in a specific service. +With the query bar, you can easily filter the APM app to only display trace data for that user, +or, to only show transactions that are slower than a specified time threshold. [float] ==== Example APM app queries @@ -17,15 +14,24 @@ image::apm/images/apm-query-bar.png[Example of the Kibana Query bar in APM app i * Filter by response status code: `context.response.status_code >= 400` * Filter by single user ID: `context.user.id : 12` +When querying in the APM app, you're merely searching and selecting data from fields in Elasticsearch documents. +Queries entered into the query bar are also added as parameters to the URL, +so it's easy to share a specific query or view with others. + +When you type, you can begin to see some of the transaction fields available for filtering: + +[role="screenshot"] +image::apm/images/apm-query-bar.png[Example of the Kibana Query bar in APM app in Kibana] + TIP: Read the {kibana-ref}/kuery-query.html[Kibana Query Language Enhancements] documentation to learn more about the capabilities of the {kib} query language. [float] [[discover-advanced-queries]] === Querying in Discover -It may also be helpful to view your APM data in {kibana-ref}/discover.html[*Discover*]. +Alternatively, you can query your APM documents in {kibana-ref}/discover.html[*Discover*]. Querying documents in *Discover* works the same way as querying in the APM app, -and all of the example APM app queries can also be used in *Discover*. +and *Discover* supports all of the example APM app queries shown on this page. [float] ==== Example Discover query @@ -33,7 +39,7 @@ and all of the example APM app queries can also be used in *Discover*. One example where you may want to make use of *Discover*, is for viewing _all_ transactions for an endpoint, instead of just a sample. -TIP: Starting in v7.6, you can view 10 samples per bucket in the APM app, instead of just one. +TIP: Starting in v7.6, you can view ten samples per bucket in the APM app, instead of just one. Use the APM app to find a transaction name and time bucket that you're interested in learning more about. Then, switch to *Discover* and make a search: diff --git a/docs/apm/agent-configuration.asciidoc b/docs/apm/agent-configuration.asciidoc index 0d2834c1a400e..d911c2154ea4c 100644 --- a/docs/apm/agent-configuration.asciidoc +++ b/docs/apm/agent-configuration.asciidoc @@ -1,12 +1,16 @@ [role="xpack"] [[agent-configuration]] -=== APM Agent configuration +=== APM Agent central configuration -APM Agent configuration allows you to fine-tune your agent configuration directly in Kibana. -Best of all, changes are automatically propagated to your APM agents so there's no need to redeploy. +++++ +Configure APM agents with central config +++++ -To get started, simply choose the services and environments you wish to configure. -The APM app will let you know when your configurations have been applied by your agents. +APM Agent configuration allows you to fine-tune your agent configuration from within the APM app. +Changes are automatically propagated to your APM agents, so there's no need to redeploy. + +To get started, choose the services and environments you wish to configure. +The APM app will let you know when your agents have applied your configurations. [role="screenshot"] image::apm/images/apm-agent-configuration.png[APM Agent configuration in Kibana] @@ -14,29 +18,28 @@ image::apm/images/apm-agent-configuration.png[APM Agent configuration in Kibana] [float] ==== Precedence -Configurations set with APM Agent configuration take precedence over configurations set locally in the Agent. +Configurations set from the APM app take precedence over configurations set locally in each Agent. However, if APM Server is slow to respond, is offline, reports an error, etc., APM agents will use local defaults until they're able to update the configuration. -For this reason, it is still important to set custom default configurations locally in each of your agents. +For this reason, it is still essential to set custom default configurations locally in each of your agents. [float] ==== APM Server setup This feature requires {apm-server-ref}/setup-kibana-endpoint.html[Kibana endpoint configuration] in APM Server. -Why is additional configuration needed in APM Server? -That's because APM Server acts as a proxy between the agents and Kibana. +APM Server acts as a proxy between the agents and Kibana. Kibana communicates any changed settings to APM Server so that your agents only need to poll APM Server to determine which settings have changed. [float] ==== Supported configurations -Each Agent has its own list of supported configurations. +Each Agent has a list of supported configurations. After selecting a Service name and environment in the APM app, -a list of all available configuration options, +a list of all supported configuration options, including descriptions and default values, will be displayed. -Supported configurations are also marked in each Agent's configuration documentation: +Supported configurations are also tagged with the image:./images/dynamic-config.svg[] badge in each Agent's configuration reference: [horizontal] Go Agent:: {apm-go-ref}/configuration.html[Configuration reference] diff --git a/docs/apm/api.asciidoc b/docs/apm/api.asciidoc index a8f4f4bf0baaa..93733f5990a46 100644 --- a/docs/apm/api.asciidoc +++ b/docs/apm/api.asciidoc @@ -1,6 +1,10 @@ [role="xpack"] [[apm-api]] -== API +== APM app API + +++++ +REST API +++++ Some APM app features are provided via a REST API: diff --git a/docs/apm/apm-alerts.asciidoc b/docs/apm/apm-alerts.asciidoc index b8552c007b13d..75ce5f56c96c6 100644 --- a/docs/apm/apm-alerts.asciidoc +++ b/docs/apm/apm-alerts.asciidoc @@ -1,12 +1,16 @@ [role="xpack"] [[apm-alerts]] -=== Create an alert +=== Alerts + +++++ +Create an alert +++++ beta::[] -The APM app is integrated with Kibana's {kibana-ref}/alerting-getting-started.html[alerting and actions] feature. -It provides a set of built-in **actions** and APM specific threshold **alerts** for you to use, -and allows all alerts to be centrally managed from <>. +The APM app integrates with Kibana's {kibana-ref}/alerting-getting-started.html[alerting and actions] feature. +It provides a set of built-in **actions** and APM specific threshold **alerts** for you to use +and enables central management of all alerts from <>. [role="screenshot"] image::apm/images/apm-alert.png[Create an alert in the APM app] @@ -28,9 +32,9 @@ This guide creates an alert for the `opbeans-java` service based on the followin From the APM app, navigate to the `opbeans-java` service and select **Alerts** > **Create threshold alert** > **Transaction duration**. -The name of your alert will automatically be set as `Transaction duration | opbeans-java`, -and the alert will be tagged with `apm` and `service.name:opbeans-java`. -Feel free to edit either of these defaults. +`Transaction duration | opbeans-java` is automatically set as the name of the alert, +and `apm` and `service.name:opbeans-java` are added as tags. +It's fine to change the name of the alert, but do not edit the tags. Based on the alert criteria, define the following alert details: @@ -42,7 +46,7 @@ Based on the alert criteria, define the following alert details: * **FOR THE LAST** - `5 minutes` Select an action type. -Multiple action types can be selected, but in this example we want to post to a slack channel. +Multiple action types can be selected, but in this example, we want to post to a Slack channel. Select **Slack** > **Create a connector**. Enter a name for the connector, and paste the webhook URL. @@ -63,9 +67,9 @@ This guide creates an alert for the `opbeans-python` service based on the follow From the APM app, navigate to the `opbeans-python` service and select **Alerts** > **Create threshold alert** > **Error rate**. -The name of your alert will automatically be set as `Error rate | opbeans-python`, -and the alert will be tagged with `apm` and `service.name:opbeans-python`. -Feel free to edit either of these defaults. +`Error rate | opbeans-python` is automatically set as the name of the alert, +and `apm` and `service.name:opbeans-python` are added as tags. +It's fine to change the name of the alert, but do not edit the tags. Based on the alert criteria, define the following alert details: @@ -93,5 +97,5 @@ From this page, you can create, edit, disable, mute, and delete alerts, and crea See {kibana-ref}/alerting-getting-started.html[alerting and actions] for more information. NOTE: If you are using an **on-premise** Elastic Stack deployment with security, -TLS must be configured for communication between Elasticsearch and Kibana. +communication between Elasticsearch and Kibana must have TLS configured. More information is in the alerting {kibana-ref}/alerting-getting-started.html#alerting-setup-prerequisites[prerequisites]. \ No newline at end of file diff --git a/docs/apm/bottlenecks.asciidoc b/docs/apm/bottlenecks.asciidoc deleted file mode 100644 index fbde3e9ddcbd6..0000000000000 --- a/docs/apm/bottlenecks.asciidoc +++ /dev/null @@ -1,25 +0,0 @@ -[role="xpack"] -[[apm-bottlenecks]] -== Visualizing Application Bottlenecks - -Elastic APM captures different types of information from within instrumented applications: - -* {apm-overview-ref-v}/transaction-spans.html[*Spans*] contain information about a specific code path that has been executed. -They measure from the start to end of an activity, -and they can have a parent/child relationship with other spans. -* {apm-overview-ref-v}/transactions.html[*Transactions*] are a special kind of span that have extra metadata associated with them. -You can think of transactions as the highest level of work you’re measuring within a service. -As an example, a transaction could be a request to your server, a batch job, or a custom transaction type. -* {apm-overview-ref-v}/errors.html[*Errors*] contain information about the original exception that occurred or about a log created when the exception occurred. - -Each of these information types have a specific page associated with them in the APM app. -These various pages display the captured data in curated charts and tables that allow you to easily compare and debug your applications. - -For example, you can see information about response times, requests per minute, and status codes per endpoint. -You can even dive into a specific request sample and get a complete waterfall view of what your application is spending its time on. -You might see that your bottlenecks are in database queries, cache calls, or external requests. -For each incoming request and each application error, -you can also see contextual information such as the request header, user information, -system values, or custom data that you manually attached to the request. - -Having access to application-level insights with just a few clicks can drastically decrease the time you spend debugging errors, slow response times, and crashes. diff --git a/docs/apm/custom-links.asciidoc b/docs/apm/custom-links.asciidoc index 75c1c9d0009a2..4fdf39b643f94 100644 --- a/docs/apm/custom-links.asciidoc +++ b/docs/apm/custom-links.asciidoc @@ -1,6 +1,11 @@ +[role="xpack"] [[custom-links]] === Custom links +++++ +Create custom links +++++ + Elastic's custom link feature allows you to easily create up to 500 dynamic links based on your specific APM data. Custom links can be filtered to only appear in the APM app for relevant services, @@ -12,7 +17,7 @@ Ready to dive in? Jump straight to the <>. [[custom-links-create]] === Create a link -Each custom link consists of a label, url, and optional filter. +Each custom link consists of a label, URL, and optional filter. The easiest way to create a custom link is from within the actions dropdown in the transaction detail page. This method will automatically apply filters, scoping the link to that specific service, environment, transaction type, and transaction name. @@ -25,8 +30,7 @@ and selecting **Create custom link**. ==== Label The name of your custom link. -This text will be shown in the actions context menu, -so keep it as short as possible. +The actions context menu displays this text, so keep it as short as possible. TIP: Custom links are displayed alphabetically in the actions menu. @@ -39,8 +43,8 @@ URLs support dynamic field name variables, encapsulated in double curly brackets These variables will be replaced with transaction metadata when the link is clicked. Because everyone's data is different, -you'll need to examine your own traces to see what metadata is available for use. -The easiest way to do this is to select a trace in the APM app, and click **Metadata** in the **Trace Sample** table. +you'll need to examine your traces to see what metadata is available for use. +To do this, select a trace in the APM app, and click **Metadata** in the **Trace Sample** table. [role="screenshot"] image::apm/images/example-metadata.png[Example metadata] @@ -49,7 +53,7 @@ image::apm/images/example-metadata.png[Example metadata] [[custom-links-filters]] ==== Filters -Filter each link to only appear so it only appears for specific services or transactions. +Filter each link to only appear for specific services or transactions. You can filter on the following fields: * `service.name` @@ -57,7 +61,7 @@ You can filter on the following fields: * `transaction.type` * `transaction.name` -Multiple values are allowed when comma separated. +Multiple values are allowed when comma-separated. [float] [[custom-links-examples]] @@ -68,7 +72,7 @@ Multiple values are allowed when comma separated. :github-query-params: https://help.github.com/en/github/managing-your-work-on-github/about-automation-for-issues-and-pull-requests-with-query-parameters Not sure where to start with custom links? -Take a look at the examples below, and customize them to your liking! +Take a look at the examples below and customize them to your liking! [float] [[custom-links-examples-email]] diff --git a/docs/apm/deployment-annotations.asciidoc b/docs/apm/deployment-annotations.asciidoc new file mode 100644 index 0000000000000..6feadf8463226 --- /dev/null +++ b/docs/apm/deployment-annotations.asciidoc @@ -0,0 +1,17 @@ +[role="xpack"] +[[transactions-annotations]] +=== Track deployments with annotations + +++++ +Track deployments +++++ + +For enhanced visibility into your deployments, we offer deployment annotations on all transaction charts. +This feature automatically tags new deployments, so you can easily see if your deploy has increased response times +for an end-user, or if the memory/CPU footprint of your application has changed. +Being able to identify bad deployments quickly enables you to rollback and fix issues without causing costly outages. + +Deployment annotations are automatically enabled, and appear when the `service.version` of your app changes. + +[role="screenshot"] +image::apm/images/apm-transaction-annotation.png[Example view of transactions annotation in the APM app in Kibana] diff --git a/docs/apm/error-reports-watcher.asciidoc b/docs/apm/error-reports-watcher.asciidoc new file mode 100644 index 0000000000000..f41597932b751 --- /dev/null +++ b/docs/apm/error-reports-watcher.asciidoc @@ -0,0 +1,18 @@ +[role="xpack"] +[[errors-alerts-with-watcher]] +=== Error reports with Watcher + +++++ +Enable error reports +++++ + +You can use the power of the alerting features with Watcher to get reports on error occurrences. +The Watcher assistant, which is available on the errors overview, can help you set up a watch per service. + +Configure the watch with an occurrences threshold, time interval, and the desired actions, such as email or Slack notifications. +With Watcher, your team can set up reports within minutes. + +Watches are managed separately in the dedicated Watcher UI available in Advanced Settings. + +[role="screenshot"] +image::apm/images/apm-errors-watcher-assistant.png[Example view of the Watcher assistant for errors in APM app in Kibana] diff --git a/docs/apm/errors.asciidoc b/docs/apm/errors.asciidoc index 689fa1fffa89e..49351ec255858 100644 --- a/docs/apm/errors.asciidoc +++ b/docs/apm/errors.asciidoc @@ -1,7 +1,8 @@ +[role="xpack"] [[errors]] === Errors overview -TIP: {apm-overview-ref-v}/errors.html[Errors] are defined as groups of exceptions with matching exception or log messages. +TIP: {apm-overview-ref-v}/errors.html[Errors] are groups of exceptions with a similar exception or log message. The *Errors* overview provides a high-level view of the error message and culprit, the number of occurrences, and the most recent occurrence. @@ -20,7 +21,7 @@ image::apm/images/apm-error-group.png[Example view of the error group page in th Here, you'll see the error message, culprit, and the number of occurrences over time. Further down, you'll see the Error occurrence table. -This is where you can see the details of a sampled error within this group. +This table shows the details of a sampled error within this group. The error shown is always the most recent to occur. Each error occurrence features a breakdown of the exception, including the stack trace from when the error occurred, @@ -28,19 +29,4 @@ and additional contextual information to help debug the issue. In some cases, you might also see a Transaction sample ID. This feature allows you to make a connection between the errors and transactions, by linking you to the specific transaction where the error occurred. -This allows you to see the whole trace, including which services the request went through. - -[float] -[[errors-alerts-with-watcher]] -==== Error reports with Watcher - -You can use the power of the alerting features with Watcher to get reports on error occurrences. -The Watcher assistant, which is available on the errors overview, can help you set up a watch per service. - -Configure the watch with an occurrences threshold, time interval, and the desired actions, such as email or Slack notifications. -With Watcher, your team can set up reports within minutes. - -Watches are managed separately in the dedicated Watcher UI available in Advanced Settings. - -[role="screenshot"] -image::apm/images/apm-errors-watcher-assistant.png[Example view of the Watcher assistant for errors in APM app in Kibana] \ No newline at end of file +This allows you to see the whole trace, including which services the request went through. diff --git a/docs/apm/filters.asciidoc b/docs/apm/filters.asciidoc index 99ba827b0198d..d53adb439f0c8 100644 --- a/docs/apm/filters.asciidoc +++ b/docs/apm/filters.asciidoc @@ -1,6 +1,11 @@ +[role="xpack"] [[filters]] === Filters +++++ +Filter data +++++ + APM provides two different ways you can filter your data within the APM App: * <> @@ -42,7 +47,7 @@ It allows you to view only relevant data, and is especially useful for separatin By default, all environments are displayed. If there are no environment options, you'll see "not defined". Service environments are defined when configuring your APM agents. -It's very important to be consistent when naming environments in your agents. +It's vital to be consistent when naming environments in your agents. See the documentation for each agent you're using to learn how to configure service environments: * *Go:* {apm-go-ref}/configuration.html#config-environment[`ELASTIC_APM_ENVIRONMENT`] @@ -62,9 +67,9 @@ but only where they are applicable -- they are typically most useful in their or As an example, if you select a host on the Services overview, then select a transaction group, the host filter will still be applied. -These filters are very useful for quickly and easily removing noise from your data. +These filters are very useful for quickly and easily removing noise from your data. With just a click, you can filter your transactions by the transaction result, -host, container ID, and more. +host, container ID, and more. [role="screenshot"] image::apm/images/local-filter.png[Local filters available in the APM app in Kibana] \ No newline at end of file diff --git a/docs/apm/getting-started.asciidoc b/docs/apm/getting-started.asciidoc index 4a391f1a49672..89ce0be1499c5 100644 --- a/docs/apm/getting-started.asciidoc +++ b/docs/apm/getting-started.asciidoc @@ -1,22 +1,45 @@ [role="xpack"] [[apm-getting-started]] -== Getting Started +== Get started with the APM app -If you have not already installed and configured Elastic APM, -the *Setup Instructions* will get you started. +++++ +Get started +++++ -[role="screenshot"] -image::apm/images/apm-setup.png[Installation instructions on the APM page in Kibana] +Elastic APM captures different types of information from within instrumented applications: +* *Spans* contain information about the execution of a specific code path. +They measure from the start to end of an activity, +and they can have a parent/child relationship with other spans. +* *Transactions* are a special kind of span; +they are the first span for a particular service and have extra metadata associated with them. +As an example, a transaction could be a request to your server, a batch job, or a custom transaction type. +*Traces* link together related transactions to show an end-to-end performance of how a request was served and which services were part of it. +* *Errors* contain information about the original exception that occurred or about a log created when the exception occurred. -Index patterns tell Kibana which Elasticsearch indices you want to explore. -An APM index pattern is necessary for certain features in the APM app, like the query bar. -To set up the correct index pattern, -simply click *Load Kibana objects* at the bottom of the Setup Instructions. +Curated charts and tables display the different types of APM data, which allows you to compare and debug your applications easily. -After you install an Elastic APM agent library in your application, -the application automatically appears in the APM app in {kib}. -No further configuration is required. +* <> +* <> +* <> +* <> +* <> +* <> +* <> -[role="screenshot"] -image::apm/images/apm-index-pattern.png[Setup index pattern for APM in Kibana] +TIP: Want to learn more about the Elastic APM ecosystem? +See the {apm-get-started-ref}/overview.html[APM Overview]. + +include::services.asciidoc[] + +include::traces.asciidoc[] + +include::transactions.asciidoc[] + +include::spans.asciidoc[] + +include::errors.asciidoc[] + +include::metrics.asciidoc[] + +include::service-maps.asciidoc[] diff --git a/docs/apm/how-to-guides.asciidoc b/docs/apm/how-to-guides.asciidoc new file mode 100644 index 0000000000000..9b0efb4f7a359 --- /dev/null +++ b/docs/apm/how-to-guides.asciidoc @@ -0,0 +1,32 @@ +[role="xpack"] +[[apm-how-to]] +== How-to guides + +Learn how to perform common APM app tasks. + + +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> + + +include::agent-configuration.asciidoc[] + +include::apm-alerts.asciidoc[] + +include::custom-links.asciidoc[] + +include::error-reports-watcher.asciidoc[] + +include::filters.asciidoc[] + +include::machine-learning.asciidoc[] + +include::advanced-queries.asciidoc[] + +include::deployment-annotations.asciidoc[] \ No newline at end of file diff --git a/docs/apm/images/dynamic-config.svg b/docs/apm/images/dynamic-config.svg new file mode 100644 index 0000000000000..df62a3c84f4b4 --- /dev/null +++ b/docs/apm/images/dynamic-config.svg @@ -0,0 +1 @@ + DynamicDynamic \ No newline at end of file diff --git a/docs/apm/index.asciidoc b/docs/apm/index.asciidoc index d3f0dc5b7f11f..79190efccdff2 100644 --- a/docs/apm/index.asciidoc +++ b/docs/apm/index.asciidoc @@ -4,25 +4,35 @@ [partintro] -- -Elastic Application Performance Monitoring (APM) automatically collects in-depth -performance metrics and errors from inside your applications. - -The **APM** app in {kib} is provided with the basic license. It -enables developers to drill down into the performance data for their applications -and quickly locate the performance bottlenecks. - -* <> -* <> -* <> - -NOTE: For more information about the components of Elastic APM, -see the {apm-get-started-ref}/overview.html[APM Overview]. +The APM app in {kib} is provided with the basic license. +It allows you to monitor your software services and applications in real-time; +visualize detailed performance information on your services, +identify and analyze errors, +and monitor host-level and agent-specific metrics like JVM and Go runtime metrics. + +[float] +[[apm-bottlenecks]] +== Visualizing application bottlenecks + +Having access to application-level insights with just a few clicks can drastically decrease the time you spend +debugging errors, slow response times, and crashes. + +For example, you can see information about response times, requests per minute, and status codes per endpoint. +You can even dive into a specific request sample and get a complete waterfall view of what your application is spending its time on. +You might see that your bottlenecks are in database queries, cache calls, or external requests. +For each incoming request and each application error, +you can also see contextual information such as the request header, user information, +system values, or custom data that you manually attached to the request. -- +include::set-up.asciidoc[] + include::getting-started.asciidoc[] -include::bottlenecks.asciidoc[] +include::how-to-guides.asciidoc[] -include::using-the-apm-ui.asciidoc[] +include::settings.asciidoc[] include::api.asciidoc[] + +include::troubleshooting.asciidoc[] diff --git a/docs/apm/machine-learning.asciidoc b/docs/apm/machine-learning.asciidoc new file mode 100644 index 0000000000000..9d347fc4f1111 --- /dev/null +++ b/docs/apm/machine-learning.asciidoc @@ -0,0 +1,27 @@ +[role="xpack"] +[[machine-learning-integration]] +=== Machine Learning integration + +++++ +Integrate with machine learning +++++ + +The Machine Learning integration will initiate a new job predefined to calculate anomaly scores on transaction response times. +The response time graph will show the expected bounds and add an annotation when the anomaly score is 75 or above. +Jobs can be created per transaction type, and based on the average response time. +Manage jobs in the *Machine Learning jobs management*. + +[role="screenshot"] +image::apm/images/apm-ml-integration.png[Example view of anomaly scores on response times in APM app in Kibana] + +[float] +[[create-ml-integration]] +=== Create a new machine learning job + +To enable machine learning anomaly detection, first choose a service to monitor. +Then, select **Integrations** > **Enable ML anomaly detection** and click **Create job**. +That's it! After a few minutes, the job will begin calculating results; +it might take additional time for results to appear on your graph. + +APM specific anomaly detection wizards are also available for certain Agents. +See the machine learning {ml-docs}/ootb-ml-jobs-apm.html[APM anomaly detection configurations] for more information. diff --git a/docs/apm/metrics.asciidoc b/docs/apm/metrics.asciidoc index ab394b785ef84..e82a4fbd5c291 100644 --- a/docs/apm/metrics.asciidoc +++ b/docs/apm/metrics.asciidoc @@ -1,3 +1,4 @@ +[role="xpack"] [[metrics]] === Metrics overview @@ -5,7 +6,7 @@ The *Metrics* overview provides agent-specific metrics, which lets you perform more in-depth root cause analysis investigations within the APM app. If you're experiencing a problem with your service, you can use this page to attempt to find the underlying cause. -For example, you might be able to correlate a high number of errors with a long transaction duration, high CPU usage, or a memory leak. +For example, you might be able to correlate a high number of errors with a long transaction duration, high CPU usage, or a memory leak. [role="screenshot"] image::apm/images/apm-metrics.png[Example view of the Metrics overview in APM app in Kibana] @@ -17,19 +18,3 @@ thread count, garbage collection rate, and garbage collection time spent per min [role="screenshot"] image::apm/images/jvm-metrics.png[Example view of the Metrics overview for the Java Agent] - -[[machine-learning-integration]] -=== Machine Learning integration - -The Machine Learning integration will initiate a new job predefined to calculate anomaly scores on transaction response times. -The response time graph will show the expected bounds and annotate the graph when the anomaly score is 75 or above. - -[role="screenshot"] -image::apm/images/apm-ml-integration.png[Example view of anomaly scores on response times in APM app in Kibana] - -Jobs can be created per transaction type and based on the average response time. -You can manage jobs in the *Machine Learning jobs management*. -It might take some time for results to appear on the graph. - -Machine learning is a platinum feature. For a comparison of the Elastic license levels, -see https://www.elastic.co/subscriptions[the subscription page]. \ No newline at end of file diff --git a/docs/apm/service-maps.asciidoc b/docs/apm/service-maps.asciidoc index e0d84f33b4dcb..be86b9d522ac5 100644 --- a/docs/apm/service-maps.asciidoc +++ b/docs/apm/service-maps.asciidoc @@ -1,37 +1,53 @@ +[role="xpack"] [[service-maps]] === Service maps beta::[] -A service map is a real-time diagram of the interactions occurring in your application’s architecture. -It allows you to easily visualize data flow and high-level statistics, like average transaction duration, -requests per minute, errors per minute, and metrics, allowing you to quickly assess the status of your services. +WARNING: Service map support for Internet Explorer 11 is extremely limited. +Please use Chrome or Firefox if available. -Our beta offering creates two types of service maps: +A service map is a real-time visual representation of the instrumented services in your application's architecture. +It shows you how these services are connected, along with high-level metrics like average transaction duration, +requests per minute, and errors per minute, that allow you to quickly assess the status of your services. -* Global: All services and connections are shown. -* Service-specific: Selecting a specific service will highlight it's connections. +We currently surface two types of service maps: + +* Global: All services instrumented with APM agents and the connections between them are shown. +* Service-specific: Highlight connections for a selected service. [role="screenshot"] image::apm/images/service-maps.png[Example view of service maps in the APM app in Kibana] +[float] +[[service-maps-how]] +=== How do service maps work? + +Service maps rely on distributed traces to draw connections between services. +As {apm-overview-ref-v}/distributed-tracing.html[distributed tracing] is enabled out-of-the-box for supported technologies, so are service maps. +However, if a service isn't instrumented, +or a `traceparent` header isn't being propagated to it, +distributed tracing will not work, and the connection will not be drawn on the map. + [float] [[visualize-your-architecture]] === Visualize your architecture Select the **Service Map** tab to get started. -By default, all services and connections are shown. -Whether your onboarding a new engineer, or just trying to grasp the big picture, +By default, all instrumented services and connections are shown. +Whether you're onboarding a new engineer, or just trying to grasp the big picture, click around, zoom in and out, and begin to visualize how your services are connected. If there's a specific service that interests you, select that service to highlight its connections. Clicking **Focus map** will refocus the map on that specific service and lock the connection highlighting. -From here, select **Service Details**, or click on the **Transaction** tab to jump to the Transaction overview. +From here, select **Service Details**, or click on the **Transaction** tab to jump to the Transaction overview +for the selected service. You can also use the tabs at the top of the page to easily jump to the **Errors** or **Metrics** overview. -While it's not possible to query in service maps, it is possible to filter by environment. +Filter out your maps by picking the environment from the environment drop-down filter. This can be useful if you have two or more services, in separate environments, but with the same name. -Use the environment drop down to only see the data you're interested in, like `dev` or `production`. +Use the environment drop-down to only see the data you're interested in, like `dev` or `production`. +Additional filters are not currently available for service maps. [role="screenshot"] image::apm/images/service-maps-java.png[Example view of service maps with Java highlighted in the APM app in Kibana] @@ -46,3 +62,18 @@ Nodes appear on the map in one of two shapes: * **Diamond**: Databases, external, and messaging. Interior icons represent the generic type, with specific icons for known entities, like Elasticsearch. Type and subtype are based on `span.type`, and `span.subtype`. + +[float] +[[service-maps-supported]] +=== Supported APM Agents + +Service maps are supported for the following Agent versions: + +[horizontal] +Go Agent:: >= v1.7.0 +Java Agent:: >= v1.13.0 +.NET Agent:: >= v1.3.0 +Node.js Agent:: >= v3.6.0 +Python Agent:: >= v5.5.0 +Ruby Agent:: >= v3.6.0 +Real User Monitoring (RUM) Agent:: >= v4.7.0 diff --git a/docs/apm/services.asciidoc b/docs/apm/services.asciidoc index 9af3e74562dab..395e23c379306 100644 --- a/docs/apm/services.asciidoc +++ b/docs/apm/services.asciidoc @@ -1,9 +1,9 @@ +[role="xpack"] [[services]] === Services overview -The *Services* overview gives you quick insights into the health and general performance of each service. - -You can add services by setting the `service.name` configuration in each of the {apm-agents-ref}[APM agents] you’re instrumenting. +The *Services* overview gives you quick insights into the health and general performance of all of your instrumented services. +Services are sorted by the `service.name` configured in each of the {apm-agents-ref}[APM agents] you’ve installed. [role="screenshot"] image::apm/images/apm-services-overview.png[Example view of services table the APM app in Kibana] \ No newline at end of file diff --git a/docs/apm/set-up.asciidoc b/docs/apm/set-up.asciidoc new file mode 100644 index 0000000000000..c5bf5e13b640b --- /dev/null +++ b/docs/apm/set-up.asciidoc @@ -0,0 +1,35 @@ +[role="xpack"] +[[apm-ui]] +== Set up the APM app + +++++ +Set up +++++ + +APM is available via the navigation sidebar in {Kib}. +If you have not already installed and configured Elastic APM, +the *Setup Instructions* in Kibana will get you started. + +[role="screenshot"] +image::apm/images/apm-setup.png[Installation instructions on the APM page in Kibana] + +[float] +[[apm-configure-index-pattern]] +=== Load the index pattern + +Index patterns tell Kibana which Elasticsearch indices you want to explore. +An APM index pattern is necessary for certain features in the APM app, like the query bar. +To set up the correct index pattern, +simply click *Load Kibana objects* at the bottom of the Setup Instructions. + +[role="screenshot"] +image::apm/images/apm-index-pattern.png[Setup index pattern for APM in Kibana] + +To use a custom index pattern, see <>. + +[float] +[[apm-getting-started-next]] +=== Next steps + +No further configuration in the APM app is required. +Install an APM Agent library in your service to begin visualizing and analyzing your data! diff --git a/docs/apm/settings.asciidoc b/docs/apm/settings.asciidoc index 37122fc9c635d..44da63143f63f 100644 --- a/docs/apm/settings.asciidoc +++ b/docs/apm/settings.asciidoc @@ -1,18 +1,23 @@ // Do not link directly to this page. // Link to the anchor in `/docs/settings/apm-settings.asciidoc` instead. +[role="xpack"] [[apm-settings-in-kibana]] -=== APM settings in Kibana +== APM app settings + +++++ +Settings +++++ You do not need to configure any settings to use the APM app. It is enabled by default. [float] [[apm-indices-settings]] -==== APM Indices +=== APM Indices include::./../settings/apm-settings.asciidoc[tag=apm-indices-settings] [float] [[general-apm-settings]] -==== General APM settings +=== General APM settings include::./../settings/apm-settings.asciidoc[tag=general-apm-settings] diff --git a/docs/apm/spans.asciidoc b/docs/apm/spans.asciidoc index ef21e1c5333e0..2eed339160fc4 100644 --- a/docs/apm/spans.asciidoc +++ b/docs/apm/spans.asciidoc @@ -1,7 +1,8 @@ +[role="xpack"] [[spans]] === Span timeline -TIP: A {apm-overview-ref-v}/transaction-spans.html[span] is defined as the duration of a single event. +TIP: A {apm-overview-ref-v}/transaction-spans.html[span] is the duration of a single event. Spans are automatically captured by APM agents, and you can also define custom spans. Each span has a type and is defined by a different color in the timeline/waterfall visualization. @@ -28,7 +29,7 @@ Services in a distributed trace are separated by color and listed in the order t [role="screenshot"] image::apm/images/apm-services-trace.png[Example of distributed trace colors in the APM app in Kibana] -Don't forget, a distributed trace includes more than one transaction. +Don't forget; a distributed trace includes more than one transaction. When viewing these distributed traces in the timeline waterfall, you'll see this image:apm/images/transaction-icon.png[APM icon] icon, which indicates the next transaction in the trace. These transactions can be expanded and viewed in detail by clicking on them. diff --git a/docs/apm/traces.asciidoc b/docs/apm/traces.asciidoc index 09d8f52b92840..8eef3d9bed4db 100644 --- a/docs/apm/traces.asciidoc +++ b/docs/apm/traces.asciidoc @@ -1,12 +1,17 @@ +[role="xpack"] [[traces]] === Traces overview +TIP: Traces link together related transactions to show an end-to-end performance of how a request was served +and which services were part of it. +In addition to the Traces overview, you can view your application traces in the <>. + The *Traces* overview displays the entry transaction for all traces in your application. If you're using <>, this view is key to finding the critical paths within your application. Transactions with the same name are grouped together and only shown once in this table. By default, transactions are sorted by _Impact_. -Impact helps show the most used and slowest endpoints in your service - in other words, +Impact helps show the most used and slowest endpoints in your service--in other words, it's the collective amount of pain a specific endpoint is causing your users. If there's a particular endpoint you're worried about, you can click on it to view the <>. @@ -33,4 +38,4 @@ You can use the <> to view a waterfall displa [role="screenshot"] image::apm/images/apm-distributed-tracing.png[Example view of the distributed tracing in APM app in Kibana] -TIP: Distributed tracing is supported by all APM agents and there’s no additional configuration needed. \ No newline at end of file +TIP: Distributed tracing is supported by all APM agents, and there's no additional configuration needed. \ No newline at end of file diff --git a/docs/apm/transactions.asciidoc b/docs/apm/transactions.asciidoc index 1eb037009efff..2e1022e6d684c 100644 --- a/docs/apm/transactions.asciidoc +++ b/docs/apm/transactions.asciidoc @@ -1,3 +1,4 @@ +[role="xpack"] [[transactions]] === Transaction overview @@ -56,20 +57,6 @@ For further details, including troubleshooting and custom implementation instruc refer to the documentation for each {apm-agents-ref}[APM Agent] you've implemented. ==== -[[transactions-annotations]] -==== Transaction annotations - -For enhanced visibility into your deployments, we offer deployment annotations on all transaction charts. -This feature automatically tags new deployments, so you can easily see if your deploy has increased response times -for an end-user, or if the memory/CPU footprint of your application has increased. -Being able to quickly identify bad deployments enables you to rollback and fix issues without causing costly outages. - -Deployment annotations are automatically enabled, and appear when the `service.version` of your app changes. - -[role="screenshot"] -image::apm/images/apm-transaction-annotation.png[Example view of transactions annotation in the APM app in Kibana] - - [[rum-transaction-overview]] ==== RUM Transaction overview @@ -82,7 +69,7 @@ image::apm/images/apm-geo-ui.jpg[average page load duration distribution] This data is available due to the geo-ip and user agent pipelines being enabled by default, which allows for the capture of geo-location and user agent data. These visualizations make it easy for you to visualize performance information about your -end users' experience based on their location. +end-users' experience based on their location. [[transaction-details]] ==== Transaction details @@ -103,7 +90,7 @@ The number of requests per bucket is displayed when hovering over the graph, and [role="screenshot"] image::apm/images/apm-transaction-duration-dist.png[Example view of transactions duration distribution graph] -This graph shows a typical distribution, and indicates most of our requests were served quickly - awesome! +This graph shows a typical distribution, and indicates most of our requests were served quickly--awesome! It's the requests on the right, the ones taking longer than average, that we probably want to focus on. When you select one of these buckets, diff --git a/docs/apm/troubleshooting.asciidoc b/docs/apm/troubleshooting.asciidoc index c6174e1786c78..eb4fb790afd7f 100644 --- a/docs/apm/troubleshooting.asciidoc +++ b/docs/apm/troubleshooting.asciidoc @@ -1,19 +1,24 @@ -[[troubleshooting]] -=== Troubleshooting common problems +[[troubleshooting]] +== Troubleshoot common problems + +++++ +Troubleshooting +++++ If you have something to add to this section, please consider creating a pull request with your proposed changes at https://github.com/elastic/kibana. -Also check out the https://discuss.elastic.co/c/apm[APM discussion forum]. +Also, check out the https://discuss.elastic.co/c/apm[APM discussion forum]. +[float] [[no-apm-data-found]] -==== No APM data found +=== No APM data found This section can help with any of the following: * Data isn't displaying in the APM app -* You're seeing a message like "No Services Found", -* You're seeing errors like "Fielddata is disabled on text fields by default..." +* You see a message like "No Services Found", +* You see errors like "Fielddata is disabled on text fields by default..." There are a number of factors that could be at play here. One important thing to double-check first is your index template. @@ -52,12 +57,13 @@ you can customize the indices that the APM app uses to display data. Navigate to *APM* > *Settings* > *Indices*, and change all `apm_oss.*Pattern` values to include the new index pattern. For example: `customIndexName-*`. -==== Unknown route +[float] +=== Unknown route The {apm-app-ref}/transactions.html[transaction overview] will only display helpful information when the transactions in your services are named correctly. If you're seeing "GET unknown route" or "unknown route" in the APM app, -it could be a sign that something isn't working like it should. +it could be a sign that something isn't working as it should. Elastic APM Agents come with built-in support for popular frameworks out-of-the-box. This means, among other things, that the Agent will try to automatically name HTTP requests. @@ -71,7 +77,8 @@ To resolve this, you'll need to head over to the relevant {apm-agents-ref}[Agent Specifically, view the Agent's supported technologies page. You can also use the Agent's public API to manually set a name for the transaction. -==== Fields are not searchable +[float] +=== Fields are not searchable In Elasticsearch, index templates are used to define settings and mappings that determine how fields should be analyzed. The recommended index template file for APM Server is installed by the APM Server packages. @@ -92,7 +99,7 @@ Selecting the `apm-*` index pattern shows a listing of every field defined in th *Ensure a field is searchable* There are two things you can do to if you'd like to ensure a field is searchable: -1. Index your additional data as {apm-overview-ref}/metadata.html[labels] instead. +1. Index your additional data as {apm-overview-ref-v}/metadata.html[labels] instead. These are dynamic by default, which means they will be indexed and become searchable and aggregatable. 2. Use the {apm-server-ref}/configuration-template.html[`append_fields`] feature. As an example, diff --git a/docs/apm/using-the-apm-ui.asciidoc b/docs/apm/using-the-apm-ui.asciidoc deleted file mode 100644 index 904718999069d..0000000000000 --- a/docs/apm/using-the-apm-ui.asciidoc +++ /dev/null @@ -1,51 +0,0 @@ -[role="xpack"] -[[apm-ui]] -== Using APM - -APM is designed to be as intuitive as possible, -but you might come across certain terms or concepts that don’t feel native to you. -Not to worry, we've created this guide to help you get the most out of Elastic APM. - -APM is available via the navigation sidebar in {Kib}. - -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> - -include::filters.asciidoc[] - -include::services.asciidoc[] - -include::traces.asciidoc[] - -include::transactions.asciidoc[] - -include::spans.asciidoc[] - -include::service-maps.asciidoc[] - -include::errors.asciidoc[] - -include::metrics.asciidoc[] - -include::apm-alerts.asciidoc[] - -include::agent-configuration.asciidoc[] - -include::custom-links.asciidoc[] - -include::advanced-queries.asciidoc[] - -include::settings.asciidoc[] - -include::troubleshooting.asciidoc[] diff --git a/docs/settings/apm-settings.asciidoc b/docs/settings/apm-settings.asciidoc index 91bbef5690fd5..fd53c3aeb3605 100644 --- a/docs/settings/apm-settings.asciidoc +++ b/docs/settings/apm-settings.asciidoc @@ -5,7 +5,10 @@ APM settings ++++ -You do not need to configure any settings to use the APM app. It is enabled by default. +These settings allow the APM app to function, and specify the data that it surfaces. +Unless you've customized your setup, +you do not need to configure any settings to use the APM app. +It is enabled by default. [float] [[apm-indices-settings-kb]] @@ -33,29 +36,29 @@ image::settings/images/apm-settings.png[APM app settings in Kibana] If you'd like to change any of the default values, copy and paste the relevant settings into your `kibana.yml` configuration file. +Changing these settings may disable features of the APM App. -xpack.apm.enabled:: Set to `false` to disabled the APM plugin {kib}. Defaults to -`true`. +xpack.apm.enabled:: Set to `false` to disable the APM app. Defaults to `true`. -xpack.apm.ui.enabled:: Set to `false` to hide the APM plugin {kib} from the menu. Defaults to -`true`. +xpack.apm.ui.enabled:: Set to `false` to hide the APM app from the menu. Defaults to `true`. -xpack.apm.ui.transactionGroupBucketSize:: Number of top transaction groups displayed in APM plugin in Kibana. Defaults to `100`. +xpack.apm.ui.transactionGroupBucketSize:: Number of top transaction groups displayed in the APM app. Defaults to `100`. -xpack.apm.ui.maxTraceItems:: Max number of child items displayed when viewing trace details. Defaults to `1000`. +xpack.apm.ui.maxTraceItems:: Maximum number of child items displayed when viewing trace details. Defaults to `1000`. -apm_oss.indexPattern:: Index pattern is used for integrations with Machine Learning and Kuery Bar. It must match all apm indices. Defaults to `apm-*`. +apm_oss.indexPattern:: The index pattern used for integrations with Machine Learning and Query Bar. +It must match all apm indices. Defaults to `apm-*`. -apm_oss.errorIndices:: Matcher for indices containing error documents. Defaults to `apm-*`. +apm_oss.errorIndices:: Matcher for all {apm-server-ref}/error-indices.html[error indices]. Defaults to `apm-*`. -apm_oss.onboardingIndices:: Matcher for indices containing onboarding documents. Defaults to `apm-*`. +apm_oss.onboardingIndices:: Matcher for all onboarding indices. Defaults to `apm-*`. -apm_oss.spanIndices:: Matcher for indices containing span documents. Defaults to `apm-*`. +apm_oss.spanIndices:: Matcher for all {apm-server-ref}/span-indices.html[span indices]. Defaults to `apm-*`. -apm_oss.transactionIndices:: Matcher for indices containing transaction documents. Defaults to `apm-*`. +apm_oss.transactionIndices:: Matcher for all {apm-server-ref}/transaction-indices.html[transaction indices]. Defaults to `apm-*`. -apm_oss.metricsIndices:: Matcher for indices containing metric documents. Defaults to `apm-*`. +apm_oss.metricsIndices:: Matcher for all {apm-server-ref}/metricset-indices.html[metrics indices]. Defaults to `apm-*`. -apm_oss.sourcemapIndices:: Matcher for indices containing sourcemap documents. Defaults to `apm-*`. +apm_oss.sourcemapIndices:: Matcher for all {apm-server-ref}/sourcemap-indices.html[source map indices]. Defaults to `apm-*`. // end::general-apm-settings[] From afb48bceca1aa64f9e70049d649f7e203fb1b613 Mon Sep 17 00:00:00 2001 From: Daniil Suleiman <31325372+sulemanof@users.noreply.github.com> Date: Wed, 15 Apr 2020 18:03:17 +0300 Subject: [PATCH 24/80] [NP] Move visTypeXy plugin (#63449) * Move vis_type_xy into NP * Substitute usage in vis_type_vislib * Disable plugin by default --- .github/CODEOWNERS | 2 +- .../vis_type_vislib/public/legacy.ts | 1 + .../vis_type_vislib/public/plugin.ts | 11 ++-- src/legacy/core_plugins/vis_type_xy/index.ts | 56 ------------------- .../core_plugins/vis_type_xy/package.json | 4 -- .../ui/public/new_platform/new_platform.ts | 2 + src/plugins/vis_type_xy/kibana.json | 7 +++ .../vis_type_xy/public/index.ts | 4 +- .../vis_type_xy/public/plugin.ts | 16 +++--- .../vis_type_xy/server/index.ts} | 25 +++------ 10 files changed, 34 insertions(+), 94 deletions(-) delete mode 100644 src/legacy/core_plugins/vis_type_xy/index.ts delete mode 100644 src/legacy/core_plugins/vis_type_xy/package.json create mode 100644 src/plugins/vis_type_xy/kibana.json rename src/{legacy/core_plugins => plugins}/vis_type_xy/public/index.ts (89%) rename src/{legacy/core_plugins => plugins}/vis_type_xy/public/plugin.ts (85%) rename src/{legacy/core_plugins/vis_type_xy/public/legacy.ts => plugins/vis_type_xy/server/index.ts} (50%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5e40dc044b97a..8a8a79e7c5f65 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,7 +13,7 @@ /src/legacy/core_plugins/kibana/public/local_application_service/ @elastic/kibana-app /src/legacy/core_plugins/kibana/public/dev_tools/ @elastic/kibana-app /src/legacy/core_plugins/vis_type_vislib/ @elastic/kibana-app -/src/legacy/core_plugins/vis_type_xy/ @elastic/kibana-app +/src/plugins/vis_type_xy/ @elastic/kibana-app /src/plugins/kibana_legacy/ @elastic/kibana-app /src/plugins/timelion/ @elastic/kibana-app /src/plugins/dashboard/ @elastic/kibana-app diff --git a/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts b/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts index aa11e0ef41fba..579caa1cb88f6 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/legacy.ts @@ -30,6 +30,7 @@ const setupPlugins: Readonly = { expressions: npSetup.plugins.expressions, visualizations: npSetup.plugins.visualizations, charts: npSetup.plugins.charts, + visTypeXy: npSetup.plugins.visTypeXy, }; const startPlugins: Readonly = { diff --git a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts index 2731fb6f5fbe6..ef3f664252856 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts @@ -24,6 +24,7 @@ import { PluginInitializerContext, } from 'kibana/public'; +import { VisTypeXyPluginSetup } from 'src/plugins/vis_type_xy/public'; import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; import { createVisTypeVislibVisFn } from './vis_type_vislib_vis_fn'; @@ -39,7 +40,6 @@ import { createGoalVisTypeDefinition, } from './vis_type_vislib_vis_types'; import { ChartsPluginSetup } from '../../../../plugins/charts/public'; -import { ConfigSchema as VisTypeXyConfigSchema } from '../../vis_type_xy'; import { DataPublicPluginStart } from '../../../../plugins/data/public'; import { setFormatService, setDataActions } from './services'; @@ -53,6 +53,7 @@ export interface VisTypeVislibPluginSetupDependencies { expressions: ReturnType; visualizations: VisualizationsSetup; charts: ChartsPluginSetup; + visTypeXy?: VisTypeXyPluginSetup; } /** @internal */ @@ -68,7 +69,7 @@ export class VisTypeVislibPlugin implements Plugin { public async setup( core: VisTypeVislibCoreSetup, - { expressions, visualizations, charts }: VisTypeVislibPluginSetupDependencies + { expressions, visualizations, charts, visTypeXy }: VisTypeVislibPluginSetupDependencies ) { const visualizationDependencies: Readonly = { uiSettings: core.uiSettings, @@ -86,12 +87,8 @@ export class VisTypeVislibPlugin implements Plugin { ]; const vislibFns = [createVisTypeVislibVisFn(), createPieVisFn()]; - const visTypeXy = core.injectedMetadata.getInjectedVar('visTypeXy') as - | VisTypeXyConfigSchema['visTypeXy'] - | undefined; - // if visTypeXy plugin is disabled it's config will be undefined - if (!visTypeXy || !visTypeXy.enabled) { + if (!visTypeXy) { const convertedTypes: any[] = []; const convertedFns: any[] = []; diff --git a/src/legacy/core_plugins/vis_type_xy/index.ts b/src/legacy/core_plugins/vis_type_xy/index.ts deleted file mode 100644 index 58d2e425eef40..0000000000000 --- a/src/legacy/core_plugins/vis_type_xy/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { resolve } from 'path'; -import { Legacy } from 'kibana'; - -import { LegacyPluginApi, LegacyPluginInitializer } from '../../types'; - -export interface ConfigSchema { - visTypeXy: { - enabled: boolean; - }; -} - -const visTypeXyPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => - new Plugin({ - id: 'visTypeXy', - require: ['kibana', 'elasticsearch', 'visualizations', 'interpreter'], - publicDir: resolve(__dirname, 'public'), - uiExports: { - hacks: [resolve(__dirname, 'public/legacy')], - injectDefaultVars(server): ConfigSchema { - const config = server.config(); - - return { - visTypeXy: { - enabled: config.get('visTypeXy.enabled') as boolean, - }, - }; - }, - }, - config(Joi: any) { - return Joi.object({ - enabled: Joi.boolean().default(false), - }).default(); - }, - } as Legacy.PluginSpecOptions); - -// eslint-disable-next-line import/no-default-export -export default visTypeXyPluginInitializer; diff --git a/src/legacy/core_plugins/vis_type_xy/package.json b/src/legacy/core_plugins/vis_type_xy/package.json deleted file mode 100644 index 920f7dcb44e87..0000000000000 --- a/src/legacy/core_plugins/vis_type_xy/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "visTypeXy", - "version": "kibana" -} diff --git a/src/legacy/ui/public/new_platform/new_platform.ts b/src/legacy/ui/public/new_platform/new_platform.ts index 21b80e827e4c2..80fb837258d4c 100644 --- a/src/legacy/ui/public/new_platform/new_platform.ts +++ b/src/legacy/ui/public/new_platform/new_platform.ts @@ -22,6 +22,7 @@ import { IScope } from 'angular'; import { UiActionsStart, UiActionsSetup } from 'src/plugins/ui_actions/public'; import { EmbeddableStart, EmbeddableSetup } from 'src/plugins/embeddable/public'; import { createBrowserHistory } from 'history'; +import { VisTypeXyPluginSetup } from 'src/plugins/vis_type_xy/public'; import { DashboardStart } from '../../../../plugins/dashboard/public'; import { setSetupServices, setStartServices } from './set_services'; import { @@ -93,6 +94,7 @@ export interface PluginsSetup { savedObjectsManagement: SavedObjectsManagementPluginSetup; mapsLegacy: MapsLegacyPluginSetup; indexPatternManagement: IndexPatternManagementSetup; + visTypeXy?: VisTypeXyPluginSetup; } export interface PluginsStart { diff --git a/src/plugins/vis_type_xy/kibana.json b/src/plugins/vis_type_xy/kibana.json new file mode 100644 index 0000000000000..ca02da45e9112 --- /dev/null +++ b/src/plugins/vis_type_xy/kibana.json @@ -0,0 +1,7 @@ +{ + "id": "visTypeXy", + "version": "kibana", + "server": true, + "ui": true, + "requiredPlugins": ["charts", "expressions", "visualizations"] +} diff --git a/src/legacy/core_plugins/vis_type_xy/public/index.ts b/src/plugins/vis_type_xy/public/index.ts similarity index 89% rename from src/legacy/core_plugins/vis_type_xy/public/index.ts rename to src/plugins/vis_type_xy/public/index.ts index 218dc8aa8a683..9af75ce9059e9 100644 --- a/src/legacy/core_plugins/vis_type_xy/public/index.ts +++ b/src/plugins/vis_type_xy/public/index.ts @@ -17,9 +17,11 @@ * under the License. */ -import { PluginInitializerContext } from '../../../../core/public'; +import { PluginInitializerContext } from '../../../core/public'; import { VisTypeXyPlugin as Plugin } from './plugin'; +export { VisTypeXyPluginSetup } from './plugin'; + export function plugin(initializerContext: PluginInitializerContext) { return new Plugin(initializerContext); } diff --git a/src/legacy/core_plugins/vis_type_xy/public/plugin.ts b/src/plugins/vis_type_xy/public/plugin.ts similarity index 85% rename from src/legacy/core_plugins/vis_type_xy/public/plugin.ts rename to src/plugins/vis_type_xy/public/plugin.ts index ab01b6b3153fb..667018c1e6e30 100644 --- a/src/legacy/core_plugins/vis_type_xy/public/plugin.ts +++ b/src/plugins/vis_type_xy/public/plugin.ts @@ -25,18 +25,18 @@ import { PluginInitializerContext, } from 'kibana/public'; -import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { - VisualizationsSetup, - VisualizationsStart, -} from '../../../../plugins/visualizations/public'; -import { ChartsPluginSetup } from '../../../../plugins/charts/public'; +import { Plugin as ExpressionsPublicPlugin } from '../../expressions/public'; +import { VisualizationsSetup, VisualizationsStart } from '../../visualizations/public'; +import { ChartsPluginSetup } from '../../charts/public'; export interface VisTypeXyDependencies { uiSettings: IUiSettingsClient; charts: ChartsPluginSetup; } +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface VisTypeXyPluginSetup {} + /** @internal */ export interface VisTypeXyPluginSetupDependencies { expressions: ReturnType; @@ -53,7 +53,7 @@ export interface VisTypeXyPluginStartDependencies { type VisTypeXyCoreSetup = CoreSetup; /** @internal */ -export class VisTypeXyPlugin implements Plugin { +export class VisTypeXyPlugin implements Plugin { constructor(public initializerContext: PluginInitializerContext) {} public async setup( @@ -77,6 +77,8 @@ export class VisTypeXyPlugin implements Plugin { visTypeDefinitions.forEach((vis: any) => visualizations.createBaseVisualization(vis(visualizationDependencies)) ); + + return {}; } public start(core: CoreStart, deps: VisTypeXyPluginStartDependencies) { diff --git a/src/legacy/core_plugins/vis_type_xy/public/legacy.ts b/src/plugins/vis_type_xy/server/index.ts similarity index 50% rename from src/legacy/core_plugins/vis_type_xy/public/legacy.ts rename to src/plugins/vis_type_xy/server/index.ts index 740ceeaac6a7d..afc879dc9c845 100644 --- a/src/legacy/core_plugins/vis_type_xy/public/legacy.ts +++ b/src/plugins/vis_type_xy/server/index.ts @@ -17,24 +17,13 @@ * under the License. */ -import { npSetup, npStart } from 'ui/new_platform'; -import { PluginInitializerContext } from 'kibana/public'; +import { schema } from '@kbn/config-schema'; -import { plugin } from '.'; -import { VisTypeXyPluginSetupDependencies, VisTypeXyPluginStartDependencies } from './plugin'; - -const setupPlugins: Readonly = { - expressions: npSetup.plugins.expressions, - visualizations: npSetup.plugins.visualizations, - charts: npSetup.plugins.charts, -}; - -const startPlugins: Readonly = { - expressions: npStart.plugins.expressions, - visualizations: npStart.plugins.visualizations, +export const config = { + schema: schema.object({ enabled: schema.boolean({ defaultValue: false }) }), }; -const pluginInstance = plugin({} as PluginInitializerContext); - -export const setup = pluginInstance.setup(npSetup.core, setupPlugins); -export const start = pluginInstance.start(npStart.core, startPlugins); +export const plugin = () => ({ + setup() {}, + start() {}, +}); From 00a1144ae21cc0cda0980f25be153aba7b99298d Mon Sep 17 00:00:00 2001 From: Rudolf Meijering Date: Wed, 15 Apr 2020 17:07:57 +0200 Subject: [PATCH 25/80] Refactor Plugins to access elasticsearch from CoreStart (#59915) * x-pack/watcher: use Elasticsearch from CoreStart * x-pack/upgrade_assistant: use Elasticsearch from CoreStart * x-pack/actions: use Elasticsearch from CoreStart * x-pack/alerting: use Elasticsearch from CoreStart * x-pack/lens: use Elasticsearch from CoreStart * expressions: use Elasticsearch from CoreStart * x-pack/remote_clusters: remove unused Elasticsearch dependency on CoreSetup * x-pack/oss_telemetry: use Elasticsearch from CoreStart * Cleanup after #59886 * x-pack/watcher: create custom client only once * Revert "x-pack/watcher: create custom client only once" This reverts commit 78fc4d2e93c05b1fd014bd6fa31a608d6968ed43. * Revert "x-pack/watcher: use Elasticsearch from CoreStart" This reverts commit b621af93882ef7e64e35dcfeaf4dd95af5359f26. * x-pack/task_manager: use Elasticsearch from CoreStart * x-pack/event_log: use Elasticsearch from CoreStart * x-pack/alerting: use Elasticsearch from CoreStart * x-pack/apm: use Elasticsearch from CoreStart * x-pack/actions: use Elasticsearch from CoreStart * PR Feedback * APM review nits * Remove unused variable * Remove unused variable * x-pack/apm: better typesafety Co-authored-by: Elastic Machine --- .../elasticsearch/elasticsearch_service.ts | 17 +++-- src/core/server/server.ts | 2 +- src/plugins/expressions/server/legacy.ts | 23 +++--- x-pack/plugins/actions/server/plugin.test.ts | 3 + x-pack/plugins/actions/server/plugin.ts | 25 +++---- x-pack/plugins/actions/server/usage/task.ts | 8 ++- x-pack/plugins/alerting/server/plugin.ts | 12 ++-- x-pack/plugins/alerting/server/usage/task.ts | 9 ++- x-pack/plugins/apm/server/plugin.ts | 72 +++++++++++-------- .../server/es/cluster_client_adapter.test.ts | 2 +- .../server/es/cluster_client_adapter.ts | 9 +-- x-pack/plugins/event_log/server/es/context.ts | 4 +- x-pack/plugins/event_log/server/plugin.ts | 4 +- x-pack/plugins/lens/server/usage/task.ts | 5 +- .../oss_telemetry/server/lib/tasks/index.ts | 10 ++- .../lib/tasks/visualizations/task_runner.ts | 8 +-- x-pack/plugins/oss_telemetry/server/plugin.ts | 2 +- .../oss_telemetry/server/test_utils/index.ts | 12 ++-- .../plugins/remote_clusters/server/plugin.ts | 8 +-- .../plugins/remote_clusters/server/types.ts | 4 +- x-pack/plugins/task_manager/server/plugin.ts | 5 +- .../lib/telemetry/usage_collector.test.ts | 2 +- .../server/lib/telemetry/usage_collector.ts | 8 +-- .../upgrade_assistant/server/plugin.ts | 11 ++- .../routes/reindex_indices/reindex_indices.ts | 8 +-- 25 files changed, 148 insertions(+), 125 deletions(-) diff --git a/src/core/server/elasticsearch/elasticsearch_service.ts b/src/core/server/elasticsearch/elasticsearch_service.ts index 684f6e15caff9..18725f04a05b5 100644 --- a/src/core/server/elasticsearch/elasticsearch_service.ts +++ b/src/core/server/elasticsearch/elasticsearch_service.ts @@ -33,7 +33,12 @@ import { CoreService } from '../../types'; import { merge } from '../../utils'; import { CoreContext } from '../core_context'; import { Logger } from '../logging'; -import { ClusterClient, ScopeableRequest } from './cluster_client'; +import { + ClusterClient, + ScopeableRequest, + IClusterClient, + ICustomClusterClient, +} from './cluster_client'; import { ElasticsearchClientConfig } from './elasticsearch_client_config'; import { ElasticsearchConfig, ElasticsearchConfigType } from './elasticsearch_config'; import { InternalHttpServiceSetup, GetAuthHeaders } from '../http/'; @@ -58,12 +63,14 @@ export class ElasticsearchService implements CoreService { private readonly log: Logger; private readonly config$: Observable; - private subscription: Subscription | undefined; + private subscription?: Subscription; private stop$ = new Subject(); private kibanaVersion: string; - createClient: InternalElasticsearchServiceSetup['createClient'] | undefined; - dataClient: InternalElasticsearchServiceSetup['dataClient'] | undefined; - adminClient: InternalElasticsearchServiceSetup['adminClient'] | undefined; + private createClient?: ( + type: string, + clientConfig?: Partial + ) => ICustomClusterClient; + private adminClient?: IClusterClient; constructor(private readonly coreContext: CoreContext) { this.kibanaVersion = coreContext.env.packageInfo.version; diff --git a/src/core/server/server.ts b/src/core/server/server.ts index 07ea431dd3a0d..684f50a5666e1 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -201,7 +201,7 @@ export class Server { uiSettings: uiSettingsStart, }; - const pluginsStart = await this.plugins.start(this.coreStart!); + const pluginsStart = await this.plugins.start(this.coreStart); await this.legacy.start({ core: { diff --git a/src/plugins/expressions/server/legacy.ts b/src/plugins/expressions/server/legacy.ts index 17aa1c66a6835..1487f9f6734e9 100644 --- a/src/plugins/expressions/server/legacy.ts +++ b/src/plugins/expressions/server/legacy.ts @@ -26,7 +26,7 @@ import { register, registryFactory, Registry, Fn } from '@kbn/interpreter/common import Boom from 'boom'; import { schema } from '@kbn/config-schema'; -import { CoreSetup, Logger } from 'src/core/server'; +import { CoreSetup, Logger, APICaller } from 'src/core/server'; import { ExpressionsServerSetupDependencies } from './plugin'; import { typeSpecs, ExpressionType } from '../common'; import { serializeProvider } from '../common'; @@ -97,7 +97,10 @@ export const createLegacyServerEndpoints = ( * @param {*} handlers - The Canvas handlers * @param {*} fnCall - Describes the function being run `{ functionName, args, context }` */ - async function runFunction(handlers: any, fnCall: any) { + async function runFunction( + handlers: { environment: string; elasticsearchClient: APICaller }, + fnCall: any + ) { const { functionName, args, context } = fnCall; const { deserialize } = serializeProvider(registries.types.toJS()); const fnDef = registries.serverFunctions.toJS()[functionName]; @@ -112,18 +115,14 @@ export const createLegacyServerEndpoints = ( * results back using ND-JSON. */ plugins.bfetch.addBatchProcessingRoute(`/api/interpreter/fns`, request => { - const scopedClient = core.elasticsearch.dataClient.asScoped(request); - const handlers = { - environment: 'server', - elasticsearchClient: async ( - endpoint: string, - clientParams: Record = {}, - options?: any - ) => scopedClient.callAsCurrentUser(endpoint, clientParams, options), - }; - return { onBatchItem: async (fnCall: any) => { + const [coreStart] = await core.getStartServices(); + const handlers = { + environment: 'server', + elasticsearchClient: coreStart.elasticsearch.legacy.client.asScoped(request) + .callAsCurrentUser, + }; const result = await runFunction(handlers, fnCall); if (typeof result === 'undefined') { throw new Error(`Function ${fnCall.functionName} did not return anything.`); diff --git a/x-pack/plugins/actions/server/plugin.test.ts b/x-pack/plugins/actions/server/plugin.test.ts index 6215b08df81d4..fa5b2f9399a4d 100644 --- a/x-pack/plugins/actions/server/plugin.test.ts +++ b/x-pack/plugins/actions/server/plugin.test.ts @@ -99,6 +99,9 @@ describe('Actions Plugin', () => { savedObjects: { client: {}, }, + elasticsearch: { + adminClient: jest.fn(), + }, }, } as any, httpServerMock.createKibanaRequest(), diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index ef3716070ab04..a8ab3bbb2fad2 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -11,13 +11,13 @@ import { Plugin, CoreSetup, CoreStart, - IClusterClient, KibanaRequest, Logger, SharedGlobalConfig, RequestHandler, IContextProvider, SavedObjectsServiceStart, + ElasticsearchServiceStart, } from '../../../../src/core/server'; import { @@ -89,7 +89,6 @@ export class ActionsPlugin implements Plugin, Plugi private readonly logger: Logger; private serverBasePath?: string; - private adminClient?: IClusterClient; private taskRunnerFactory?: TaskRunnerFactory; private actionTypeRegistry?: ActionTypeRegistry; private actionExecutor?: ActionExecutor; @@ -173,7 +172,6 @@ export class ActionsPlugin implements Plugin, Plugi this.actionTypeRegistry = actionTypeRegistry; this.serverBasePath = core.http.basePath.serverBasePath; this.actionExecutor = actionExecutor; - this.adminClient = core.elasticsearch.adminClient; this.spaces = plugins.spaces?.spacesService; registerBuiltInActionTypes({ @@ -233,7 +231,6 @@ export class ActionsPlugin implements Plugin, Plugi actionTypeRegistry, taskRunnerFactory, kibanaIndex, - adminClient, isESOUsingEphemeralEncryptionKey, preconfiguredActions, } = this; @@ -242,7 +239,7 @@ export class ActionsPlugin implements Plugin, Plugi logger, eventLogger: this.eventLogger!, spaces: this.spaces, - getServices: this.getServicesFactory(core.savedObjects), + getServices: this.getServicesFactory(core.savedObjects, core.elasticsearch), encryptedSavedObjectsPlugin: plugins.encryptedSavedObjects, actionTypeRegistry: actionTypeRegistry!, preconfiguredActions, @@ -282,7 +279,7 @@ export class ActionsPlugin implements Plugin, Plugi savedObjectsClient: core.savedObjects.getScopedClient(request), actionTypeRegistry: actionTypeRegistry!, defaultKibanaIndex: await kibanaIndex, - scopedClusterClient: adminClient!.asScoped(request), + scopedClusterClient: core.elasticsearch.legacy.client.asScoped(request), preconfiguredActions, }); }, @@ -291,11 +288,11 @@ export class ActionsPlugin implements Plugin, Plugi } private getServicesFactory( - savedObjects: SavedObjectsServiceStart + savedObjects: SavedObjectsServiceStart, + elasticsearch: ElasticsearchServiceStart ): (request: KibanaRequest) => Services { - const { adminClient } = this; return request => ({ - callCluster: adminClient!.asScoped(request).callAsCurrentUser, + callCluster: elasticsearch.legacy.client.asScoped(request).callAsCurrentUser, savedObjectsClient: savedObjects.getScopedClient(request), }); } @@ -303,12 +300,8 @@ export class ActionsPlugin implements Plugin, Plugi private createRouteHandlerContext = ( defaultKibanaIndex: string ): IContextProvider, 'actions'> => { - const { - actionTypeRegistry, - adminClient, - isESOUsingEphemeralEncryptionKey, - preconfiguredActions, - } = this; + const { actionTypeRegistry, isESOUsingEphemeralEncryptionKey, preconfiguredActions } = this; + return async function actionsRouteHandlerContext(context, request) { return { getActionsClient: () => { @@ -321,7 +314,7 @@ export class ActionsPlugin implements Plugin, Plugi savedObjectsClient: context.core.savedObjects.client, actionTypeRegistry: actionTypeRegistry!, defaultKibanaIndex, - scopedClusterClient: adminClient!.asScoped(request), + scopedClusterClient: context.core.elasticsearch.adminClient, preconfiguredActions, }); }, diff --git a/x-pack/plugins/actions/server/usage/task.ts b/x-pack/plugins/actions/server/usage/task.ts index a07a2aa8f1c70..ed0d876ed0208 100644 --- a/x-pack/plugins/actions/server/usage/task.ts +++ b/x-pack/plugins/actions/server/usage/task.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Logger, CoreSetup } from 'kibana/server'; +import { Logger, CoreSetup, APICaller } from 'kibana/server'; import moment from 'moment'; import { RunContext, @@ -62,7 +62,11 @@ async function scheduleTasks(logger: Logger, taskManager: TaskManagerStartContra export function telemetryTaskRunner(logger: Logger, core: CoreSetup, kibanaIndex: string) { return ({ taskInstance }: RunContext) => { const { state } = taskInstance; - const callCluster = core.elasticsearch.adminClient.callAsInternalUser; + const callCluster = (...args: Parameters) => { + return core.getStartServices().then(([{ elasticsearch: { legacy: { client } } }]) => + client.callAsInternalUser(...args) + ); + }; return { async run() { return Promise.all([ diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index fdca6c0a9b503..ad39d09bd6d3d 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -19,7 +19,6 @@ import { TaskRunnerFactory } from './task_runner'; import { AlertsClientFactory } from './alerts_client_factory'; import { LicenseState } from './lib/license_state'; import { - IClusterClient, KibanaRequest, Logger, PluginInitializerContext, @@ -29,6 +28,7 @@ import { IContextProvider, RequestHandler, SharedGlobalConfig, + ElasticsearchServiceStart, } from '../../../../src/core/server'; import { @@ -94,7 +94,6 @@ export class AlertingPlugin { private readonly logger: Logger; private alertTypeRegistry?: AlertTypeRegistry; private readonly taskRunnerFactory: TaskRunnerFactory; - private adminClient?: IClusterClient; private serverBasePath?: string; private licenseState: LicenseState | null = null; private isESOUsingEphemeralEncryptionKey?: boolean; @@ -119,7 +118,6 @@ export class AlertingPlugin { } public async setup(core: CoreSetup, plugins: AlertingPluginsSetup): Promise { - this.adminClient = core.elasticsearch.adminClient; this.licenseState = new LicenseState(plugins.licensing.license$); this.spaces = plugins.spaces?.spacesService; this.security = plugins.security; @@ -223,7 +221,7 @@ export class AlertingPlugin { taskRunnerFactory.initialize({ logger, - getServices: this.getServicesFactory(core.savedObjects), + getServices: this.getServicesFactory(core.savedObjects, core.elasticsearch), spaceIdToNamespace: this.spaceIdToNamespace, actionsPlugin: plugins.actions, encryptedSavedObjectsPlugin: plugins.encryptedSavedObjects, @@ -263,11 +261,11 @@ export class AlertingPlugin { }; private getServicesFactory( - savedObjects: SavedObjectsServiceStart + savedObjects: SavedObjectsServiceStart, + elasticsearch: ElasticsearchServiceStart ): (request: KibanaRequest) => Services { - const { adminClient } = this; return request => ({ - callCluster: adminClient!.asScoped(request).callAsCurrentUser, + callCluster: elasticsearch.legacy.client.asScoped(request).callAsCurrentUser, savedObjectsClient: savedObjects.getScopedClient(request), }); } diff --git a/x-pack/plugins/alerting/server/usage/task.ts b/x-pack/plugins/alerting/server/usage/task.ts index 3da60aef301e2..ab62d81d44f8a 100644 --- a/x-pack/plugins/alerting/server/usage/task.ts +++ b/x-pack/plugins/alerting/server/usage/task.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Logger, CoreSetup } from 'kibana/server'; +import { Logger, CoreSetup, APICaller } from 'kibana/server'; import moment from 'moment'; import { RunContext, @@ -65,7 +65,12 @@ async function scheduleTasks(logger: Logger, taskManager: TaskManagerStartContra export function telemetryTaskRunner(logger: Logger, core: CoreSetup, kibanaIndex: string) { return ({ taskInstance }: RunContext) => { const { state } = taskInstance; - const callCluster = core.elasticsearch.adminClient.callAsInternalUser; + const callCluster = (...args: Parameters) => { + return core.getStartServices().then(([{ elasticsearch: { legacy: { client } } }]) => + client.callAsInternalUser(...args) + ); + }; + return { async run() { return Promise.all([ diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index e18b6d33ca419..b434d41982f4c 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -3,7 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext, Plugin, CoreSetup } from 'src/core/server'; +import { + PluginInitializerContext, + Plugin, + CoreSetup, + CoreStart, + Logger +} from 'src/core/server'; import { Observable, combineLatest, AsyncSubject } from 'rxjs'; import { map, take } from 'rxjs/operators'; import { Server } from 'hapi'; @@ -37,6 +43,8 @@ export interface APMPluginContract { } export class APMPlugin implements Plugin { + private currentConfig?: APMConfig; + private logger?: Logger; legacySetup$: AsyncSubject; constructor(private readonly initContext: PluginInitializerContext) { this.initContext = initContext; @@ -56,7 +64,7 @@ export class APMPlugin implements Plugin { actions?: ActionsPlugin['setup']; } ) { - const logger = this.initContext.logger.get(); + this.logger = this.initContext.logger.get(); const config$ = this.initContext.config.create(); const mergedConfig$ = combineLatest(plugins.apm_oss.config$, config$).pipe( map(([apmOssConfig, apmConfig]) => mergeConfigs(apmOssConfig, apmConfig)) @@ -71,49 +79,40 @@ export class APMPlugin implements Plugin { } this.legacySetup$.subscribe(__LEGACY => { - createApmApi().init(core, { config$: mergedConfig$, logger, __LEGACY }); + createApmApi().init(core, { + config$: mergedConfig$, + logger: this.logger!, + __LEGACY + }); }); - const currentConfig = await mergedConfig$.pipe(take(1)).toPromise(); + this.currentConfig = await mergedConfig$.pipe(take(1)).toPromise(); if ( plugins.taskManager && plugins.usageCollection && - currentConfig['xpack.apm.telemetryCollectionEnabled'] + this.currentConfig['xpack.apm.telemetryCollectionEnabled'] ) { createApmTelemetry({ core, config$: mergedConfig$, usageCollector: plugins.usageCollection, taskManager: plugins.taskManager, - logger + logger: this.logger }); } - // create agent configuration index without blocking setup lifecycle - createApmAgentConfigurationIndex({ - esClient: core.elasticsearch.dataClient, - config: currentConfig, - logger - }); - // create custom action index without blocking setup lifecycle - createApmCustomLinkIndex({ - esClient: core.elasticsearch.dataClient, - config: currentConfig, - logger - }); - plugins.home.tutorials.registerTutorial( tutorialProvider({ - isEnabled: currentConfig['xpack.apm.ui.enabled'], - indexPatternTitle: currentConfig['apm_oss.indexPattern'], + isEnabled: this.currentConfig['xpack.apm.ui.enabled'], + indexPatternTitle: this.currentConfig['apm_oss.indexPattern'], cloud: plugins.cloud, indices: { - errorIndices: currentConfig['apm_oss.errorIndices'], - metricsIndices: currentConfig['apm_oss.metricsIndices'], - onboardingIndices: currentConfig['apm_oss.onboardingIndices'], - sourcemapIndices: currentConfig['apm_oss.sourcemapIndices'], - transactionIndices: currentConfig['apm_oss.transactionIndices'] + errorIndices: this.currentConfig['apm_oss.errorIndices'], + metricsIndices: this.currentConfig['apm_oss.metricsIndices'], + onboardingIndices: this.currentConfig['apm_oss.onboardingIndices'], + sourcemapIndices: this.currentConfig['apm_oss.sourcemapIndices'], + transactionIndices: this.currentConfig['apm_oss.transactionIndices'] } }) ); @@ -127,12 +126,29 @@ export class APMPlugin implements Plugin { getApmIndices: async () => getApmIndices({ savedObjectsClient: await getInternalSavedObjectsClient(core), - config: currentConfig + config: await mergedConfig$.pipe(take(1)).toPromise() }) }; } - public async start() {} + public start(core: CoreStart) { + if (this.currentConfig == null || this.logger == null) { + throw new Error('APMPlugin needs to be setup before calling start()'); + } + + // create agent configuration index without blocking start lifecycle + createApmAgentConfigurationIndex({ + esClient: core.elasticsearch.legacy.client, + config: this.currentConfig, + logger: this.logger + }); + // create custom action index without blocking start lifecycle + createApmCustomLinkIndex({ + esClient: core.elasticsearch.legacy.client, + config: this.currentConfig, + logger: this.logger + }); + } public stop() {} } diff --git a/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts b/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts index ae26d7a7ece07..986486902c3fa 100644 --- a/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts +++ b/x-pack/plugins/event_log/server/es/cluster_client_adapter.test.ts @@ -21,7 +21,7 @@ beforeEach(() => { clusterClient = elasticsearchServiceMock.createClusterClient(); clusterClientAdapter = new ClusterClientAdapter({ logger, - clusterClient, + clusterClientPromise: Promise.resolve(clusterClient), }); }); diff --git a/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts b/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts index 36bc94edfca4e..409bb2d00e161 100644 --- a/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts +++ b/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts @@ -14,7 +14,7 @@ export type IClusterClientAdapter = PublicMethodsOf; export interface ConstructorOpts { logger: Logger; - clusterClient: EsClusterClient; + clusterClientPromise: Promise; } export interface QueryEventsBySavedObjectResult { @@ -26,11 +26,11 @@ export interface QueryEventsBySavedObjectResult { export class ClusterClientAdapter { private readonly logger: Logger; - private readonly clusterClient: EsClusterClient; + private readonly clusterClientPromise: Promise; constructor(opts: ConstructorOpts) { this.logger = opts.logger; - this.clusterClient = opts.clusterClient; + this.clusterClientPromise = opts.clusterClientPromise; } public async indexDocument(doc: any): Promise { @@ -201,7 +201,8 @@ export class ClusterClientAdapter { private async callEs(operation: string, body?: any): Promise { try { this.debug(`callEs(${operation}) calls:`, body); - const result = await this.clusterClient.callAsInternalUser(operation, body); + const clusterClient = await this.clusterClientPromise; + const result = await clusterClient.callAsInternalUser(operation, body); this.debug(`callEs(${operation}) result:`, result); return result; } catch (err) { diff --git a/x-pack/plugins/event_log/server/es/context.ts b/x-pack/plugins/event_log/server/es/context.ts index 144f44ac8e5ea..b8e351367b695 100644 --- a/x-pack/plugins/event_log/server/es/context.ts +++ b/x-pack/plugins/event_log/server/es/context.ts @@ -32,7 +32,7 @@ export function createEsContext(params: EsContextCtorParams): EsContext { export interface EsContextCtorParams { logger: Logger; - clusterClient: EsClusterClient; + clusterClientPromise: Promise; indexNameRoot: string; } @@ -50,7 +50,7 @@ class EsContextImpl implements EsContext { this.initialized = false; this.esAdapter = new ClusterClientAdapter({ logger: params.logger, - clusterClient: params.clusterClient, + clusterClientPromise: params.clusterClientPromise, }); } diff --git a/x-pack/plugins/event_log/server/plugin.ts b/x-pack/plugins/event_log/server/plugin.ts index 2cc41354b4fbc..e5034f599f118 100644 --- a/x-pack/plugins/event_log/server/plugin.ts +++ b/x-pack/plugins/event_log/server/plugin.ts @@ -66,7 +66,9 @@ export class Plugin implements CorePlugin elasticsearch.legacy.client), }); this.eventLogService = new EventLogService({ diff --git a/x-pack/plugins/lens/server/usage/task.ts b/x-pack/plugins/lens/server/usage/task.ts index e2462be149745..469457f973b62 100644 --- a/x-pack/plugins/lens/server/usage/task.ts +++ b/x-pack/plugins/lens/server/usage/task.ts @@ -184,7 +184,10 @@ export function telemetryTaskRunner( ) { return ({ taskInstance }: RunContext) => { const { state } = taskInstance; - const callCluster = core.elasticsearch.adminClient.callAsInternalUser; + const callCluster = async (...args: Parameters) => { + const [coreStart] = await core.getStartServices(); + return coreStart.elasticsearch.legacy.client.callAsInternalUser(...args); + }; return { async run() { diff --git a/x-pack/plugins/oss_telemetry/server/lib/tasks/index.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/index.ts index be08338807dd0..9342c2574bedd 100644 --- a/x-pack/plugins/oss_telemetry/server/lib/tasks/index.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/index.ts @@ -17,12 +17,12 @@ import { export function registerTasks({ taskManager, logger, - elasticsearch, + getStartServices, config, }: { taskManager?: TaskManagerSetupContract; logger: Logger; - elasticsearch: CoreSetup['elasticsearch']; + getStartServices: CoreSetup['getStartServices']; config: Observable<{ kibana: { index: string } }>; }) { if (!taskManager) { @@ -30,13 +30,17 @@ export function registerTasks({ return; } + const esClientPromise = getStartServices().then( + ([{ elasticsearch }]) => elasticsearch.legacy.client + ); + taskManager.registerTaskDefinitions({ [VIS_TELEMETRY_TASK]: { title: 'X-Pack telemetry calculator for Visualizations', type: VIS_TELEMETRY_TASK, createTaskRunner({ taskInstance }: { taskInstance: TaskInstance }) { return { - run: visualizationsTaskRunner(taskInstance, config, elasticsearch), + run: visualizationsTaskRunner(taskInstance, config, esClientPromise), }; }, }, diff --git a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts index 556dc465e562d..f60c44e548f3f 100644 --- a/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts +++ b/x-pack/plugins/oss_telemetry/server/lib/tasks/visualizations/task_runner.ts @@ -6,7 +6,7 @@ import { Observable } from 'rxjs'; import _, { countBy, groupBy, mapValues } from 'lodash'; -import { APICaller, CoreSetup } from 'kibana/server'; +import { APICaller, IClusterClient } from 'src/core/server'; import { getNextMidnight } from '../../get_next_midnight'; import { TaskInstance } from '../../../../../task_manager/server'; import { ESSearchHit } from '../../../../../apm/typings/elasticsearch'; @@ -73,17 +73,15 @@ async function getStats(callCluster: APICaller, index: string) { export function visualizationsTaskRunner( taskInstance: TaskInstance, config: Observable<{ kibana: { index: string } }>, - es: CoreSetup['elasticsearch'] + esClientPromise: Promise ) { - const { callAsInternalUser: callCluster } = es.createClient('data'); - return async () => { let stats; let error; try { const index = (await config.toPromise()).kibana.index; - stats = await getStats(callCluster, index); + stats = await getStats((await esClientPromise).callAsInternalUser, index); } catch (err) { if (err.constructor === Error) { error = err.message; diff --git a/x-pack/plugins/oss_telemetry/server/plugin.ts b/x-pack/plugins/oss_telemetry/server/plugin.ts index 430fca2d39837..6a447da66952a 100644 --- a/x-pack/plugins/oss_telemetry/server/plugin.ts +++ b/x-pack/plugins/oss_telemetry/server/plugin.ts @@ -35,7 +35,7 @@ export class OssTelemetryPlugin implements Plugin { registerTasks({ taskManager: deps.taskManager, logger: this.logger, - elasticsearch: core.elasticsearch, + getStartServices: core.getStartServices, config: this.config, }); registerCollectors( diff --git a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts index fc8c98c164623..4d703db3dcc64 100644 --- a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts +++ b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts @@ -4,9 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { APICaller, CoreSetup } from 'kibana/server'; +import { APICaller } from 'kibana/server'; import { of } from 'rxjs'; +import { elasticsearchServiceMock } from '../../../../../src/core/server/mocks'; import { ConcreteTaskInstance, TaskStatus, @@ -43,10 +44,11 @@ const defaultMockSavedObjects = [ const defaultMockTaskDocs = [getMockTaskInstance()]; -export const getMockEs = (mockCallWithInternal: APICaller = getMockCallWithInternal()) => - (({ - createClient: () => ({ callAsInternalUser: mockCallWithInternal }), - } as unknown) as CoreSetup['elasticsearch']); +export const getMockEs = async (mockCallWithInternal: APICaller = getMockCallWithInternal()) => { + const client = elasticsearchServiceMock.createClusterClient(); + (client.callAsInternalUser as any) = mockCallWithInternal; + return client; +}; export const getMockCallWithInternal = (hits: unknown[] = defaultMockSavedObjects): APICaller => { return ((() => { diff --git a/x-pack/plugins/remote_clusters/server/plugin.ts b/x-pack/plugins/remote_clusters/server/plugin.ts index b86f16228878a..fca4a5dbc5f94 100644 --- a/x-pack/plugins/remote_clusters/server/plugin.ts +++ b/x-pack/plugins/remote_clusters/server/plugin.ts @@ -29,15 +29,9 @@ export class RemoteClustersServerPlugin implements Plugin this.licenseStatus = { valid: false }; } - async setup( - { http, elasticsearch: elasticsearchService }: CoreSetup, - { licensing, cloud }: Dependencies - ) { - const elasticsearch = await elasticsearchService.adminClient; + async setup({ http }: CoreSetup, { licensing, cloud }: Dependencies) { const router = http.createRouter(); const routeDependencies: RouteDependencies = { - elasticsearch, - elasticsearchService, router, getLicenseStatus: () => this.licenseStatus, config: { diff --git a/x-pack/plugins/remote_clusters/server/types.ts b/x-pack/plugins/remote_clusters/server/types.ts index 85678cba92f19..23f4ed158c2d4 100644 --- a/x-pack/plugins/remote_clusters/server/types.ts +++ b/x-pack/plugins/remote_clusters/server/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IRouter, ElasticsearchServiceSetup, IClusterClient } from 'kibana/server'; +import { IRouter } from 'kibana/server'; import { LicensingPluginSetup } from '../../licensing/server'; import { CloudSetup } from '../../cloud/server'; @@ -16,8 +16,6 @@ export interface Dependencies { export interface RouteDependencies { router: IRouter; getLicenseStatus: () => LicenseStatus; - elasticsearchService: ElasticsearchServiceSetup; - elasticsearch: IClusterClient; config: { isCloudEnabled: boolean; }; diff --git a/x-pack/plugins/task_manager/server/plugin.ts b/x-pack/plugins/task_manager/server/plugin.ts index fdfe0c068afcf..e837fcd9c0dec 100644 --- a/x-pack/plugins/task_manager/server/plugin.ts +++ b/x-pack/plugins/task_manager/server/plugin.ts @@ -38,17 +38,16 @@ export class TaskManagerPlugin public setup(core: CoreSetup, plugins: any): TaskManagerSetupContract { const logger = this.initContext.logger.get('taskManager'); const config$ = this.initContext.config.create(); - const elasticsearch = core.elasticsearch.adminClient; return { registerLegacyAPI: once((__LEGACY: PluginLegacyDependencies) => { config$.subscribe(async config => { - const [{ savedObjects }] = await core.getStartServices(); + const [{ savedObjects, elasticsearch }] = await core.getStartServices(); const savedObjectsRepository = savedObjects.createInternalRepository(['task']); this.legacyTaskManager$.next( createTaskManager(core, { logger, config, - elasticsearch, + elasticsearch: elasticsearch.legacy.client, savedObjectsRepository, savedObjectsSerializer: savedObjects.createSerializer(), }) diff --git a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts index a4833d9a3d7fe..2af1a9ac38e44 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts @@ -58,7 +58,7 @@ describe('Upgrade Assistant Usage Collector', () => { }), }, elasticsearch: { - adminClient: clusterClient, + legacy: { client: clusterClient }, }, }; }); diff --git a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts index 79d6e53c64ec0..9c2946db7f084 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts @@ -7,7 +7,7 @@ import { set } from 'lodash'; import { APICaller, - ElasticsearchServiceSetup, + ElasticsearchServiceStart, ISavedObjectsRepository, SavedObjectsServiceStart, } from 'src/core/server'; @@ -51,7 +51,7 @@ async function getDeprecationLoggingStatusValue(callAsCurrentUser: APICaller): P } export async function fetchUpgradeAssistantMetrics( - { adminClient }: ElasticsearchServiceSetup, + { legacy: { client: esClient } }: ElasticsearchServiceStart, savedObjects: SavedObjectsServiceStart ): Promise { const savedObjectsRepository = savedObjects.createInternalRepository(); @@ -60,7 +60,7 @@ export async function fetchUpgradeAssistantMetrics( UPGRADE_ASSISTANT_TYPE, UPGRADE_ASSISTANT_DOC_ID ); - const callAsInternalUser = adminClient.callAsInternalUser.bind(adminClient); + const callAsInternalUser = esClient.callAsInternalUser.bind(esClient); const deprecationLoggingStatusValue = await getDeprecationLoggingStatusValue(callAsInternalUser); const getTelemetrySavedObject = ( @@ -107,7 +107,7 @@ export async function fetchUpgradeAssistantMetrics( } interface Dependencies { - elasticsearch: ElasticsearchServiceSetup; + elasticsearch: ElasticsearchServiceStart; savedObjects: SavedObjectsServiceStart; usageCollection: UsageCollectionSetup; } diff --git a/x-pack/plugins/upgrade_assistant/server/plugin.ts b/x-pack/plugins/upgrade_assistant/server/plugin.ts index 6ccd073a9e020..bdca506cc7338 100644 --- a/x-pack/plugins/upgrade_assistant/server/plugin.ts +++ b/x-pack/plugins/upgrade_assistant/server/plugin.ts @@ -11,7 +11,6 @@ import { CoreStart, PluginInitializerContext, Logger, - ElasticsearchServiceSetup, SavedObjectsClient, SavedObjectsServiceStart, } from '../../../../src/core/server'; @@ -40,7 +39,6 @@ export class UpgradeAssistantServerPlugin implements Plugin { // Properties set at setup private licensing?: LicensingPluginSetup; - private elasticSearchService?: ElasticsearchServiceSetup; // Properties set at start private savedObjectsServiceStart?: SavedObjectsServiceStart; @@ -59,10 +57,9 @@ export class UpgradeAssistantServerPlugin implements Plugin { } setup( - { http, elasticsearch, getStartServices, capabilities }: CoreSetup, + { http, getStartServices, capabilities }: CoreSetup, { usageCollection, cloud, licensing }: PluginsSetup ) { - this.elasticSearchService = elasticsearch; this.licensing = licensing; const router = http.createRouter(); @@ -88,13 +85,13 @@ export class UpgradeAssistantServerPlugin implements Plugin { registerTelemetryRoutes(dependencies); if (usageCollection) { - getStartServices().then(([{ savedObjects }]) => { + getStartServices().then(([{ savedObjects, elasticsearch }]) => { registerUpgradeAssistantUsageCollector({ elasticsearch, usageCollection, savedObjects }); }); } } - start({ savedObjects }: CoreStart) { + start({ savedObjects, elasticsearch }: CoreStart) { this.savedObjectsServiceStart = savedObjects; // The ReindexWorker uses a map of request headers that contain the authentication credentials @@ -107,7 +104,7 @@ export class UpgradeAssistantServerPlugin implements Plugin { this.worker = createReindexWorker({ credentialStore: this.credentialStore, licensing: this.licensing!, - elasticsearchService: this.elasticSearchService!, + elasticsearchService: elasticsearch, logger: this.logger, savedObjects: new SavedObjectsClient( this.savedObjectsServiceStart.createInternalRepository() diff --git a/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts b/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts index 686f93b771e62..3d15916b17ff9 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts @@ -5,7 +5,7 @@ */ import { schema } from '@kbn/config-schema'; import { - ElasticsearchServiceSetup, + ElasticsearchServiceStart, kibanaResponseFactory, Logger, SavedObjectsClient, @@ -38,7 +38,7 @@ import { GetBatchQueueResponse, PostBatchResponse } from './types'; interface CreateReindexWorker { logger: Logger; - elasticsearchService: ElasticsearchServiceSetup; + elasticsearchService: ElasticsearchServiceStart; credentialStore: CredentialStore; savedObjects: SavedObjectsClient; licensing: LicensingPluginSetup; @@ -51,8 +51,8 @@ export function createReindexWorker({ savedObjects, licensing, }: CreateReindexWorker) { - const { adminClient } = elasticsearchService; - return new ReindexWorker(savedObjects, credentialStore, adminClient, logger, licensing); + const esClient = elasticsearchService.legacy.client; + return new ReindexWorker(savedObjects, credentialStore, esClient, logger, licensing); } const mapAnyErrorToKibanaHttpResponse = (e: any) => { From d0404487f614c260203c2221aa284c6cbc6365e8 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Wed, 15 Apr 2020 11:10:20 -0400 Subject: [PATCH 26/80] Add embeddable via saved object example (#61692) * Add embeddable via saved object example * give todoRefEmbed a different name from the by value one * fix types * fix order of unmounting Co-authored-by: Christos Nasikas --- examples/embeddable_examples/common/index.ts | 20 +++ .../common/todo_saved_object_attributes.ts | 26 +++ examples/embeddable_examples/kibana.json | 2 +- .../public/create_sample_data.ts | 36 +++++ examples/embeddable_examples/public/index.ts | 15 +- examples/embeddable_examples/public/plugin.ts | 37 ++++- .../embeddable_examples/public/todo/README.md | 43 +++++ .../public/todo/todo_ref_component.tsx | 86 ++++++++++ .../public/todo/todo_ref_embeddable.tsx | 153 ++++++++++++++++++ .../todo/todo_ref_embeddable_factory.tsx | 83 ++++++++++ examples/embeddable_examples/server/index.ts | 24 +++ examples/embeddable_examples/server/plugin.ts | 31 ++++ .../server/todo_saved_object.ts | 40 +++++ examples/embeddable_examples/tsconfig.json | 1 + .../embeddable_explorer/public/plugin.tsx | 3 + .../actions/replace_panel_flyout.tsx | 7 +- .../application/dashboard_app_controller.tsx | 3 +- .../embeddable/dashboard_container.tsx | 2 +- .../public/application/embeddable/types.ts | 6 +- ...embeddable_saved_object_converters.test.ts | 13 +- .../lib/embeddable_saved_object_converters.ts | 8 +- src/plugins/embeddable/public/index.ts | 2 + .../public/lib/containers/container.ts | 35 +--- .../public/lib/containers/i_container.ts | 15 +- .../public/lib/embeddables/i_embeddable.ts | 7 + .../public/lib/embeddables/index.ts | 1 + .../embeddables/saved_object_embeddable.ts | 30 ++++ .../add_panel/add_panel_flyout.tsx | 15 +- .../embeddable/public/tests/container.test.ts | 6 +- test/examples/embeddables/adding_children.ts | 11 ++ .../np_ready/public/app/dashboard_input.ts | 8 +- 31 files changed, 679 insertions(+), 90 deletions(-) create mode 100644 examples/embeddable_examples/common/index.ts create mode 100644 examples/embeddable_examples/common/todo_saved_object_attributes.ts create mode 100644 examples/embeddable_examples/public/create_sample_data.ts create mode 100644 examples/embeddable_examples/public/todo/README.md create mode 100644 examples/embeddable_examples/public/todo/todo_ref_component.tsx create mode 100644 examples/embeddable_examples/public/todo/todo_ref_embeddable.tsx create mode 100644 examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx create mode 100644 examples/embeddable_examples/server/index.ts create mode 100644 examples/embeddable_examples/server/plugin.ts create mode 100644 examples/embeddable_examples/server/todo_saved_object.ts create mode 100644 src/plugins/embeddable/public/lib/embeddables/saved_object_embeddable.ts diff --git a/examples/embeddable_examples/common/index.ts b/examples/embeddable_examples/common/index.ts new file mode 100644 index 0000000000000..726420fb9bdc3 --- /dev/null +++ b/examples/embeddable_examples/common/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { TodoSavedObjectAttributes } from './todo_saved_object_attributes'; diff --git a/examples/embeddable_examples/common/todo_saved_object_attributes.ts b/examples/embeddable_examples/common/todo_saved_object_attributes.ts new file mode 100644 index 0000000000000..21b6df20fea90 --- /dev/null +++ b/examples/embeddable_examples/common/todo_saved_object_attributes.ts @@ -0,0 +1,26 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectAttributes } from '../../../src/core/types'; + +export interface TodoSavedObjectAttributes extends SavedObjectAttributes { + task: string; + icon?: string; + title?: string; +} diff --git a/examples/embeddable_examples/kibana.json b/examples/embeddable_examples/kibana.json index c70bc7009ff51..f446e7f31ac8e 100644 --- a/examples/embeddable_examples/kibana.json +++ b/examples/embeddable_examples/kibana.json @@ -3,7 +3,7 @@ "version": "0.0.1", "kibanaVersion": "kibana", "configPath": ["embeddable_examples"], - "server": false, + "server": true, "ui": true, "requiredPlugins": ["embeddable"], "optionalPlugins": [] diff --git a/examples/embeddable_examples/public/create_sample_data.ts b/examples/embeddable_examples/public/create_sample_data.ts new file mode 100644 index 0000000000000..bd5ade18aa91e --- /dev/null +++ b/examples/embeddable_examples/public/create_sample_data.ts @@ -0,0 +1,36 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsClientContract } from 'kibana/public'; +import { TodoSavedObjectAttributes } from '../common'; + +export async function createSampleData(client: SavedObjectsClientContract) { + await client.create( + 'todo', + { + task: 'Take the garbage out', + title: 'Garbage', + icon: 'trash', + }, + { + id: 'sample-todo-saved-object', + overwrite: true, + } + ); +} diff --git a/examples/embeddable_examples/public/index.ts b/examples/embeddable_examples/public/index.ts index 5fcd454b17a5c..4aac63fb52e2b 100644 --- a/examples/embeddable_examples/public/index.ts +++ b/examples/embeddable_examples/public/index.ts @@ -17,7 +17,6 @@ * under the License. */ -import { PluginInitializer } from 'kibana/public'; export { HELLO_WORLD_EMBEDDABLE, HelloWorldEmbeddable, @@ -26,18 +25,8 @@ export { export { ListContainer, LIST_CONTAINER } from './list_container'; export { TODO_EMBEDDABLE } from './todo'; -import { - EmbeddableExamplesPlugin, - EmbeddableExamplesSetupDependencies, - EmbeddableExamplesStartDependencies, -} from './plugin'; +import { EmbeddableExamplesPlugin } from './plugin'; export { SearchableListContainer, SEARCHABLE_LIST_CONTAINER } from './searchable_list_container'; export { MULTI_TASK_TODO_EMBEDDABLE } from './multi_task_todo'; - -export const plugin: PluginInitializer< - void, - void, - EmbeddableExamplesSetupDependencies, - EmbeddableExamplesStartDependencies -> = () => new EmbeddableExamplesPlugin(); +export const plugin = () => new EmbeddableExamplesPlugin(); diff --git a/examples/embeddable_examples/public/plugin.ts b/examples/embeddable_examples/public/plugin.ts index 31a3037332dda..75d34d2d6878f 100644 --- a/examples/embeddable_examples/public/plugin.ts +++ b/examples/embeddable_examples/public/plugin.ts @@ -21,12 +21,20 @@ import { EmbeddableSetup, EmbeddableStart } from '../../../src/plugins/embeddabl import { Plugin, CoreSetup, CoreStart } from '../../../src/core/public'; import { HelloWorldEmbeddableFactory, HELLO_WORLD_EMBEDDABLE } from './hello_world'; import { TODO_EMBEDDABLE, TodoEmbeddableFactory, TodoInput, TodoOutput } from './todo'; -import { MULTI_TASK_TODO_EMBEDDABLE, MultiTaskTodoEmbeddableFactory } from './multi_task_todo'; +import { + MULTI_TASK_TODO_EMBEDDABLE, + MultiTaskTodoEmbeddableFactory, + MultiTaskTodoInput, + MultiTaskTodoOutput, +} from './multi_task_todo'; import { SEARCHABLE_LIST_CONTAINER, SearchableListContainerFactory, } from './searchable_list_container'; import { LIST_CONTAINER, ListContainerFactory } from './list_container'; +import { createSampleData } from './create_sample_data'; +import { TodoRefInput, TodoRefOutput, TODO_REF_EMBEDDABLE } from './todo/todo_ref_embeddable'; +import { TodoRefEmbeddableFactory } from './todo/todo_ref_embeddable_factory'; export interface EmbeddableExamplesSetupDependencies { embeddable: EmbeddableSetup; @@ -36,9 +44,18 @@ export interface EmbeddableExamplesStartDependencies { embeddable: EmbeddableStart; } +export interface EmbeddableExamplesStart { + createSampleData: () => Promise; +} + export class EmbeddableExamplesPlugin implements - Plugin { + Plugin< + void, + EmbeddableExamplesStart, + EmbeddableExamplesSetupDependencies, + EmbeddableExamplesStartDependencies + > { public setup( core: CoreSetup, deps: EmbeddableExamplesSetupDependencies @@ -48,7 +65,7 @@ export class EmbeddableExamplesPlugin new HelloWorldEmbeddableFactory() ); - deps.embeddable.registerEmbeddableFactory( + deps.embeddable.registerEmbeddableFactory( MULTI_TASK_TODO_EMBEDDABLE, new MultiTaskTodoEmbeddableFactory() ); @@ -73,9 +90,21 @@ export class EmbeddableExamplesPlugin openModal: (await core.getStartServices())[0].overlays.openModal, })) ); + + deps.embeddable.registerEmbeddableFactory( + TODO_REF_EMBEDDABLE, + new TodoRefEmbeddableFactory(async () => ({ + savedObjectsClient: (await core.getStartServices())[0].savedObjects.client, + getEmbeddableFactory: (await core.getStartServices())[1].embeddable.getEmbeddableFactory, + })) + ); } - public start(core: CoreStart, deps: EmbeddableExamplesStartDependencies) {} + public start(core: CoreStart, deps: EmbeddableExamplesStartDependencies) { + return { + createSampleData: () => createSampleData(core.savedObjects.client), + }; + } public stop() {} } diff --git a/examples/embeddable_examples/public/todo/README.md b/examples/embeddable_examples/public/todo/README.md new file mode 100644 index 0000000000000..e782511f093b3 --- /dev/null +++ b/examples/embeddable_examples/public/todo/README.md @@ -0,0 +1,43 @@ +There are two examples in here: + - TodoEmbeddable + - TodoRefEmbeddable + + # TodoEmbeddable + + The first example you should review is the HelloWorldEmbeddable. That is as basic an embeddable as you can get. + This embeddable is the next step up - an embeddable that renders dynamic input data. The data is simple: + - a required task string + - an optional title + - an optional icon string + - an optional search string + +It also has output data, which is `hasMatch` - whether or not the search string has matched any input data. + +`hasMatch` is a better fit for output data than input data, because it's state that is _derived_ from input data. + +For example, if it was input data, you could create a TodoEmbeddable with input like this: + +```ts + todoEmbeddableFactory.create({ task: 'take out the garabage', search: 'garbage', hasMatch: false }); +``` + +That's wrong because there is actually a match from the search string inside the task. + +The TodoEmbeddable component itself doesn't do anything with the `hasMatch` variable other than set it, but +if you check out `SearchableListContainer`, you can see an example where this output data is being used. + +## TodoRefEmbeddable + +This is an example of an embeddable based off of a saved object. The input is just the `savedObjectId` and +the `search` string. It has even more output parameters, and this time, it does read it's own output parameters in +order to calculate `hasMatch`. + +Output: +```ts +{ + hasMatch: boolean, + savedAttributes?: TodoSavedAttributes +} +``` + +`savedAttributes` is optional because it's possible a TodoSavedObject could not be found with the given savedObjectId. diff --git a/examples/embeddable_examples/public/todo/todo_ref_component.tsx b/examples/embeddable_examples/public/todo/todo_ref_component.tsx new file mode 100644 index 0000000000000..8e0a17be1ec72 --- /dev/null +++ b/examples/embeddable_examples/public/todo/todo_ref_component.tsx @@ -0,0 +1,86 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; + +import { EuiText } from '@elastic/eui'; +import { EuiAvatar } from '@elastic/eui'; +import { EuiIcon } from '@elastic/eui'; +import { EuiFlexGrid } from '@elastic/eui'; +import { withEmbeddableSubscription } from '../../../../src/plugins/embeddable/public'; +import { TodoRefInput, TodoRefOutput, TodoRefEmbeddable } from './todo_ref_embeddable'; + +interface Props { + embeddable: TodoRefEmbeddable; + input: TodoRefInput; + output: TodoRefOutput; +} + +function wrapSearchTerms(task?: string, search?: string) { + if (!search) return task; + if (!task) return task; + const parts = task.split(new RegExp(`(${search})`, 'g')); + return parts.map((part, i) => + part === search ? ( + + {part} + + ) : ( + part + ) + ); +} + +export function TodoRefEmbeddableComponentInner({ + input: { search }, + output: { savedAttributes }, +}: Props) { + const icon = savedAttributes?.icon; + const title = savedAttributes?.title; + const task = savedAttributes?.task; + return ( + + + {icon ? ( + + ) : ( + + )} + + + + + +

{wrapSearchTerms(title || '', search)}

+
+
+ + {wrapSearchTerms(task, search)} + +
+
+
+ ); +} + +export const TodoRefEmbeddableComponent = withEmbeddableSubscription< + TodoRefInput, + TodoRefOutput, + TodoRefEmbeddable +>(TodoRefEmbeddableComponentInner); diff --git a/examples/embeddable_examples/public/todo/todo_ref_embeddable.tsx b/examples/embeddable_examples/public/todo/todo_ref_embeddable.tsx new file mode 100644 index 0000000000000..da2dfb2c1a290 --- /dev/null +++ b/examples/embeddable_examples/public/todo/todo_ref_embeddable.tsx @@ -0,0 +1,153 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Subscription } from 'rxjs'; +import { TodoSavedObjectAttributes } from 'examples/embeddable_examples/common'; +import { SavedObjectsClientContract } from 'kibana/public'; +import { + Embeddable, + IContainer, + EmbeddableOutput, + SavedObjectEmbeddableInput, +} from '../../../../src/plugins/embeddable/public'; +import { TodoRefEmbeddableComponent } from './todo_ref_component'; + +// Notice this is not the same value as the 'todo' saved object type. Many of our +// cases in prod today use the same value, but this is unnecessary. +export const TODO_REF_EMBEDDABLE = 'TODO_REF_EMBEDDABLE'; + +export interface TodoRefInput extends SavedObjectEmbeddableInput { + /** + * Optional search string which will be used to highlight search terms as + * well as calculate `output.hasMatch`. + */ + search?: string; +} + +export interface TodoRefOutput extends EmbeddableOutput { + /** + * Should be true if input.search is defined and the task or title contain + * search as a substring. + */ + hasMatch: boolean; + /** + * Will contain the saved object attributes of the Todo Saved Object that matches + * `input.savedObjectId`. If the id is invalid, this may be undefined. + */ + savedAttributes?: TodoSavedObjectAttributes; +} + +/** + * Returns whether any attributes contain the search string. If search is empty, true is returned. If + * there are no savedAttributes, false is returned. + * @param search - the search string + * @param savedAttributes - the saved object attributes for the saved object with id `input.savedObjectId` + */ +function getHasMatch(search?: string, savedAttributes?: TodoSavedObjectAttributes): boolean { + if (!search) return true; + if (!savedAttributes) return false; + return Boolean( + (savedAttributes.task && savedAttributes.task.match(search)) || + (savedAttributes.title && savedAttributes.title.match(search)) + ); +} + +/** + * This is an example of an embeddable that is backed by a saved object. It's essentially the + * same as `TodoEmbeddable` but that is "by value", while this is "by reference". + */ +export class TodoRefEmbeddable extends Embeddable { + public readonly type = TODO_REF_EMBEDDABLE; + private subscription: Subscription; + private node?: HTMLElement; + private savedObjectsClient: SavedObjectsClientContract; + private savedObjectId?: string; + + constructor( + initialInput: TodoRefInput, + { + parent, + savedObjectsClient, + }: { + parent?: IContainer; + savedObjectsClient: SavedObjectsClientContract; + } + ) { + super(initialInput, { hasMatch: false }, parent); + this.savedObjectsClient = savedObjectsClient; + + this.subscription = this.getInput$().subscribe(async () => { + // There is a little more work today for this embeddable because it has + // more output it needs to update in response to input state changes. + let savedAttributes: TodoSavedObjectAttributes | undefined; + + // Since this is an expensive task, we save a local copy of the previous + // savedObjectId locally and only retrieve the new saved object if the id + // actually changed. + if (this.savedObjectId !== this.input.savedObjectId) { + this.savedObjectId = this.input.savedObjectId; + const todoSavedObject = await this.savedObjectsClient.get( + 'todo', + this.input.savedObjectId + ); + savedAttributes = todoSavedObject?.attributes; + } + + // The search string might have changed as well so we need to make sure we recalculate + // hasMatch. + this.updateOutput({ + hasMatch: getHasMatch(this.input.search, savedAttributes), + savedAttributes, + }); + }); + } + + public render(node: HTMLElement) { + if (this.node) { + ReactDOM.unmountComponentAtNode(this.node); + } + this.node = node; + ReactDOM.render(, node); + } + + /** + * Lets re-sync our saved object to make sure it's up to date! + */ + public async reload() { + this.savedObjectId = this.input.savedObjectId; + const todoSavedObject = await this.savedObjectsClient.get( + 'todo', + this.input.savedObjectId + ); + const savedAttributes = todoSavedObject?.attributes; + this.updateOutput({ + hasMatch: getHasMatch(this.input.search, savedAttributes), + savedAttributes, + }); + } + + public destroy() { + super.destroy(); + this.subscription.unsubscribe(); + if (this.node) { + ReactDOM.unmountComponentAtNode(this.node); + } + } +} diff --git a/examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx b/examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx new file mode 100644 index 0000000000000..e585ddd89674f --- /dev/null +++ b/examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx @@ -0,0 +1,83 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { i18n } from '@kbn/i18n'; +import { SavedObjectsClientContract } from 'kibana/public'; +import { TodoSavedObjectAttributes } from 'examples/embeddable_examples/common'; +import { + IContainer, + EmbeddableStart, + ErrorEmbeddable, + EmbeddableFactoryDefinition, +} from '../../../../src/plugins/embeddable/public'; +import { + TodoRefEmbeddable, + TODO_REF_EMBEDDABLE, + TodoRefInput, + TodoRefOutput, +} from './todo_ref_embeddable'; + +interface StartServices { + getEmbeddableFactory: EmbeddableStart['getEmbeddableFactory']; + savedObjectsClient: SavedObjectsClientContract; +} + +export class TodoRefEmbeddableFactory + implements + EmbeddableFactoryDefinition< + TodoRefInput, + TodoRefOutput, + TodoRefEmbeddable, + TodoSavedObjectAttributes + > { + public readonly type = TODO_REF_EMBEDDABLE; + public readonly savedObjectMetaData = { + name: 'Todo', + includeFields: ['task', 'icon', 'title'], + type: 'todo', + getIconForSavedObject: () => 'pencil', + }; + + constructor(private getStartServices: () => Promise) {} + + public async isEditable() { + return true; + } + + public createFromSavedObject = ( + savedObjectId: string, + input: Partial & { id: string }, + parent?: IContainer + ): Promise => { + return this.create({ ...input, savedObjectId }, parent); + }; + + public async create(input: TodoRefInput, parent?: IContainer) { + const { savedObjectsClient } = await this.getStartServices(); + return new TodoRefEmbeddable(input, { + parent, + savedObjectsClient, + }); + } + + public getDisplayName() { + return i18n.translate('embeddableExamples.todo.displayName', { + defaultMessage: 'Todo (by reference)', + }); + } +} diff --git a/examples/embeddable_examples/server/index.ts b/examples/embeddable_examples/server/index.ts new file mode 100644 index 0000000000000..9ddc3bc2cf715 --- /dev/null +++ b/examples/embeddable_examples/server/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { PluginInitializer } from 'kibana/server'; + +import { EmbeddableExamplesPlugin } from './plugin'; + +export const plugin: PluginInitializer = () => new EmbeddableExamplesPlugin(); diff --git a/examples/embeddable_examples/server/plugin.ts b/examples/embeddable_examples/server/plugin.ts new file mode 100644 index 0000000000000..d956b834d0d3c --- /dev/null +++ b/examples/embeddable_examples/server/plugin.ts @@ -0,0 +1,31 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Plugin, CoreSetup, CoreStart } from 'kibana/server'; +import { todoSavedObject } from './todo_saved_object'; + +export class EmbeddableExamplesPlugin implements Plugin { + public setup(core: CoreSetup) { + core.savedObjects.registerType(todoSavedObject); + } + + public start(core: CoreStart) {} + + public stop() {} +} diff --git a/examples/embeddable_examples/server/todo_saved_object.ts b/examples/embeddable_examples/server/todo_saved_object.ts new file mode 100644 index 0000000000000..0f67c53cfa3e1 --- /dev/null +++ b/examples/embeddable_examples/server/todo_saved_object.ts @@ -0,0 +1,40 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SavedObjectsType } from 'kibana/server'; + +export const todoSavedObject: SavedObjectsType = { + name: 'todo', + hidden: false, + namespaceAgnostic: true, + mappings: { + properties: { + title: { + type: 'keyword', + }, + task: { + type: 'text', + }, + icon: { + type: 'keyword', + }, + }, + }, + migrations: {}, +}; diff --git a/examples/embeddable_examples/tsconfig.json b/examples/embeddable_examples/tsconfig.json index 091130487791b..7fa03739119b4 100644 --- a/examples/embeddable_examples/tsconfig.json +++ b/examples/embeddable_examples/tsconfig.json @@ -6,6 +6,7 @@ }, "include": [ "index.ts", + "common/**/*.ts", "public/**/*.ts", "public/**/*.tsx", "server/**/*.ts", diff --git a/examples/embeddable_explorer/public/plugin.tsx b/examples/embeddable_explorer/public/plugin.tsx index 7c75b108d9912..bba1b1748e207 100644 --- a/examples/embeddable_explorer/public/plugin.tsx +++ b/examples/embeddable_explorer/public/plugin.tsx @@ -18,6 +18,7 @@ */ import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; +import { EmbeddableExamplesStart } from 'examples/embeddable_examples/public/plugin'; import { UiActionsService } from '../../../src/plugins/ui_actions/public'; import { EmbeddableStart } from '../../../src/plugins/embeddable/public'; import { Start as InspectorStart } from '../../../src/plugins/inspector/public'; @@ -26,6 +27,7 @@ interface StartDeps { uiActions: UiActionsService; embeddable: EmbeddableStart; inspector: InspectorStart; + embeddableExamples: EmbeddableExamplesStart; } export class EmbeddableExplorerPlugin implements Plugin { @@ -36,6 +38,7 @@ export class EmbeddableExplorerPlugin implements Plugin { }); }; - public onReplacePanel = async (id: string, type: string, name: string) => { + public onReplacePanel = async (savedObjectId: string, type: string, name: string) => { const originalPanels = this.props.container.getInput().panels; const filteredPanels = { ...originalPanels }; @@ -76,7 +77,9 @@ export class ReplacePanelFlyout extends React.Component { const nny = (filteredPanels[this.props.panelToRemove.id] as DashboardPanelState).gridData.y; // add the new view - const newObj = await this.props.container.addSavedObjectEmbeddable(type, id); + const newObj = await this.props.container.addNewEmbeddable(type, { + savedObjectId, + }); const finalPanels = _.cloneDeep(this.props.container.getInput().panels); (finalPanels[newObj.id] as DashboardPanelState).gridData.w = nnw; diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index babd1fac274eb..283fe9f0a83a4 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -53,6 +53,7 @@ import { isErrorEmbeddable, openAddPanelFlyout, ViewMode, + SavedObjectEmbeddableInput, ContainerOutput, } from '../../../embeddable/public'; import { NavAction, SavedDashboardPanel } from '../types'; @@ -394,7 +395,7 @@ export class DashboardAppController { if ($routeParams[DashboardConstants.ADD_EMBEDDABLE_TYPE]) { const type = $routeParams[DashboardConstants.ADD_EMBEDDABLE_TYPE]; const id = $routeParams[DashboardConstants.ADD_EMBEDDABLE_ID]; - container.addSavedObjectEmbeddable(type, id); + container.addNewEmbeddable(type, { savedObjectId: id }); removeQueryParam(history, DashboardConstants.ADD_EMBEDDABLE_TYPE); removeQueryParam(history, DashboardConstants.ADD_EMBEDDABLE_ID); } diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx index 7f3a2913daac3..50089f1f061f4 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container.tsx @@ -55,7 +55,7 @@ export interface DashboardContainerInput extends ContainerInput { description?: string; isFullScreenMode: boolean; panels: { - [panelId: string]: DashboardPanelState; + [panelId: string]: DashboardPanelState; }; isEmptyState?: boolean; } diff --git a/src/plugins/dashboard/public/application/embeddable/types.ts b/src/plugins/dashboard/public/application/embeddable/types.ts index 3df305b0d7f1b..6d0221cb10e8b 100644 --- a/src/plugins/dashboard/public/application/embeddable/types.ts +++ b/src/plugins/dashboard/public/application/embeddable/types.ts @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import { SavedObjectEmbeddableInput } from 'src/plugins/embeddable/public'; import { PanelState, EmbeddableInput } from '../../embeddable_plugin'; export type PanelId = string; export type SavedObjectId = string; @@ -28,7 +29,8 @@ export interface GridData { i: string; } -export interface DashboardPanelState - extends PanelState { +export interface DashboardPanelState< + TEmbeddableInput extends EmbeddableInput | SavedObjectEmbeddableInput = SavedObjectEmbeddableInput +> extends PanelState { readonly gridData: GridData; } diff --git a/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.test.ts b/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.test.ts index 447563bbfbcfa..25ce203332422 100644 --- a/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.test.ts +++ b/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.test.ts @@ -23,11 +23,6 @@ import { } from './embeddable_saved_object_converters'; import { SavedDashboardPanel } from '../../types'; import { DashboardPanelState } from '../embeddable'; -import { EmbeddableInput } from 'src/plugins/embeddable/public'; - -interface CustomInput extends EmbeddableInput { - something: string; -} test('convertSavedDashboardPanelToPanelState', () => { const savedDashboardPanel: SavedDashboardPanel = { @@ -58,8 +53,8 @@ test('convertSavedDashboardPanelToPanelState', () => { explicitInput: { something: 'hi!', id: '123', + savedObjectId: 'savedObjectId', }, - savedObjectId: 'savedObjectId', type: 'search', }); }); @@ -86,7 +81,7 @@ test('convertSavedDashboardPanelToPanelState does not include undefined id', () }); test('convertPanelStateToSavedDashboardPanel', () => { - const dashboardPanel: DashboardPanelState = { + const dashboardPanel: DashboardPanelState = { gridData: { x: 0, y: 0, @@ -94,10 +89,10 @@ test('convertPanelStateToSavedDashboardPanel', () => { w: 15, i: '123', }, - savedObjectId: 'savedObjectId', explicitInput: { something: 'hi!', id: '123', + savedObjectId: 'savedObjectId', }, type: 'search', }; @@ -121,7 +116,7 @@ test('convertPanelStateToSavedDashboardPanel', () => { }); test('convertPanelStateToSavedDashboardPanel will not add an undefined id when not needed', () => { - const dashboardPanel: DashboardPanelState = { + const dashboardPanel: DashboardPanelState = { gridData: { x: 0, y: 0, diff --git a/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.ts b/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.ts index 01cd55df0d8e9..b19ef31ccb9ac 100644 --- a/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.ts +++ b/src/plugins/dashboard/public/application/lib/embeddable_saved_object_converters.ts @@ -19,6 +19,7 @@ import { omit } from 'lodash'; import { SavedDashboardPanel } from '../../types'; import { DashboardPanelState } from '../embeddable'; +import { SavedObjectEmbeddableInput } from '../../embeddable_plugin'; export function convertSavedDashboardPanelToPanelState( savedDashboardPanel: SavedDashboardPanel @@ -26,9 +27,9 @@ export function convertSavedDashboardPanelToPanelState( return { type: savedDashboardPanel.type, gridData: savedDashboardPanel.gridData, - ...(savedDashboardPanel.id !== undefined && { savedObjectId: savedDashboardPanel.id }), explicitInput: { id: savedDashboardPanel.panelIndex, + ...(savedDashboardPanel.id !== undefined && { savedObjectId: savedDashboardPanel.id }), ...(savedDashboardPanel.title !== undefined && { title: savedDashboardPanel.title }), ...savedDashboardPanel.embeddableConfig, }, @@ -42,13 +43,14 @@ export function convertPanelStateToSavedDashboardPanel( const customTitle: string | undefined = panelState.explicitInput.title ? (panelState.explicitInput.title as string) : undefined; + const savedObjectId = (panelState.explicitInput as SavedObjectEmbeddableInput).savedObjectId; return { version, type: panelState.type, gridData: panelState.gridData, panelIndex: panelState.explicitInput.id, - embeddableConfig: omit(panelState.explicitInput, 'id'), + embeddableConfig: omit(panelState.explicitInput, ['id', 'savedObjectId']), ...(customTitle && { title: customTitle }), - ...(panelState.savedObjectId !== undefined && { id: panelState.savedObjectId }), + ...(savedObjectId !== undefined && { id: savedObjectId }), }; } diff --git a/src/plugins/embeddable/public/index.ts b/src/plugins/embeddable/public/index.ts index 23275fbe8e8f0..bdb7bfbddc308 100644 --- a/src/plugins/embeddable/public/index.ts +++ b/src/plugins/embeddable/public/index.ts @@ -61,6 +61,8 @@ export { PropertySpec, ViewMode, withEmbeddableSubscription, + SavedObjectEmbeddableInput, + isSavedObjectEmbeddableInput, } from './lib'; export function plugin(initializerContext: PluginInitializerContext) { diff --git a/src/plugins/embeddable/public/lib/containers/container.ts b/src/plugins/embeddable/public/lib/containers/container.ts index 4ab74e1883917..ffbe75f66b581 100644 --- a/src/plugins/embeddable/public/lib/containers/container.ts +++ b/src/plugins/embeddable/public/lib/containers/container.ts @@ -30,6 +30,7 @@ import { import { IContainer, ContainerInput, ContainerOutput, PanelState } from './i_container'; import { PanelNotFoundError, EmbeddableFactoryNotFoundError } from '../errors'; import { EmbeddableStart } from '../../plugin'; +import { isSavedObjectEmbeddableInput } from '../embeddables/saved_object_embeddable'; const getKeys = (o: T): Array => Object.keys(o) as Array; @@ -98,17 +99,6 @@ export abstract class Container< return this.createAndSaveEmbeddable(type, panelState); } - public async addSavedObjectEmbeddable< - TEmbeddableInput extends EmbeddableInput = EmbeddableInput, - TEmbeddable extends IEmbeddable = IEmbeddable - >(type: string, savedObjectId: string): Promise { - const factory = this.getFactory(type) as EmbeddableFactory; - const panelState = this.createNewPanelState(factory); - panelState.savedObjectId = savedObjectId; - - return this.createAndSaveEmbeddable(type, panelState); - } - public removeEmbeddable(embeddableId: string) { // Just a shortcut for removing the panel from input state, all internal state will get cleaned up naturally // by the listener. @@ -304,8 +294,10 @@ export abstract class Container< throw new EmbeddableFactoryNotFoundError(panel.type); } - embeddable = panel.savedObjectId - ? await factory.createFromSavedObject(panel.savedObjectId, inputForChild, this) + // TODO: lets get rid of this distinction with factories, I don't think it will be needed + // anymore after this change. + embeddable = isSavedObjectEmbeddableInput(inputForChild) + ? await factory.createFromSavedObject(inputForChild.savedObjectId, inputForChild, this) : await factory.create(inputForChild, this); } catch (e) { embeddable = new ErrorEmbeddable(e, { id: panel.explicitInput.id }, this); @@ -323,23 +315,6 @@ export abstract class Container< return; } - if (embeddable.getOutput().savedObjectId) { - this.updateInput({ - panels: { - ...this.input.panels, - [panel.explicitInput.id]: { - ...this.input.panels[panel.explicitInput.id], - ...(embeddable.getOutput().savedObjectId - ? { savedObjectId: embeddable.getOutput().savedObjectId } - : undefined), - explicitInput: { - ...this.input.panels[panel.explicitInput.id].explicitInput, - }, - }, - }, - } as Partial); - } - this.children[embeddable.id] = embeddable; this.updateOutput({ embeddableLoaded: { diff --git a/src/plugins/embeddable/public/lib/containers/i_container.ts b/src/plugins/embeddable/public/lib/containers/i_container.ts index 7da5f92ec92c1..31a7cd4f2e559 100644 --- a/src/plugins/embeddable/public/lib/containers/i_container.ts +++ b/src/plugins/embeddable/public/lib/containers/i_container.ts @@ -25,9 +25,7 @@ import { IEmbeddable, } from '../embeddables'; -export interface PanelState { - savedObjectId?: string; - +export interface PanelState { // The type of embeddable in this panel. Will be used to find the factory in which to // load the embeddable. type: string; @@ -89,17 +87,6 @@ export interface IContainer< */ removeEmbeddable(embeddableId: string): void; - /** - * Adds a new embeddable that is backed off of a saved object. - */ - addSavedObjectEmbeddable< - EEI extends EmbeddableInput = EmbeddableInput, - E extends Embeddable = Embeddable - >( - type: string, - savedObjectId: string - ): Promise; - /** * Adds a new embeddable to the container. `explicitInput` may partially specify the required embeddable input, * but the remainder must come from inherited container state. diff --git a/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts b/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts index 6345c34b0dda2..c0fb98d2559db 100644 --- a/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts +++ b/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts @@ -26,6 +26,11 @@ import { TriggerContextMapping } from '../../../../ui_actions/public'; export interface EmbeddableInput { viewMode?: ViewMode; title?: string; + /** + * Note this is not a saved object id. It is used to uniquely identify this + * Embeddable instance from others (e.g. inside a container). It's possible to + * have two Embeddables where everything else is the same but the id. + */ id: string; lastReloadRequestTime?: number; hidePanelTitles?: boolean; @@ -44,6 +49,8 @@ export interface EmbeddableInput { * Whether this embeddable should not execute triggers. */ disableTriggers?: boolean; + + [key: string]: unknown; } export interface EmbeddableOutput { diff --git a/src/plugins/embeddable/public/lib/embeddables/index.ts b/src/plugins/embeddable/public/lib/embeddables/index.ts index 4d6ab37a50c05..ad8b9c35e60be 100644 --- a/src/plugins/embeddable/public/lib/embeddables/index.ts +++ b/src/plugins/embeddable/public/lib/embeddables/index.ts @@ -25,3 +25,4 @@ export { ErrorEmbeddable, isErrorEmbeddable } from './error_embeddable'; export { withEmbeddableSubscription } from './with_subscription'; export { EmbeddableFactoryRenderer } from './embeddable_factory_renderer'; export { EmbeddableRoot } from './embeddable_root'; +export * from './saved_object_embeddable'; diff --git a/src/plugins/embeddable/public/lib/embeddables/saved_object_embeddable.ts b/src/plugins/embeddable/public/lib/embeddables/saved_object_embeddable.ts new file mode 100644 index 0000000000000..6ca1800b16de4 --- /dev/null +++ b/src/plugins/embeddable/public/lib/embeddables/saved_object_embeddable.ts @@ -0,0 +1,30 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { EmbeddableInput } from '..'; + +export interface SavedObjectEmbeddableInput extends EmbeddableInput { + savedObjectId: string; +} + +export function isSavedObjectEmbeddableInput( + input: EmbeddableInput | SavedObjectEmbeddableInput +): input is SavedObjectEmbeddableInput { + return (input as SavedObjectEmbeddableInput).savedObjectId !== undefined; +} diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx index 50d8bcef8506c..5bf3f69a95c30 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx @@ -33,6 +33,7 @@ import { EmbeddableStart } from 'src/plugins/embeddable/public'; import { IContainer } from '../../../../containers'; import { EmbeddableFactoryNotFoundError } from '../../../../errors'; import { SavedObjectFinderCreateNew } from './saved_object_finder_create_new'; +import { SavedObjectEmbeddableInput } from '../../../../embeddables'; interface Props { onClose: () => void; @@ -98,8 +99,18 @@ export class AddPanelFlyout extends React.Component { } }; - public onAddPanel = async (id: string, type: string, name: string) => { - this.props.container.addSavedObjectEmbeddable(type, id); + public onAddPanel = async (savedObjectId: string, savedObjectType: string, name: string) => { + const factoryForSavedObjectType = [...this.props.getAllFactories()].find( + factory => factory.savedObjectMetaData && factory.savedObjectMetaData.type === savedObjectType + ); + if (!factoryForSavedObjectType) { + throw new EmbeddableFactoryNotFoundError(savedObjectType); + } + + this.props.container.addNewEmbeddable( + factoryForSavedObjectType.type, + { savedObjectId } + ); this.showToast(name); }; diff --git a/src/plugins/embeddable/public/tests/container.test.ts b/src/plugins/embeddable/public/tests/container.test.ts index 87076399465d3..1aae43550ec6f 100644 --- a/src/plugins/embeddable/public/tests/container.test.ts +++ b/src/plugins/embeddable/public/tests/container.test.ts @@ -641,8 +641,7 @@ test('container stores ErrorEmbeddables when a saved object cannot be found', as panels: { '123': { type: 'vis', - explicitInput: { id: '123' }, - savedObjectId: '456', + explicitInput: { id: '123', savedObjectId: '456' }, }, }, viewMode: ViewMode.EDIT, @@ -663,8 +662,7 @@ test('ErrorEmbeddables get updated when parent does', async done => { panels: { '123': { type: 'vis', - explicitInput: { id: '123' }, - savedObjectId: '456', + explicitInput: { id: '123', savedObjectId: '456' }, }, }, viewMode: ViewMode.EDIT, diff --git a/test/examples/embeddables/adding_children.ts b/test/examples/embeddables/adding_children.ts index 110b8ce573332..5fe88b5dd33f0 100644 --- a/test/examples/embeddables/adding_children.ts +++ b/test/examples/embeddables/adding_children.ts @@ -23,6 +23,7 @@ import { PluginFunctionalProviderContext } from 'test/plugin_functional/services // eslint-disable-next-line import/no-default-export export default function({ getService }: PluginFunctionalProviderContext) { const testSubjects = getService('testSubjects'); + const flyout = getService('flyout'); describe('creating and adding children', () => { before(async () => { @@ -39,5 +40,15 @@ export default function({ getService }: PluginFunctionalProviderContext) { const tasks = await testSubjects.getVisibleTextAll('todoEmbeddableTask'); expect(tasks).to.eql(['Goes out on Wednesdays!', 'new task']); }); + + it('Can add a child backed off a saved object', async () => { + await testSubjects.click('embeddablePanelToggleMenuIcon'); + await testSubjects.click('embeddablePanelAction-ACTION_ADD_PANEL'); + await testSubjects.click('savedObjectTitleGarbage'); + await testSubjects.moveMouseTo('euiFlyoutCloseButton'); + await flyout.ensureClosed('dashboardAddPanel'); + const tasks = await testSubjects.getVisibleTextAll('todoEmbeddableTask'); + expect(tasks).to.eql(['Goes out on Wednesdays!', 'new task', 'Take the garbage out']); + }); }); } diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_input.ts b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_input.ts index bb8951680be35..37ef8cad948cb 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_input.ts +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/public/np_ready/public/app/dashboard_input.ts @@ -47,7 +47,7 @@ export const dashboardInput: DashboardContainerInput = { explicitInput: { id: '2', firstName: 'Sue', - } as any, + }, }, '822cd0f0-ce7c-419d-aeaa-1171cf452745': { gridData: { @@ -60,8 +60,8 @@ export const dashboardInput: DashboardContainerInput = { type: 'visualization', explicitInput: { id: '822cd0f0-ce7c-419d-aeaa-1171cf452745', + savedObjectId: '3fe22200-3dcb-11e8-8660-4d65aa086b3c', }, - savedObjectId: '3fe22200-3dcb-11e8-8660-4d65aa086b3c', }, '66f0a265-7b06-4974-accd-d05f74f7aa82': { gridData: { @@ -74,8 +74,8 @@ export const dashboardInput: DashboardContainerInput = { type: 'visualization', explicitInput: { id: '66f0a265-7b06-4974-accd-d05f74f7aa82', + savedObjectId: '4c0f47e0-3dcd-11e8-8660-4d65aa086b3c', }, - savedObjectId: '4c0f47e0-3dcd-11e8-8660-4d65aa086b3c', }, 'b2861741-40b9-4dc8-b82b-080c6e29a551': { gridData: { @@ -88,8 +88,8 @@ export const dashboardInput: DashboardContainerInput = { type: 'search', explicitInput: { id: 'b2861741-40b9-4dc8-b82b-080c6e29a551', + savedObjectId: 'be5accf0-3dca-11e8-8660-4d65aa086b3c', }, - savedObjectId: 'be5accf0-3dca-11e8-8660-4d65aa086b3c', }, }, isFullScreenMode: false, From 3a91e713aa3d403d7b440c5ba128d40e78f8449f Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Wed, 15 Apr 2020 11:13:28 -0400 Subject: [PATCH 27/80] Fixes Keyboard Shortcuts help extension (#63583) --- x-pack/legacy/plugins/canvas/public/application.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/canvas/public/application.tsx b/x-pack/legacy/plugins/canvas/public/application.tsx index 79b3918fef99b..f75b3b427c41b 100644 --- a/x-pack/legacy/plugins/canvas/public/application.tsx +++ b/x-pack/legacy/plugins/canvas/public/application.tsx @@ -104,8 +104,9 @@ export const initializeCanvas = async ( href: getDocumentationLinks().canvas, }, ], - content: domNode => () => { + content: domNode => { ReactDOM.render(, domNode); + return () => ReactDOM.unmountComponentAtNode(domNode); }, }); From bb0d03fe11b9ebba78f14a4a39a788fb0ce04abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Wed, 15 Apr 2020 11:16:14 -0400 Subject: [PATCH 28/80] Fix alerting UI flaky tests (#62817) * Use of testSubjects.setValue * Add waitForEditAlertFlyout * Fix some extra flakiness * Test half second sleep to confirm cause of flakiness * Revert 02417961f9ef0b0068cbeeaf17110844f133c189 * Try clearWithKeyboard * Fix test failures * Fix uptime tests * Revert uptime changes --- .../threshold/expression.tsx | 1 + .../action_connector_form/action_form.tsx | 1 + .../apps/triggers_actions_ui/alerts.ts | 64 ++++++++----------- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx index 5bbec1221a3ac..7557b17f5b67d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_alert_types/threshold/expression.tsx @@ -328,6 +328,7 @@ export const IndexThresholdAlertTypeExpression: React.FunctionComponent { setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); setAddModalVisibility(true); diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts index c94e7116c5cea..bce8e08cd16d3 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts @@ -17,6 +17,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'triggersActionsUI', 'header']); const supertest = getService('supertest'); const find = getService('find'); + const retry = getService('retry'); async function createAlert(overwrites: Record = {}) { const { body: createdAlert } = await supertest @@ -38,8 +39,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { return createdAlert; } - // FLAKY: https://github.com/elastic/kibana/issues/62472 - describe.skip('alerts', function() { + describe('alerts', function() { before(async () => { await pageObjects.common.navigateToApp('triggersActions'); await testSubjects.click('alertsTab'); @@ -48,10 +48,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should create an alert', async () => { const alertName = generateUniqueKey(); await pageObjects.triggersActionsUI.clickCreateAlertButton(); - const nameInput = await testSubjects.find('alertNameInput'); - await nameInput.click(); - await nameInput.clearValue(); - await nameInput.type(alertName); + await testSubjects.setValue('alertNameInput', alertName); await testSubjects.click('.index-threshold-SelectOption'); await testSubjects.click('selectIndexExpression'); const comboBox = await find.byCssSelector('#indexSelectSearchBox'); @@ -60,28 +57,28 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const filterSelectItem = await find.byCssSelector(`.euiFilterSelectItem`); await filterSelectItem.click(); await testSubjects.click('thresholdAlertTimeFieldSelect'); - const fieldOptions = await find.allByCssSelector('#thresholdTimeField option'); - await fieldOptions[1].click(); + await retry.try(async () => { + const fieldOptions = await find.allByCssSelector('#thresholdTimeField option'); + expect(fieldOptions[1]).not.to.be(undefined); + await fieldOptions[1].click(); + }); + await testSubjects.click('closePopover'); // need this two out of popup clicks to close them + const nameInput = await testSubjects.find('alertNameInput'); await nameInput.click(); - // test for normal connector - await testSubjects.click('.webhook-ActionTypeSelectOption'); - const webhookBodyInput = await find.byCssSelector('.ace_text-input'); - await webhookBodyInput.focus(); - await webhookBodyInput.type('{\\"test\\":1}'); - - await testSubjects.click('addAlertActionButton'); - // pre-configured connector is loaded an displayed correctly await testSubjects.click('.slack-ActionTypeSelectOption'); - expect(await (await find.byCssSelector('#my-slack1')).isDisplayed()).to.be(true); - const loggingMessageInput = await testSubjects.find('slackMessageTextArea'); - await loggingMessageInput.click(); - await loggingMessageInput.clearValue(); - await loggingMessageInput.type('test message'); + await testSubjects.click('createActionConnectorButton'); + const slackConnectorName = generateUniqueKey(); + await testSubjects.setValue('nameInput', slackConnectorName); + await testSubjects.setValue('slackWebhookUrlInput', 'https://test'); + await find.clickByCssSelector('[data-test-subj="saveActionButtonModal"]:not(disabled)'); + const createdConnectorToastTitle = await pageObjects.common.closeToast(); + expect(createdConnectorToastTitle).to.eql(`Created '${slackConnectorName}'`); + await testSubjects.setValue('slackMessageTextArea', 'test message'); await testSubjects.click('messageAddVariableButton'); - const variableMenuButton = await testSubjects.find('variableMenuButton-0'); - await variableMenuButton.click(); + await testSubjects.click('variableMenuButton-0'); + await testSubjects.click('saveAlertButton'); const toastTitle = await pageObjects.common.closeToast(); expect(toastTitle).to.eql(`Saved '${alertName}'`); @@ -132,7 +129,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should edit an alert', async () => { const createdAlert = await createAlert({ alertTypeId: '.index-threshold', - name: 'new alert', + name: generateUniqueKey(), params: { aggType: 'count', termSize: 5, @@ -160,11 +157,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const editLink = await testSubjects.findAll('alertsTableCell-editLink'); await editLink[0].click(); - const updatedAlertName = 'Changed Alert Name'; - const nameInputToUpdate = await testSubjects.find('alertNameInput'); - await nameInputToUpdate.click(); - await nameInputToUpdate.clearValue(); - await nameInputToUpdate.type(updatedAlertName); + const updatedAlertName = `Changed Alert Name ${generateUniqueKey()}`; + await testSubjects.setValue('alertNameInput', updatedAlertName, { clearWithKeyboard: true }); await find.clickByCssSelector('[data-test-subj="saveEditedAlertButton"]:not(disabled)'); @@ -217,10 +211,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const editLink = await testSubjects.findAll('alertsTableCell-editLink'); await editLink[0].click(); - const throttleInputToSetInitialValue = await testSubjects.find('throttleInput'); - await throttleInputToSetInitialValue.click(); - await throttleInputToSetInitialValue.clearValue(); - await throttleInputToSetInitialValue.type('1'); + await testSubjects.setValue('throttleInput', '1', { clearWithKeyboard: true }); await find.clickByCssSelector('[data-test-subj="saveEditedAlertButton"]:not(disabled)'); @@ -308,11 +299,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const editLink = await testSubjects.findAll('alertsTableCell-editLink'); await editLink[0].click(); - const updatedAlertName = 'Changed Alert Name'; - const nameInputToUpdate = await testSubjects.find('alertNameInput'); - await nameInputToUpdate.click(); - await nameInputToUpdate.clearValue(); - await nameInputToUpdate.type(updatedAlertName); + const updatedAlertName = `Changed Alert Name ${generateUniqueKey()}`; + await testSubjects.setValue('alertNameInput', updatedAlertName); await testSubjects.click('cancelSaveEditedAlertButton'); await find.waitForDeletedByCssSelector('[data-test-subj="cancelSaveEditedAlertButton"]'); From 08aa21419046e52ab47a78b03e8076c9304e21bc Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Wed, 15 Apr 2020 11:19:46 -0400 Subject: [PATCH 29/80] Endpoint: Redux types (#63413) ## Summary Changes some types around so modifying redux state or actions will cause type errors * the state and action types aren't using `Immutable` directly. This means that you can instantiate them and mutate them * the `state` and `action` params received by all reducers will be automatically cast to `Immutable` * reducers can return either `Immutable` or regular versions of `state` * some code may be mutating redux state directly, this is being ignored (at least for now) --- .../plugins/endpoint/common/generate_data.ts | 9 +- .../models/policy_config.ts} | 6 +- x-pack/plugins/endpoint/common/types.ts | 125 ++++++++++++++++++ .../endpoint/models/index_pattern.ts | 16 +++ .../endpoint/models/policy_details_config.ts | 2 +- .../store/alerts/alert_details.test.ts | 5 +- .../endpoint/store/alerts/alert_list.test.ts | 6 +- .../alerts/alert_list_pagination.test.ts | 3 +- .../endpoint/store/alerts/reducer.ts | 8 +- .../endpoint/store/alerts/selectors.ts | 48 +++---- .../endpoint/store/hosts/action.ts | 8 +- .../endpoint/store/hosts/middleware.test.ts | 11 +- .../endpoint/store/hosts/reducer.ts | 5 +- .../endpoint/store/hosts/selectors.ts | 24 ++-- .../store/immutable_combine_reducers.ts | 13 ++ .../endpoint/store/policy_details/action.ts | 3 +- .../store/policy_details/index.test.ts | 4 +- .../store/policy_details/middleware.ts | 12 +- .../endpoint/store/policy_details/reducer.ts | 25 +++- .../store/policy_details/selectors.ts | 15 ++- .../endpoint/store/policy_list/action.ts | 3 +- .../endpoint/store/policy_list/index.test.ts | 10 +- .../endpoint/store/policy_list/reducer.ts | 19 +-- .../endpoint/store/policy_list/selectors.ts | 19 +-- .../store/policy_list/services/ingest.ts | 8 +- .../applications/endpoint/store/reducer.ts | 7 +- .../public/applications/endpoint/types.ts | 92 ++++--------- .../endpoint/view/alerts/index_search_bar.tsx | 11 +- .../endpoint/view/hosts/index.tsx | 6 +- .../view/policy/policy_forms/config_form.tsx | 46 ++++--- .../policy/policy_forms/events/checkbox.tsx | 2 +- .../view/policy/policy_forms/events/linux.tsx | 45 +++---- .../view/policy/policy_forms/events/mac.tsx | 43 +++--- .../policy/policy_forms/events/windows.tsx | 47 +++---- .../policy_forms/protections/malware.tsx | 33 ++--- .../endpoint/view/policy/policy_list.tsx | 10 +- 36 files changed, 444 insertions(+), 305 deletions(-) rename x-pack/plugins/endpoint/{public/applications/endpoint/models/policy.ts => common/models/policy_config.ts} (89%) create mode 100644 x-pack/plugins/endpoint/public/applications/endpoint/models/index_pattern.ts create mode 100644 x-pack/plugins/endpoint/public/applications/endpoint/store/immutable_combine_reducers.ts diff --git a/x-pack/plugins/endpoint/common/generate_data.ts b/x-pack/plugins/endpoint/common/generate_data.ts index 3f783d90e577d..1978d780f54f5 100644 --- a/x-pack/plugins/endpoint/common/generate_data.ts +++ b/x-pack/plugins/endpoint/common/generate_data.ts @@ -6,11 +6,8 @@ import uuid from 'uuid'; import seedrandom from 'seedrandom'; -import { AlertEvent, EndpointEvent, HostMetadata, OSFields, HostFields } from './types'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { PolicyData } from '../public/applications/endpoint/types'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { generatePolicy } from '../public/applications/endpoint/models/policy'; +import { AlertEvent, EndpointEvent, HostMetadata, OSFields, HostFields, PolicyData } from './types'; +import { factory as policyFactory } from './models/policy_config'; export type Event = AlertEvent | EndpointEvent; @@ -474,7 +471,7 @@ export class EndpointDocGenerator { streams: [], config: { policy: { - value: generatePolicy(), + value: policyFactory(), }, }, }, diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/models/policy.ts b/x-pack/plugins/endpoint/common/models/policy_config.ts similarity index 89% rename from x-pack/plugins/endpoint/public/applications/endpoint/models/policy.ts rename to x-pack/plugins/endpoint/common/models/policy_config.ts index 5269ee72f4039..199b8a91e4307 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/models/policy.ts +++ b/x-pack/plugins/endpoint/common/models/policy_config.ts @@ -7,11 +7,9 @@ import { PolicyConfig, ProtectionModes } from '../types'; /** - * Generate a new Policy model. - * NOTE: in the near future, this will likely be removed and an API call to EPM will be used to retrieve - * the latest from the Endpoint package + * Return a new default `PolicyConfig`. */ -export const generatePolicy = (): PolicyConfig => { +export const factory = (): PolicyConfig => { return { windows: { events: { diff --git a/x-pack/plugins/endpoint/common/types.ts b/x-pack/plugins/endpoint/common/types.ts index 403ca9832e191..7143f07d8c702 100644 --- a/x-pack/plugins/endpoint/common/types.ts +++ b/x-pack/plugins/endpoint/common/types.ts @@ -7,12 +7,15 @@ import { SearchResponse } from 'elasticsearch'; import { TypeOf } from '@kbn/config-schema'; import { alertingIndexGetQuerySchema } from './schema/alert_index'; +import { Datasource, NewDatasource } from '../../ingest_manager/common'; /** * A deep readonly type that will make all children of a given object readonly recursively */ export type Immutable = T extends undefined | null | boolean | string | number ? T + : unknown extends T + ? unknown : T extends Array ? ImmutableArray : T extends Map @@ -442,3 +445,125 @@ export type AlertingIndexGetQueryInput = KbnConfigSchemaInputTypeOf< * Result of the validated query params when handling alert index requests. */ export type AlertingIndexGetQueryResult = TypeOf; + +/** + * Endpoint Policy configuration + */ +export interface PolicyConfig { + windows: { + events: { + dll_and_driver_load: boolean; + dns: boolean; + file: boolean; + network: boolean; + process: boolean; + registry: boolean; + security: boolean; + }; + malware: MalwareFields; + logging: { + stdout: string; + file: string; + }; + advanced: PolicyConfigAdvancedOptions; + }; + mac: { + events: { + file: boolean; + process: boolean; + network: boolean; + }; + malware: MalwareFields; + logging: { + stdout: string; + file: string; + }; + advanced: PolicyConfigAdvancedOptions; + }; + linux: { + events: { + file: boolean; + process: boolean; + network: boolean; + }; + logging: { + stdout: string; + file: string; + }; + advanced: PolicyConfigAdvancedOptions; + }; +} + +/** + * Windows-specific policy configuration that is supported via the UI + */ +type WindowsPolicyConfig = Pick; + +/** + * Mac-specific policy configuration that is supported via the UI + */ +type MacPolicyConfig = Pick; + +/** + * Linux-specific policy configuration that is supported via the UI + */ +type LinuxPolicyConfig = Pick; + +/** + * The set of Policy configuration settings that are show/edited via the UI + */ +export interface UIPolicyConfig { + windows: WindowsPolicyConfig; + mac: MacPolicyConfig; + linux: LinuxPolicyConfig; +} + +interface PolicyConfigAdvancedOptions { + elasticsearch: { + indices: { + control: string; + event: string; + logging: string; + }; + kernel: { + connect: boolean; + process: boolean; + }; + }; +} + +/** Policy: Malware protection fields */ +export interface MalwareFields { + mode: ProtectionModes; +} + +/** Policy protection mode options */ +export enum ProtectionModes { + detect = 'detect', + prevent = 'prevent', + preventNotify = 'preventNotify', + off = 'off', +} + +/** + * Endpoint Policy data, which extends Ingest's `Datasource` type + */ +export type PolicyData = Datasource & NewPolicyData; + +/** + * New policy data. Used when updating the policy record via ingest APIs + */ +export type NewPolicyData = NewDatasource & { + inputs: [ + { + type: 'endpoint'; + enabled: boolean; + streams: []; + config: { + policy: { + value: PolicyConfig; + }; + }; + } + ]; +}; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/models/index_pattern.ts b/x-pack/plugins/endpoint/public/applications/endpoint/models/index_pattern.ts new file mode 100644 index 0000000000000..0cae054432f96 --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/models/index_pattern.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { all } from 'deepmerge'; +import { Immutable } from '../../../../common/types'; +import { IIndexPattern } from '../../../../../../../src/plugins/data/common'; + +/** + * Model for the `IIndexPattern` interface exported by the `data` plugin. + */ +export function clone(value: IIndexPattern | Immutable): IIndexPattern { + return all([value]) as IIndexPattern; +} diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/models/policy_details_config.ts b/x-pack/plugins/endpoint/public/applications/endpoint/models/policy_details_config.ts index bf96942e83a91..3e56b1ff14d65 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/models/policy_details_config.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/models/policy_details_config.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { UIPolicyConfig } from '../types'; +import { UIPolicyConfig } from '../../../../common/types'; /** * A typed Object.entries() function where the keys and values are typed based on the given object diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_details.test.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_details.test.ts index 79e9de9c67352..feac8944f476b 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_details.test.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_details.test.ts @@ -14,16 +14,17 @@ import { coreMock } from 'src/core/public/mocks'; import { DepsStartMock, depsStartMock } from '../../mocks'; import { createBrowserHistory } from 'history'; import { mockAlertResultList } from './mock_alert_result_list'; +import { Immutable } from '../../../../../common/types'; describe('alert details tests', () => { - let store: Store; + let store: Store, Immutable>; let coreStart: ReturnType; let depsStart: DepsStartMock; let history: History; /** * A function that waits until a selector returns true. */ - let selectorIsTrue: (selector: (state: AlertListState) => boolean) => Promise; + let selectorIsTrue: (selector: (state: Immutable) => boolean) => Promise; beforeEach(() => { coreStart = coreMock.createStart(); depsStart = depsStartMock(); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list.test.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list.test.ts index b1cc2d46f614a..84281813312e0 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list.test.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list.test.ts @@ -12,20 +12,20 @@ import { alertMiddlewareFactory } from './middleware'; import { AppAction } from '../action'; import { coreMock } from 'src/core/public/mocks'; import { DepsStartMock, depsStartMock } from '../../mocks'; -import { AlertResultList } from '../../../../../common/types'; +import { AlertResultList, Immutable } from '../../../../../common/types'; import { isOnAlertPage } from './selectors'; import { createBrowserHistory } from 'history'; import { mockAlertResultList } from './mock_alert_result_list'; describe('alert list tests', () => { - let store: Store; + let store: Store, Immutable>; let coreStart: ReturnType; let depsStart: DepsStartMock; let history: History; /** * A function that waits until a selector returns true. */ - let selectorIsTrue: (selector: (state: AlertListState) => boolean) => Promise; + let selectorIsTrue: (selector: (state: Immutable) => boolean) => Promise; beforeEach(() => { coreStart = coreMock.createStart(); depsStart = depsStartMock(); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list_pagination.test.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list_pagination.test.ts index bb5893f14287b..4cc86e9c0449c 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list_pagination.test.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/alert_list_pagination.test.ts @@ -15,9 +15,10 @@ import { DepsStartMock, depsStartMock } from '../../mocks'; import { createBrowserHistory } from 'history'; import { uiQueryParams } from './selectors'; import { urlFromQueryParams } from '../../view/alerts/url_from_query_params'; +import { Immutable } from '../../../../../common/types'; describe('alert list pagination', () => { - let store: Store; + let store: Store, Immutable>; let coreStart: ReturnType; let depsStart: DepsStartMock; let history: History; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts index 4430a4d39cf4a..52b91dcae7d70 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/reducer.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Reducer } from 'redux'; -import { AlertListState } from '../../types'; +import { AlertListState, ImmutableReducer } from '../../types'; import { AppAction } from '../action'; +import { Immutable } from '../../../../../common/types'; -const initialState = (): AlertListState => { +const initialState = (): Immutable => { return { alerts: [], alertDetails: undefined, @@ -22,7 +22,7 @@ const initialState = (): AlertListState => { }; }; -export const alertListReducer: Reducer = ( +export const alertListReducer: ImmutableReducer = ( state = initialState(), action ) => { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/selectors.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/selectors.ts index 5e9b08c09c2c7..cc362c3701956 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/selectors.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/alerts/selectors.ts @@ -19,23 +19,23 @@ const createStructuredSelector: CreateStructuredSelector = createStructuredSelec /** * Returns the Alert Data array from state */ -export const alertListData = (state: AlertListState) => state.alerts; +export const alertListData = (state: Immutable) => state.alerts; -export const selectedAlertDetailsData = (state: AlertListState) => state.alertDetails; +export const selectedAlertDetailsData = (state: Immutable) => state.alertDetails; /** * Returns the alert list pagination data from state */ export const alertListPagination = createStructuredSelector({ - pageIndex: (state: AlertListState) => state.pageIndex, - pageSize: (state: AlertListState) => state.pageSize, - total: (state: AlertListState) => state.total, + pageIndex: (state: Immutable) => state.pageIndex, + pageSize: (state: Immutable) => state.pageSize, + total: (state: Immutable) => state.total, }); /** * Returns a boolean based on whether or not the user is on the alerts page */ -export const isOnAlertPage = (state: AlertListState): boolean => { +export const isOnAlertPage = (state: Immutable): boolean => { return state.location ? state.location.pathname === '/alerts' : false; }; @@ -44,10 +44,10 @@ export const isOnAlertPage = (state: AlertListState): boolean => { * Used to calculate urls for links and such. */ export const uiQueryParams: ( - state: AlertListState + state: Immutable ) => Immutable = createSelector( - (state: AlertListState) => state.location, - (location: AlertListState['location']) => { + state => state.location, + (location: Immutable['location']) => { const data: AlertingIndexUIQueryParams = {}; if (location) { // Removes the `?` from the beginning of query string if it exists @@ -82,7 +82,7 @@ export const uiQueryParams: ( * Parses the ui query params and returns a object that represents the query used by the SearchBar component. * If the query url param is undefined, a default is returned. */ -export const searchBarQuery: (state: AlertListState) => Query = createSelector( +export const searchBarQuery: (state: Immutable) => Query = createSelector( uiQueryParams, ({ query }) => { if (query !== undefined) { @@ -97,21 +97,20 @@ export const searchBarQuery: (state: AlertListState) => Query = createSelector( * Parses the ui query params and returns a rison encoded string that represents the search bar's date range. * A default is provided if 'date_range' is not present in the url params. */ -export const encodedSearchBarDateRange: (state: AlertListState) => string = createSelector( - uiQueryParams, - ({ date_range: dateRange }) => { - if (dateRange === undefined) { - return encode({ from: 'now-24h', to: 'now' }); - } else { - return dateRange; - } +export const encodedSearchBarDateRange: ( + state: Immutable +) => string = createSelector(uiQueryParams, ({ date_range: dateRange }) => { + if (dateRange === undefined) { + return encode({ from: 'now-24h', to: 'now' }); + } else { + return dateRange; } -); +}); /** * Parses the ui query params and returns a object that represents the dateRange used by the SearchBar component. */ -export const searchBarDateRange: (state: AlertListState) => TimeRange = createSelector( +export const searchBarDateRange: (state: Immutable) => TimeRange = createSelector( encodedSearchBarDateRange, encodedDateRange => { return (decode(encodedDateRange) as unknown) as TimeRange; @@ -122,7 +121,7 @@ export const searchBarDateRange: (state: AlertListState) => TimeRange = createSe * Parses the ui query params and returns an array of filters used by the SearchBar component. * If the 'filters' param is not present, a default is returned. */ -export const searchBarFilters: (state: AlertListState) => Filter[] = createSelector( +export const searchBarFilters: (state: Immutable) => Filter[] = createSelector( uiQueryParams, ({ filters }) => { if (filters !== undefined) { @@ -136,13 +135,14 @@ export const searchBarFilters: (state: AlertListState) => Filter[] = createSelec /** * Returns the indexPatterns used by the SearchBar component */ -export const searchBarIndexPatterns = (state: AlertListState) => state.searchBar.patterns; +export const searchBarIndexPatterns = (state: Immutable) => + state.searchBar.patterns; /** * query params to use when requesting alert data. */ export const apiQueryParams: ( - state: AlertListState + state: Immutable ) => Immutable = createSelector( uiQueryParams, encodedSearchBarDateRange, @@ -161,7 +161,7 @@ export const apiQueryParams: ( * True if the user has selected an alert to see details about. * Populated via the browsers query params. */ -export const hasSelectedAlert: (state: AlertListState) => boolean = createSelector( +export const hasSelectedAlert: (state: Immutable) => boolean = createSelector( uiQueryParams, ({ selected_alert: selectedAlert }) => selectedAlert !== undefined ); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/action.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/action.ts index 4dafa68ddb647..21871ec8ca849 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/action.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/action.ts @@ -27,14 +27,8 @@ interface UserPaginatedHostList { payload: HostListPagination; } -// Why is FakeActionWithNoPayload here, see: https://github.com/elastic/endpoint-app-team/issues/273 -interface FakeActionWithNoPayload { - type: 'fakeActionWithNoPayLoad'; -} - export type HostAction = | ServerReturnedHostList | ServerReturnedHostDetails | ServerFailedToReturnHostDetails - | UserPaginatedHostList - | FakeActionWithNoPayload; + | UserPaginatedHostList; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/middleware.test.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/middleware.test.ts index 8c8578426aa29..8f39baddda00e 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/middleware.test.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/middleware.test.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ import { CoreStart, HttpSetup } from 'kibana/public'; -import { applyMiddleware, createStore, Dispatch, Store } from 'redux'; +import { applyMiddleware, createStore, Store } from 'redux'; import { coreMock } from '../../../../../../../../src/core/public/mocks'; import { History, createBrowserHistory } from 'history'; import { hostListReducer, hostMiddlewareFactory } from './index'; -import { HostResultList } from '../../../../../common/types'; +import { HostResultList, Immutable } from '../../../../../common/types'; import { HostListState } from '../../types'; import { AppAction } from '../action'; import { listData } from './selectors'; @@ -20,9 +20,10 @@ describe('host list middleware', () => { let fakeCoreStart: jest.Mocked; let depsStart: DepsStartMock; let fakeHttpServices: jest.Mocked; - let store: Store; - let getState: typeof store['getState']; - let dispatch: Dispatch; + type HostListStore = Store, Immutable>; + let store: HostListStore; + let getState: HostListStore['getState']; + let dispatch: HostListStore['dispatch']; let history: History; const getEndpointListApiResponse = (): HostResultList => { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/reducer.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/reducer.ts index ad6741dab7be7..298e819645dbe 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/reducer.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/reducer.ts @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Reducer } from 'redux'; -import { HostListState } from '../../types'; +import { HostListState, ImmutableReducer } from '../../types'; import { AppAction } from '../action'; const initialState = (): HostListState => { @@ -21,7 +20,7 @@ const initialState = (): HostListState => { }; }; -export const hostListReducer: Reducer = ( +export const hostListReducer: ImmutableReducer = ( state = initialState(), action ) => { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/selectors.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/selectors.ts index ebe310cb51190..35bf5d0616878 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/selectors.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/hosts/selectors.ts @@ -8,30 +8,30 @@ import { createSelector } from 'reselect'; import { Immutable } from '../../../../../common/types'; import { HostListState, HostIndexUIQueryParams } from '../../types'; -export const listData = (state: HostListState) => state.hosts; +export const listData = (state: Immutable) => state.hosts; -export const pageIndex = (state: HostListState) => state.pageIndex; +export const pageIndex = (state: Immutable) => state.pageIndex; -export const pageSize = (state: HostListState) => state.pageSize; +export const pageSize = (state: Immutable) => state.pageSize; -export const totalHits = (state: HostListState) => state.total; +export const totalHits = (state: Immutable) => state.total; -export const isLoading = (state: HostListState) => state.loading; +export const isLoading = (state: Immutable) => state.loading; -export const detailsError = (state: HostListState) => state.detailsError; +export const detailsError = (state: Immutable) => state.detailsError; -export const detailsData = (state: HostListState) => { +export const detailsData = (state: Immutable) => { return state.details; }; -export const isOnHostPage = (state: HostListState) => +export const isOnHostPage = (state: Immutable) => state.location ? state.location.pathname === '/hosts' : false; export const uiQueryParams: ( - state: HostListState + state: Immutable ) => Immutable = createSelector( - (state: HostListState) => state.location, - (location: HostListState['location']) => { + (state: Immutable) => state.location, + (location: Immutable['location']) => { const data: HostIndexUIQueryParams = {}; if (location) { // Removes the `?` from the beginning of query string if it exists @@ -52,7 +52,7 @@ export const uiQueryParams: ( } ); -export const hasSelectedHost: (state: HostListState) => boolean = createSelector( +export const hasSelectedHost: (state: Immutable) => boolean = createSelector( uiQueryParams, ({ selected_host: selectedHost }) => { return selectedHost !== undefined; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/immutable_combine_reducers.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/immutable_combine_reducers.ts new file mode 100644 index 0000000000000..6895f0106fb5d --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/immutable_combine_reducers.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { combineReducers } from 'redux'; +import { ImmutableCombineReducers } from '../types'; + +/** + * Works the same as `combineReducers` from `redux`, but uses the `ImmutableCombineReducers` type. + */ +export const immutableCombineReducers: ImmutableCombineReducers = combineReducers; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/action.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/action.ts index 9905145048a8a..4de3dac02a8ec 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/action.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/action.ts @@ -4,8 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PolicyData, PolicyDetailsState, ServerApiError, UIPolicyConfig } from '../../types'; +import { PolicyDetailsState, ServerApiError } from '../../types'; import { GetAgentStatusResponse } from '../../../../../../ingest_manager/common/types/rest_spec'; +import { PolicyData, UIPolicyConfig } from '../../../../../common/types'; interface ServerReturnedPolicyDetailsData { type: 'serverReturnedPolicyDetailsData'; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/index.test.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/index.test.ts index f81852d6a074a..a24687ebbcbbc 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/index.test.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/index.test.ts @@ -9,7 +9,7 @@ import { createStore, Dispatch, Store } from 'redux'; import { policyDetailsReducer, PolicyDetailsAction } from './index'; import { policyConfig } from './selectors'; import { clone } from '../../models/policy_details_config'; -import { generatePolicy } from '../../models/policy'; +import { factory as policyConfigFactory } from '../../../../../common/models/policy_config'; describe('policy details: ', () => { let store: Store; @@ -38,7 +38,7 @@ describe('policy details: ', () => { streams: [], config: { policy: { - value: generatePolicy(), + value: policyConfigFactory(), }, }, }, diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/middleware.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/middleware.ts index 2581ab37f5677..7a3fbe7f23b9b 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/middleware.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/middleware.ts @@ -4,19 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - MiddlewareFactory, - PolicyData, - PolicyDetailsState, - UpdatePolicyResponse, -} from '../../types'; +import { MiddlewareFactory, PolicyDetailsState, UpdatePolicyResponse } from '../../types'; import { policyIdFromParams, isOnPolicyDetailsPage, policyDetails } from './selectors'; -import { generatePolicy } from '../../models/policy'; import { sendGetDatasource, sendGetFleetAgentStatusForConfig, sendPutDatasource, } from '../policy_list/services/ingest'; +import { PolicyData } from '../../../../../common/types'; +import { factory as policyConfigFactory } from '../../../../../common/models/policy_config'; export const policyDetailsMiddlewareFactory: MiddlewareFactory = coreStart => { const http = coreStart.http; @@ -49,7 +45,7 @@ export const policyDetailsMiddlewareFactory: MiddlewareFactory { return { @@ -23,7 +23,7 @@ const initialPolicyDetailsState = (): PolicyDetailsState => { }; }; -export const policyDetailsReducer: Reducer = ( +export const policyDetailsReducer: ImmutableReducer = ( state = initialPolicyDetailsState(), action ) => { @@ -70,7 +70,7 @@ export const policyDetailsReducer: Reducer = ( } if (action.type === 'userChangedUrl') { - const newState = { + const newState: Immutable = { ...state, location: action.payload, }; @@ -79,8 +79,10 @@ export const policyDetailsReducer: Reducer = ( // Did user just enter the Detail page? if so, then set the loading indicator and return new state if (isCurrentlyOnDetailsPage && !wasPreviouslyOnDetailsPage) { - newState.isLoading = true; - return newState; + return { + ...newState, + isLoading: true, + }; } return { ...initialPolicyDetailsState(), @@ -93,10 +95,19 @@ export const policyDetailsReducer: Reducer = ( return state; } const newState = { ...state, policyItem: { ...state.policyItem } }; - const newPolicy: any = { ...fullPolicy(state) }; + const newPolicy: PolicyConfig = { ...fullPolicy(state) }; + + /** + * This is directly changing redux state because `policyItem.inputs` was copied over and not cloned. + */ + // @ts-ignore newState.policyItem.inputs[0].config.policy.value = newPolicy; Object.entries(action.payload.policyConfig).forEach(([section, newSettings]) => { + /** + * this is not safe because `action.payload.policyConfig` may have excess keys + */ + // @ts-ignore newPolicy[section as keyof UIPolicyConfig] = { ...newPolicy[section as keyof UIPolicyConfig], ...newSettings, diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/selectors.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/selectors.ts index a37a06bafcf05..98e129132e1cb 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/selectors.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_details/selectors.ts @@ -5,14 +5,15 @@ */ import { createSelector } from 'reselect'; -import { PolicyConfig, PolicyDetailsState, UIPolicyConfig } from '../../types'; -import { generatePolicy } from '../../models/policy'; +import { PolicyDetailsState } from '../../types'; +import { Immutable, PolicyConfig, UIPolicyConfig } from '../../../../../common/types'; +import { factory as policyConfigFactory } from '../../../../../common/models/policy_config'; /** Returns the policy details */ -export const policyDetails = (state: PolicyDetailsState) => state.policyItem; +export const policyDetails = (state: Immutable) => state.policyItem; /** Returns a boolean of whether the user is on the policy details page or not */ -export const isOnPolicyDetailsPage = (state: PolicyDetailsState) => { +export const isOnPolicyDetailsPage = (state: Immutable) => { if (state.location) { const pathnameParts = state.location.pathname.split('/'); return pathnameParts[1] === 'policy' && pathnameParts[2]; @@ -32,14 +33,16 @@ export const policyIdFromParams: (state: PolicyDetailsState) => string = createS } ); +const defaultFullPolicy: Immutable = policyConfigFactory(); + /** * Returns the full Endpoint Policy, which will include private settings not shown on the UI. * Note: this will return a default full policy if the `policyItem` is `undefined` */ -export const fullPolicy: (s: PolicyDetailsState) => PolicyConfig = createSelector( +export const fullPolicy: (s: Immutable) => PolicyConfig = createSelector( policyDetails, policyData => { - return policyData?.inputs[0]?.config?.policy?.value ?? generatePolicy(); + return policyData?.inputs[0]?.config?.policy?.value ?? defaultFullPolicy; } ); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/action.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/action.ts index 3db224f049c05..4c379b7426461 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/action.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/action.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PolicyData, ServerApiError } from '../../types'; +import { ServerApiError } from '../../types'; +import { PolicyData } from '../../../../../common/types'; interface ServerReturnedPolicyListData { type: 'serverReturnedPolicyListData'; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/index.test.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/index.test.ts index 4d153b5e03cd2..97a2b65fb65f8 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/index.test.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/index.test.ts @@ -5,7 +5,7 @@ */ import { EndpointAppLocation, PolicyListState } from '../../types'; -import { applyMiddleware, createStore, Dispatch, Store } from 'redux'; +import { applyMiddleware, createStore, Store } from 'redux'; import { AppAction } from '../action'; import { policyListReducer } from './reducer'; import { policyListMiddlewareFactory } from './middleware'; @@ -18,13 +18,15 @@ import { setPolicyListApiMockImplementation, } from './test_mock_utils'; import { INGEST_API_DATASOURCES } from './services/ingest'; +import { Immutable } from '../../../../../common/types'; describe('policy list store concerns', () => { let fakeCoreStart: ReturnType; let depsStart: DepsStartMock; - let store: Store; - let getState: typeof store['getState']; - let dispatch: Dispatch; + type PolicyListStore = Store, Immutable>; + let store: PolicyListStore; + let getState: PolicyListStore['getState']; + let dispatch: PolicyListStore['dispatch']; let waitForAction: MiddlewareActionSpyHelper['waitForAction']; beforeEach(() => { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/reducer.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/reducer.ts index 30c1deac7f5e1..ccd3f84dd060c 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/reducer.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/reducer.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Reducer } from 'redux'; -import { PolicyListState } from '../../types'; +import { PolicyListState, ImmutableReducer } from '../../types'; import { AppAction } from '../action'; import { isOnPolicyListPage } from './selectors'; +import { Immutable } from '../../../../../common/types'; const initialPolicyListState = (): PolicyListState => { return { @@ -21,7 +21,7 @@ const initialPolicyListState = (): PolicyListState => { }; }; -export const policyListReducer: Reducer = ( +export const policyListReducer: ImmutableReducer = ( state = initialPolicyListState(), action ) => { @@ -42,7 +42,7 @@ export const policyListReducer: Reducer = ( } if (action.type === 'userChangedUrl') { - const newState = { + const newState: Immutable = { ...state, location: action.payload, }; @@ -53,14 +53,15 @@ export const policyListReducer: Reducer = ( // Also adjust some state if user is just entering the policy list view if (isCurrentlyOnListPage) { if (!wasPreviouslyOnListPage) { - newState.apiError = undefined; - newState.isLoading = true; + return { + ...newState, + apiError: undefined, + isLoading: true, + }; } return newState; } - return { - ...initialPolicyListState(), - }; + return initialPolicyListState(); } return state; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/selectors.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/selectors.ts index ce13d89b2b8c2..6d2e952fa07bb 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/selectors.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/selectors.ts @@ -7,32 +7,33 @@ import { createSelector } from 'reselect'; import { parse } from 'query-string'; import { PolicyListState, PolicyListUrlSearchParams } from '../../types'; +import { Immutable } from '../../../../../common/types'; const PAGE_SIZES = Object.freeze([10, 20, 50]); -export const selectPolicyItems = (state: PolicyListState) => state.policyItems; +export const selectPolicyItems = (state: Immutable) => state.policyItems; -export const selectPageIndex = (state: PolicyListState) => state.pageIndex; +export const selectPageIndex = (state: Immutable) => state.pageIndex; -export const selectPageSize = (state: PolicyListState) => state.pageSize; +export const selectPageSize = (state: Immutable) => state.pageSize; -export const selectTotal = (state: PolicyListState) => state.total; +export const selectTotal = (state: Immutable) => state.total; -export const selectIsLoading = (state: PolicyListState) => state.isLoading; +export const selectIsLoading = (state: Immutable) => state.isLoading; -export const selectApiError = (state: PolicyListState) => state.apiError; +export const selectApiError = (state: Immutable) => state.apiError; -export const isOnPolicyListPage = (state: PolicyListState) => { +export const isOnPolicyListPage = (state: Immutable) => { return state.location?.pathname === '/policy'; }; -const routeLocation = (state: PolicyListState) => state.location; +const routeLocation = (state: Immutable) => state.location; /** * Returns the supported URL search params, populated with defaults if none where present in the URL */ export const urlSearchParams: ( - state: PolicyListState + state: Immutable ) => PolicyListUrlSearchParams = createSelector(routeLocation, location => { const searchParams = { page_index: 0, diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/services/ingest.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/services/ingest.ts index 5fccb01d1ad35..4356517e43c2c 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/services/ingest.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/policy_list/services/ingest.ts @@ -9,12 +9,8 @@ import { GetDatasourcesRequest, GetAgentStatusResponse, } from '../../../../../../../ingest_manager/common'; -import { - NewPolicyData, - GetPolicyListResponse, - GetPolicyResponse, - UpdatePolicyResponse, -} from '../../../types'; +import { GetPolicyListResponse, GetPolicyResponse, UpdatePolicyResponse } from '../../../types'; +import { NewPolicyData } from '../../../../../../common/types'; const INGEST_API_ROOT = `/api/ingest_manager`; export const INGEST_API_DATASOURCES = `${INGEST_API_ROOT}/datasources`; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/store/reducer.ts b/x-pack/plugins/endpoint/public/applications/endpoint/store/reducer.ts index c8b2d08676724..2f77c380d9387 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/store/reducer.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/store/reducer.ts @@ -3,15 +3,16 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { combineReducers, Reducer } from 'redux'; + import { hostListReducer } from './hosts'; import { AppAction } from './action'; import { alertListReducer } from './alerts'; -import { GlobalState } from '../types'; +import { GlobalState, ImmutableReducer } from '../types'; import { policyListReducer } from './policy_list'; import { policyDetailsReducer } from './policy_details'; +import { immutableCombineReducers } from './immutable_combine_reducers'; -export const appReducer: Reducer = combineReducers({ +export const appReducer: ImmutableReducer = immutableCombineReducers({ hostList: hostListReducer, alertList: alertListReducer, policyList: policyListReducer, diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/types.ts b/x-pack/plugins/endpoint/public/applications/endpoint/types.ts index 015468f84e740..7aca94d3e9c7c 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/types.ts +++ b/x-pack/plugins/endpoint/public/applications/endpoint/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Dispatch, MiddlewareAPI } from 'redux'; +import { Dispatch, MiddlewareAPI, Action as ReduxAction, AnyAction as ReduxAnyAction } from 'redux'; import { IIndexPattern } from 'src/plugins/data/public'; import { HostMetadata, @@ -13,13 +13,14 @@ import { Immutable, ImmutableArray, AlertDetails, + MalwareFields, + UIPolicyConfig, + PolicyData, } from '../../../common/types'; import { EndpointPluginStartDependencies } from '../../plugin'; import { AppAction } from './store/action'; import { CoreStart } from '../../../../../../src/core/public'; import { - Datasource, - NewDatasource, GetAgentStatusResponse, GetDatasourcesResponse, GetOneDatasourceResponse, @@ -59,29 +60,6 @@ export interface ServerApiError { message: string; } -/** - * New policy data. Used when updating the policy record via ingest APIs - */ -export type NewPolicyData = NewDatasource & { - inputs: [ - { - type: 'endpoint'; - enabled: boolean; - streams: []; - config: { - policy: { - value: PolicyConfig; - }; - }; - } - ]; -}; - -/** - * Endpoint Policy data, which extends Ingest's `Datasource` type - */ -export type PolicyData = Datasource & NewPolicyData; - /** * Policy list store state */ @@ -192,30 +170,6 @@ interface PolicyConfigAdvancedOptions { }; } -/** - * Windows-specific policy configuration that is supported via the UI - */ -type WindowsPolicyConfig = Pick; - -/** - * Mac-specific policy configuration that is supported via the UI - */ -type MacPolicyConfig = Pick; - -/** - * Linux-specific policy configuration that is supported via the UI - */ -type LinuxPolicyConfig = Pick; - -/** - * The set of Policy configuration settings that are show/edited via the UI - */ -export interface UIPolicyConfig { - windows: WindowsPolicyConfig; - mac: MacPolicyConfig; - linux: LinuxPolicyConfig; -} - /** OS used in Policy */ export enum OS { windows = 'windows', @@ -246,20 +200,7 @@ export type KeysByValueCriteria = { }[keyof O]; /** Returns an array of the policy OSes that have a malware protection field */ - export type MalwareProtectionOSes = KeysByValueCriteria; -/** Policy: Malware protection fields */ -export interface MalwareFields { - mode: ProtectionModes; -} - -/** Policy protection mode options */ -export enum ProtectionModes { - detect = 'detect', - prevent = 'prevent', - preventNotify = 'preventNotify', - off = 'off', -} export interface GlobalState { readonly hostList: HostListState; @@ -349,3 +290,28 @@ export interface GetPolicyResponse extends GetOneDatasourceResponse { export interface UpdatePolicyResponse extends UpdateDatasourceResponse { item: PolicyData; } + +/** + * Like `Reducer` from `redux` but it accepts immutable versions of `state` and `action`. + * Use this type for all Reducers in order to help enforce our pattern of immutable state. + */ +export type ImmutableReducer = ( + state: Immutable | undefined, + action: Immutable +) => State | Immutable; + +/** + * A alternate interface for `redux`'s `combineReducers`. Will work with the same underlying implementation, + * but will enforce that `Immutable` versions of `state` and `action` are received. + */ +export type ImmutableCombineReducers = ( + reducers: ImmutableReducersMapObject +) => ImmutableReducer; + +/** + * Like `redux`'s `ReducersMapObject` (which is used by `combineReducers`) but enforces that + * the `state` and `action` received are `Immutable` versions. + */ +type ImmutableReducersMapObject = { + [K in keyof S]: ImmutableReducer; +}; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index_search_bar.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index_search_bar.tsx index 5b872962a5dc0..1ede06c086517 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index_search_bar.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/alerts/index_search_bar.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { memo, useEffect, useCallback } from 'react'; import { useHistory } from 'react-router-dom'; import { encode, RisonValue } from 'rison-node'; @@ -14,11 +14,18 @@ import { urlFromQueryParams } from './url_from_query_params'; import { useAlertListSelector } from './hooks/use_alerts_selector'; import * as selectors from '../../store/alerts/selectors'; import { EndpointPluginServices } from '../../../../plugin'; +import { clone } from '../../models/index_pattern'; export const AlertIndexSearchBar = memo(() => { const history = useHistory(); const queryParams = useAlertListSelector(selectors.uiQueryParams); const searchBarIndexPatterns = useAlertListSelector(selectors.searchBarIndexPatterns); + + // Deeply clone the search bar index patterns as the receiving component may mutate them + const clonedSearchBarIndexPatterns = useMemo( + () => searchBarIndexPatterns.map(pattern => clone(pattern)), + [searchBarIndexPatterns] + ); const searchBarQuery = useAlertListSelector(selectors.searchBarQuery); const searchBarDateRange = useAlertListSelector(selectors.searchBarDateRange); const searchBarFilters = useAlertListSelector(selectors.searchBarFilters); @@ -68,7 +75,7 @@ export const AlertIndexSearchBar = memo(() => { dataTestSubj="alertsSearchBar" appName="endpoint" isLoading={false} - indexPatterns={searchBarIndexPatterns} + indexPatterns={clonedSearchBarIndexPatterns} query={searchBarQuery} dateRangeFrom={searchBarDateRange.from} dateRangeTo={searchBarDateRange.to} diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx index 94625b8c66191..1d81d6e8a16db 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx @@ -23,12 +23,14 @@ import { i18n } from '@kbn/i18n'; import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n/react'; import { createStructuredSelector } from 'reselect'; +import { EuiBasicTableColumn } from '@elastic/eui'; import { HostDetailsFlyout } from './details'; import * as selectors from '../../store/hosts/selectors'; import { HostAction } from '../../store/hosts/action'; import { useHostListSelector } from './hooks'; import { CreateStructuredSelector } from '../../types'; import { urlFromQueryParams } from './url_from_query_params'; +import { HostMetadata, Immutable } from '../../../../../common/types'; const selector = (createStructuredSelector as CreateStructuredSelector)(selectors); export const HostList = () => { @@ -65,7 +67,7 @@ export const HostList = () => { [dispatch] ); - const columns = useMemo(() => { + const columns: Array>> = useMemo(() => { return [ { field: '', @@ -174,7 +176,7 @@ export const HostList = () => { [...listData], [listData])} columns={columns} loading={isLoading} pagination={paginationSetup} diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/config_form.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/config_form.tsx index 8b6c32c3277ed..341086c7cf75c 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/config_form.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/config_form.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EuiCard, EuiFlexGroup, @@ -25,14 +25,27 @@ const PolicyDetailCard = styled.div` } `; export const ConfigForm: React.FC<{ + /** + * A subtitle for this component. + **/ type: string; - supportedOss: string[]; + /** + * Types of supported operating systems. + */ + supportedOss: React.ReactNode; children: React.ReactNode; - id: string; - /** Takes a react component to be put on the right corner of the card */ + /** + * A description for the component. + */ + description: string; + /** + * The `data-test-subj` attribute to append to a certain child element. + */ + dataTestSubj: string; + /** React Node to be put on the right corner of the card */ rightCorner: React.ReactNode; -}> = React.memo(({ type, supportedOss, children, id, rightCorner }) => { - const typeTitle = () => { +}> = React.memo(({ type, supportedOss, children, dataTestSubj, rightCorner, description }) => { + const typeTitle = useMemo(() => { return ( @@ -59,28 +72,25 @@ export const ConfigForm: React.FC<{ - {supportedOss.join(', ')} + {supportedOss} {rightCorner} ); - }; + }, [rightCorner, supportedOss, type]); return ( - - {children} - - } - /> + title={typeTitle} + > + + {children} + ); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/checkbox.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/checkbox.tsx index bec6b33b85c7f..74322ac8b993b 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/checkbox.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/checkbox.tsx @@ -11,7 +11,7 @@ import { htmlIdGenerator } from '@elastic/eui'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { policyConfig } from '../../../../store/policy_details/selectors'; import { PolicyDetailsAction } from '../../../../store/policy_details'; -import { UIPolicyConfig } from '../../../../types'; +import { UIPolicyConfig } from '../../../../../../../common/types'; export const EventsCheckbox = React.memo(function({ name, diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx index ca2215d3d0a59..c3d6bdba7c852 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/linux.tsx @@ -8,24 +8,24 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, EuiText, EuiSpacer } from '@elastic/eui'; -import { ImmutableArray } from '../../../../../../../common/types'; -import { getIn, setIn } from '../../../../models/policy_details_config'; import { EventsCheckbox } from './checkbox'; -import { OS, UIPolicyConfig } from '../../../../types'; +import { OS } from '../../../../types'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { selectedLinuxEvents, totalLinuxEvents } from '../../../../store/policy_details/selectors'; import { ConfigForm } from '../config_form'; +import { getIn, setIn } from '../../../../models/policy_details_config'; +import { UIPolicyConfig } from '../../../../../../../common/types'; export const LinuxEvents = React.memo(() => { const selected = usePolicyDetailsSelector(selectedLinuxEvents); const total = usePolicyDetailsSelector(totalLinuxEvents); - const checkboxes: ImmutableArray<{ - name: string; - os: 'linux'; - protectionField: keyof UIPolicyConfig['linux']['events']; - }> = useMemo( - () => [ + const checkboxes = useMemo(() => { + const items: Array<{ + name: string; + os: 'linux'; + protectionField: keyof UIPolicyConfig['linux']['events']; + }> = [ { name: i18n.translate('xpack.endpoint.policyDetailsConfig.linux.events.file', { defaultMessage: 'File', @@ -47,11 +47,7 @@ export const LinuxEvents = React.memo(() => { os: OS.linux, protectionField: 'network', }, - ], - [] - ); - - const renderCheckboxes = useMemo(() => { + ]; return ( <> @@ -63,7 +59,7 @@ export const LinuxEvents = React.memo(() => { - {checkboxes.map((item, index) => { + {items.map((item, index) => { return ( { })} ); - }, [checkboxes]); + }, []); const collectionsEnabled = useMemo(() => { return ( @@ -96,13 +92,16 @@ export const LinuxEvents = React.memo(() => { type={i18n.translate('xpack.endpoint.policy.details.eventCollection', { defaultMessage: 'Event Collection', })} - supportedOss={useMemo( - () => [i18n.translate('xpack.endpoint.policy.details.linux', { defaultMessage: 'Linux' })], - [] - )} - id="linuxEventsForm" + description={i18n.translate('xpack.endpoint.policy.details.eventCollectionLabel', { + defaultMessage: 'Event Collection', + })} + supportedOss={i18n.translate('xpack.endpoint.policy.details.linux', { + defaultMessage: 'Linux', + })} + dataTestSubj="linuxEventingForm" rightCorner={collectionsEnabled} - children={renderCheckboxes} - /> + > + {checkboxes} + ); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx index 5024d02603d77..40b80b9af0f65 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/mac.tsx @@ -8,24 +8,24 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, EuiText, EuiSpacer } from '@elastic/eui'; -import { ImmutableArray } from '../../../../../../../common/types'; -import { getIn, setIn } from '../../../../models/policy_details_config'; import { EventsCheckbox } from './checkbox'; -import { OS, UIPolicyConfig } from '../../../../types'; +import { OS } from '../../../../types'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { selectedMacEvents, totalMacEvents } from '../../../../store/policy_details/selectors'; import { ConfigForm } from '../config_form'; +import { getIn, setIn } from '../../../../models/policy_details_config'; +import { UIPolicyConfig } from '../../../../../../../common/types'; export const MacEvents = React.memo(() => { const selected = usePolicyDetailsSelector(selectedMacEvents); const total = usePolicyDetailsSelector(totalMacEvents); - const checkboxes: ImmutableArray<{ - name: string; - os: 'mac'; - protectionField: keyof UIPolicyConfig['mac']['events']; - }> = useMemo( - () => [ + const checkboxes = useMemo(() => { + const items: Array<{ + name: string; + os: 'mac'; + protectionField: keyof UIPolicyConfig['mac']['events']; + }> = [ { name: i18n.translate('xpack.endpoint.policyDetailsConfig.mac.events.file', { defaultMessage: 'File', @@ -47,11 +47,7 @@ export const MacEvents = React.memo(() => { os: OS.mac, protectionField: 'network', }, - ], - [] - ); - - const renderCheckboxes = useMemo(() => { + ]; return ( <> @@ -63,7 +59,7 @@ export const MacEvents = React.memo(() => { - {checkboxes.map((item, index) => { + {items.map((item, index) => { return ( { })} ); - }, [checkboxes]); + }, []); const collectionsEnabled = useMemo(() => { return ( @@ -96,13 +92,14 @@ export const MacEvents = React.memo(() => { type={i18n.translate('xpack.endpoint.policy.details.eventCollection', { defaultMessage: 'Event Collection', })} - supportedOss={useMemo( - () => [i18n.translate('xpack.endpoint.policy.details.mac', { defaultMessage: 'Mac' })], - [] - )} - id="macEventsForm" + description={i18n.translate('xpack.endpoint.policy.details.eventCollectionLabel', { + defaultMessage: 'Event Collection', + })} + supportedOss={i18n.translate('xpack.endpoint.policy.details.mac', { defaultMessage: 'Mac' })} + dataTestSubj="macEventingForm" rightCorner={collectionsEnabled} - children={renderCheckboxes} - /> + > + {checkboxes} + ); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx index 5b347ec387f48..7f946de9614ca 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/events/windows.tsx @@ -8,27 +8,27 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, EuiText, EuiSpacer } from '@elastic/eui'; -import { ImmutableArray } from '../../../../../../../common/types'; -import { setIn, getIn } from '../../../../models/policy_details_config'; import { EventsCheckbox } from './checkbox'; -import { OS, UIPolicyConfig } from '../../../../types'; +import { OS } from '../../../../types'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { selectedWindowsEvents, totalWindowsEvents, } from '../../../../store/policy_details/selectors'; import { ConfigForm } from '../config_form'; +import { setIn, getIn } from '../../../../models/policy_details_config'; +import { UIPolicyConfig, ImmutableArray } from '../../../../../../../common/types'; export const WindowsEvents = React.memo(() => { const selected = usePolicyDetailsSelector(selectedWindowsEvents); const total = usePolicyDetailsSelector(totalWindowsEvents); - const checkboxes: ImmutableArray<{ - name: string; - os: 'windows'; - protectionField: keyof UIPolicyConfig['windows']['events']; - }> = useMemo( - () => [ + const checkboxes = useMemo(() => { + const items: ImmutableArray<{ + name: string; + os: 'windows'; + protectionField: keyof UIPolicyConfig['windows']['events']; + }> = [ { name: i18n.translate('xpack.endpoint.policyDetailsConfig.windows.events.dllDriverLoad', { defaultMessage: 'DLL and Driver Load', @@ -78,11 +78,7 @@ export const WindowsEvents = React.memo(() => { os: OS.windows, protectionField: 'security', }, - ], - [] - ); - - const renderCheckboxes = useMemo(() => { + ]; return ( <> @@ -94,7 +90,7 @@ export const WindowsEvents = React.memo(() => { - {checkboxes.map((item, index) => { + {items.map((item, index) => { return ( { })} ); - }, [checkboxes]); + }, []); const collectionsEnabled = useMemo(() => { return ( @@ -127,15 +123,16 @@ export const WindowsEvents = React.memo(() => { type={i18n.translate('xpack.endpoint.policy.details.eventCollection', { defaultMessage: 'Event Collection', })} - supportedOss={useMemo( - () => [ - i18n.translate('xpack.endpoint.policy.details.windows', { defaultMessage: 'Windows' }), - ], - [] - )} - id="windowsEventsForm" + description={i18n.translate('xpack.endpoint.policy.details.windowsLabel', { + defaultMessage: 'Windows', + })} + supportedOss={i18n.translate('xpack.endpoint.policy.details.windows', { + defaultMessage: 'Windows', + })} + dataTestSubj="windowsEventingForm" rightCorner={collectionsEnabled} - children={renderCheckboxes} - /> + > + {checkboxes} + ); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/protections/malware.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/protections/malware.tsx index 66b22178607b9..14871c71ec038 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/protections/malware.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_forms/protections/malware.tsx @@ -11,8 +11,8 @@ import { EuiRadio, EuiSwitch, EuiTitle, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { htmlIdGenerator } from '@elastic/eui'; -import { Immutable } from '../../../../../../../common/types'; -import { OS, ProtectionModes, MalwareProtectionOSes } from '../../../../types'; +import { Immutable, ProtectionModes, ImmutableArray } from '../../../../../../../common/types'; +import { OS, MalwareProtectionOSes } from '../../../../types'; import { ConfigForm } from '../config_form'; import { policyConfig } from '../../../../store/policy_details/selectors'; import { usePolicyDetailsSelector } from '../../policy_hooks'; @@ -73,7 +73,7 @@ export const MalwareProtections = React.memo(() => { // currently just taking windows.malware, but both windows.malware and mac.malware should be the same value const selected = policyDetailsConfig && policyDetailsConfig.windows.malware.mode; - const radios: Array<{ + const radios: ImmutableArray<{ id: ProtectionModes; label: string; protection: 'malware'; @@ -123,7 +123,7 @@ export const MalwareProtections = React.memo(() => { [dispatch, policyDetailsConfig] ); - const RadioButtons = () => { + const radioButtons = useMemo(() => { return ( <> @@ -148,9 +148,9 @@ export const MalwareProtections = React.memo(() => { ); - }; + }, [radios]); - const ProtectionSwitch = () => { + const protectionSwitch = useMemo(() => { return ( { onChange={handleSwitchChange} /> ); - }; + }, [handleSwitchChange, selected]); return ( + supportedOss={i18n.translate('xpack.endpoint.policy.details.windowsAndMac', { + defaultMessage: 'Windows, Mac', + })} + dataTestSubj="malwareProtectionsForm" + description={i18n.translate('xpack.endpoint.policy.details.malwareLabel', { + defaultMessage: 'Malware', + })} + rightCorner={protectionSwitch} + > + {radioButtons} + ); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx index 295312fff01dd..062c7afb6706d 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx @@ -20,10 +20,10 @@ import { } from '../../store/policy_list/selectors'; import { usePolicyListSelector } from './policy_hooks'; import { PolicyListAction } from '../../store/policy_list'; -import { PolicyData } from '../../types'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; import { PageView } from '../components/page_view'; import { LinkToApp } from '../components/link_to_app'; +import { Immutable, PolicyData } from '../../../../../common/types'; interface TableChangeCallbackArguments { page: { index: number; size: number }; @@ -44,8 +44,8 @@ const PolicyLink: React.FC<{ name: string; route: string }> = ({ name, route }) ); }; -const renderPolicyNameLink = (value: string, _item: PolicyData) => { - return ; +const renderPolicyNameLink = (value: string, item: Immutable) => { + return ; }; export const PolicyList = React.memo(() => { @@ -88,7 +88,7 @@ export const PolicyList = React.memo(() => { [history, location.pathname] ); - const columns: Array> = useMemo( + const columns: Array>> = useMemo( () => [ { field: 'name', @@ -160,7 +160,7 @@ export const PolicyList = React.memo(() => { } > [...policyItems], [policyItems])} columns={columns} loading={loading} pagination={paginationSetup} From 99332b8a6e71c159ae4e70fcf5408f3ec01b44ec Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 15 Apr 2020 17:52:21 +0200 Subject: [PATCH 30/80] Fix CODEOWNERS and sass lint paths (#63552) --- .github/CODEOWNERS | 3 ++- .sass-lint.yml | 3 ++- .../layer_panel/style_settings/_style_settings.scss | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8a8a79e7c5f65..05972edacfe88 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,7 +4,7 @@ # App /x-pack/plugins/lens/ @elastic/kibana-app -/x-pack/legacy/plugins/graph/ @elastic/kibana-app +/x-pack/plugins/graph/ @elastic/kibana-app /src/legacy/server/url_shortening/ @elastic/kibana-app /src/legacy/server/sample_data/ @elastic/kibana-app /src/legacy/core_plugins/kibana/public/dashboard/ @elastic/kibana-app @@ -95,6 +95,7 @@ # Maps /x-pack/legacy/plugins/maps/ @elastic/kibana-gis +/x-pack/plugins/maps/ @elastic/kibana-gis /x-pack/test/api_integration/apis/maps/ @elastic/kibana-gis /x-pack/test/functional/apps/maps/ @elastic/kibana-gis /x-pack/test/functional/es_archives/maps/ @elastic/kibana-gis diff --git a/.sass-lint.yml b/.sass-lint.yml index 0c33eaf794c69..5c2c88a1dad5d 100644 --- a/.sass-lint.yml +++ b/.sass-lint.yml @@ -9,9 +9,10 @@ files: - 'x-pack/legacy/plugins/canvas/**/*.s+(a|c)ss' - 'x-pack/plugins/triggers_actions_ui/**/*.s+(a|c)ss' - 'x-pack/plugins/lens/**/*.s+(a|c)ss' + - 'x-pack/legacy/plugins/maps/**/*.s+(a|c)ss' + - 'x-pack/plugins/maps/**/*.s+(a|c)ss' ignore: - 'x-pack/legacy/plugins/canvas/shareable_runtime/**/*.s+(a|c)ss' - - 'x-pack/legacy/plugins/maps/**/*.s+(a|c)ss' rules: quotes: - 2 diff --git a/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/style_settings/_style_settings.scss b/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/style_settings/_style_settings.scss index 249b6dfca5c76..f9ad412f7e48a 100644 --- a/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/style_settings/_style_settings.scss +++ b/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/style_settings/_style_settings.scss @@ -1,3 +1,3 @@ .mapStyleSettings__fixedBox { - width: $euiSize * 7.5; -} \ No newline at end of file + width: $euiSize * 7.5; +} From e44cf28c98b4c05b9c5899d9138b8a639782ddfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Wed, 15 Apr 2020 12:19:15 -0400 Subject: [PATCH 31/80] Fix alerting documentation encryption key requirement (#63512) * Fix documentation to indicate encryption key config required regardless if security is used or not * Update docs/user/alerting/index.asciidoc Co-Authored-By: gchaps <33642766+gchaps@users.noreply.github.com> * Update docs/user/alerting/index.asciidoc Co-Authored-By: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- docs/user/alerting/index.asciidoc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/user/alerting/index.asciidoc b/docs/user/alerting/index.asciidoc index f556cf71bf06c..df11f5f03a7de 100644 --- a/docs/user/alerting/index.asciidoc +++ b/docs/user/alerting/index.asciidoc @@ -154,10 +154,13 @@ Pre-packaged *alert types* simplify setup, hide the details complex domain-speci [[alerting-setup-prerequisites]] == Setup and prerequisites +If you are using an *on-premises* Elastic Stack deployment: + +* In the kibana.yml configuration file, add the <> setting. + If you are using an *on-premises* Elastic Stack deployment with <>: -* TLS must be configured for communication <>. {kib} alerting uses <> to secure background alert checks and actions, and API keys require {ref}/configuring-tls.html#tls-http[TLS on the HTTP interface]. -* In the kibana.yml configuration file, add the <> +* Transport Layer Security (TLS) must be configured for communication <>. {kib} alerting uses <> to secure background alert checks and actions, and API keys require {ref}/configuring-tls.html#tls-http[TLS on the HTTP interface]. [float] [[alerting-security]] From 7058070e15f8e558a7403585ba57c6c0802e33ee Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 15 Apr 2020 18:40:34 +0200 Subject: [PATCH 32/80] [ML] Extract apiDoc params from the schema definitions (#62933) * [ML] WIP apiDoc schema extractor * [ML] extract actual type * [ML] refactor schema definitions * [ML] Update README.md * [ML] extract nested * [ML] call job validation endpoint with complete payload * [ML] escape special chars and fix line breaks * [ML] clean up extractDocEntries * [ML] serializeWithType * [ML] add missing annotations * [ML] fix parent schema assigment * [ML] support object composition * [ML] support multiple schemas per block * [ML] fix for collections * [ML] fix calendarIdsSchema * [ML] add ml package.json with apidoc commands * [ML] use the single output markdown file * [ML] fix typo * [ML] change the Calendars order * [ML] adjust the order in adidoc.json * [ML] update api version * [ML] update tsconfig.json include * [ML] update packages/kbn-pm/dist/index.js * [ML] update ML overrides in .eslintrc.js * [ML] yarn.lock symlink * Revert "[ML] yarn.lock symlink" This reverts commit 07f06801 Co-authored-by: Elastic Machine --- .eslintrc.js | 8 +- packages/kbn-pm/dist/index.js | 31 +- x-pack/plugins/ml/package.json | 15 + x-pack/plugins/ml/server/routes/README.md | 11 +- .../plugins/ml/server/routes/annotations.ts | 20 +- .../ml/server/routes/anomaly_detectors.ts | 133 ++---- x-pack/plugins/ml/server/routes/apidoc.json | 52 ++- .../routes/apidoc_scripts/schema_extractor.ts | 168 ++++++++ .../routes/apidoc_scripts/schema_parser.ts | 37 ++ .../routes/apidoc_scripts/schema_worker.ts | 80 ++++ .../routes/apidoc_scripts/tsconfig.json | 14 + .../ml/server/routes/apidoc_scripts/types.ts | 42 ++ .../routes/apidoc_scripts/version_filter.ts | 21 + x-pack/plugins/ml/server/routes/calendars.ts | 58 ++- .../ml/server/routes/data_frame_analytics.ts | 63 ++- .../ml/server/routes/data_visualizer.ts | 17 +- x-pack/plugins/ml/server/routes/datafeeds.ts | 46 +- .../ml/server/routes/fields_service.ts | 4 + .../ml/server/routes/file_data_visualizer.ts | 44 +- x-pack/plugins/ml/server/routes/filters.ts | 22 +- x-pack/plugins/ml/server/routes/indices.ts | 11 +- .../ml/server/routes/job_audit_messages.ts | 14 +- .../plugins/ml/server/routes/job_service.ts | 42 +- .../ml/server/routes/job_validation.ts | 12 +- x-pack/plugins/ml/server/routes/modules.ts | 2 +- .../ml/server/routes/results_service.ts | 21 +- .../routes/schemas/annotations_schema.ts | 11 +- .../schemas/anomaly_detectors_schema.ts | 73 +++- .../server/routes/schemas/calendars_schema.ts | 11 +- .../routes/schemas/data_analytics_schema.ts | 26 +- .../routes/schemas/data_visualizer_schema.ts | 52 +-- .../server/routes/schemas/datafeeds_schema.ts | 6 + .../schemas/file_data_visualizer_schema.ts | 43 ++ .../server/routes/schemas/filters_schema.ts | 15 +- .../server/routes/schemas/indices_schema.ts | 11 + .../schemas/job_audit_messages_schema.ts | 13 + .../routes/schemas/job_service_schema.ts | 16 +- .../routes/schemas/job_validation_schema.ts | 4 +- .../routes/schemas/results_service_schema.ts | 20 +- yarn.lock | 392 +++++++++++++++++- 40 files changed, 1334 insertions(+), 347 deletions(-) create mode 100644 x-pack/plugins/ml/package.json create mode 100644 x-pack/plugins/ml/server/routes/apidoc_scripts/schema_extractor.ts create mode 100644 x-pack/plugins/ml/server/routes/apidoc_scripts/schema_parser.ts create mode 100644 x-pack/plugins/ml/server/routes/apidoc_scripts/schema_worker.ts create mode 100644 x-pack/plugins/ml/server/routes/apidoc_scripts/tsconfig.json create mode 100644 x-pack/plugins/ml/server/routes/apidoc_scripts/types.ts create mode 100644 x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts create mode 100644 x-pack/plugins/ml/server/routes/schemas/file_data_visualizer_schema.ts create mode 100644 x-pack/plugins/ml/server/routes/schemas/indices_schema.ts create mode 100644 x-pack/plugins/ml/server/routes/schemas/job_audit_messages_schema.ts diff --git a/.eslintrc.js b/.eslintrc.js index 246702aedf863..dc2eaa993ce8b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -536,9 +536,15 @@ module.exports = { * ML overrides */ { - files: ['x-pack/legacy/plugins/ml/**/*.js'], + files: ['x-pack/plugins/ml/**/*.js'], rules: { 'no-shadow': 'error', + 'import/no-extraneous-dependencies': [ + 'error', + { + packageDir: './x-pack', + }, + ], }, }, diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index fa8884e2ece75..6a2d02ee778dd 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -42623,28 +42623,21 @@ module.exports = require("tty"); const os = __webpack_require__(11); const hasFlag = __webpack_require__(12); -const {env} = process; +const env = process.env; let forceColor; if (hasFlag('no-color') || hasFlag('no-colors') || - hasFlag('color=false') || - hasFlag('color=never')) { - forceColor = 0; + hasFlag('color=false')) { + forceColor = false; } else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') || hasFlag('color=always')) { - forceColor = 1; + forceColor = true; } if ('FORCE_COLOR' in env) { - if (env.FORCE_COLOR === true || env.FORCE_COLOR === 'true') { - forceColor = 1; - } else if (env.FORCE_COLOR === false || env.FORCE_COLOR === 'false') { - forceColor = 0; - } else { - forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); - } + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; } function translateLevel(level) { @@ -42661,7 +42654,7 @@ function translateLevel(level) { } function supportsColor(stream) { - if (forceColor === 0) { + if (forceColor === false) { return 0; } @@ -42675,15 +42668,11 @@ function supportsColor(stream) { return 2; } - if (stream && !stream.isTTY && forceColor === undefined) { + if (stream && !stream.isTTY && forceColor !== true) { return 0; } - const min = forceColor || 0; - - if (env.TERM === 'dumb') { - return min; - } + const min = forceColor ? 1 : 0; if (process.platform === 'win32') { // Node.js 7.5.0 is the first version of Node.js to include a patch to @@ -42744,6 +42733,10 @@ function supportsColor(stream) { return 1; } + if (env.TERM === 'dumb') { + return min; + } + return min; } diff --git a/x-pack/plugins/ml/package.json b/x-pack/plugins/ml/package.json new file mode 100644 index 0000000000000..739dd806fcbb9 --- /dev/null +++ b/x-pack/plugins/ml/package.json @@ -0,0 +1,15 @@ +{ + "author": "Elastic", + "name": "ml", + "version": "0.0.0", + "private": true, + "license": "Elastic-License", + "scripts": { + "build:apiDocScripts": "cd server/routes/apidoc_scripts && tsc", + "apiDocs": "yarn build:apiDocScripts && cd ./server/routes/ && apidoc --parse-workers apischema=./apidoc_scripts/target/schema_worker.js --parse-parsers apischema=./apidoc_scripts/target/schema_parser.js --parse-filters apiversion=./apidoc_scripts/target/version_filter.js -i . -o ../routes_doc && apidoc-markdown -p ../routes_doc -o ../routes_doc/ML_API.md" + }, + "devDependencies": { + "apidoc": "^0.20.1", + "apidoc-markdown": "^5.0.0" + } +} diff --git a/x-pack/plugins/ml/server/routes/README.md b/x-pack/plugins/ml/server/routes/README.md index 1d08335af3d2e..70af73c37dadd 100644 --- a/x-pack/plugins/ml/server/routes/README.md +++ b/x-pack/plugins/ml/server/routes/README.md @@ -6,11 +6,14 @@ Each route handler requires [apiDoc](https://github.com/apidoc/apidoc) annotatio to generate documentation. The [apidoc-markdown](https://github.com/rigwild/apidoc-markdown) package is also required in order to generate the markdown. -For now the process is pretty manual. You need to make sure the packages mentioned above are installed globally -to execute the following command from the directory in which this README file is located. +There are custom parser and worker (`x-pack/plugins/ml/server/routes/apidoc_scripts`) to process api schemas for each documentation entry. It's written with typescript so make sure all the scripts in the folder are compiled before executing `apidoc` command. + +Make sure you have run `yarn kbn bootstrap` to get all requires dev dependencies. Then execute the following command from the ml plugin folder: ``` -apidoc -i . -o ../routes_doc && apidoc-markdown -p ../routes_doc -o ../routes_doc/ML_API.md +yarn run apiDocs ``` +It compiles all the required scripts and generates the documentation both in HTML and Markdown formats. + It will create a new directory `routes_doc` (next to the `routes` folder) which contains the documentation in HTML format -as well as `ML_API.md` file. \ No newline at end of file +as well as `ML_API.md` file. diff --git a/x-pack/plugins/ml/server/routes/annotations.ts b/x-pack/plugins/ml/server/routes/annotations.ts index 56c0b639e2c85..d5abebda00caa 100644 --- a/x-pack/plugins/ml/server/routes/annotations.ts +++ b/x-pack/plugins/ml/server/routes/annotations.ts @@ -5,10 +5,8 @@ */ import Boom from 'boom'; -import _ from 'lodash'; import { i18n } from '@kbn/i18n'; -import { schema } from '@kbn/config-schema'; import { SecurityPluginSetup } from '../../../security/server'; import { isAnnotationsFeatureAvailable } from '../lib/check_annotations'; import { annotationServiceProvider } from '../models/annotation_service'; @@ -45,10 +43,7 @@ export function annotationRoutes( * @apiName GetAnnotations * @apiDescription Gets annotations. * - * @apiParam {String[]} jobIds List of job IDs - * @apiParam {String} earliestMs - * @apiParam {Number} latestMs - * @apiParam {Number} maxAnnotations Max limit of annotations returned + * @apiSchema (body) getAnnotationsSchema * * @apiSuccess {Boolean} success * @apiSuccess {Object} annotations @@ -57,7 +52,7 @@ export function annotationRoutes( { path: '/api/ml/annotations', validate: { - body: schema.object(getAnnotationsSchema), + body: getAnnotationsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -83,14 +78,13 @@ export function annotationRoutes( * @apiName IndexAnnotations * @apiDescription Index the annotation. * - * @apiParam {Object} annotation - * @apiParam {String} username + * @apiSchema (body) indexAnnotationSchema */ router.put( { path: '/api/ml/annotations/index', validate: { - body: schema.object(indexAnnotationSchema), + body: indexAnnotationSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -124,17 +118,17 @@ export function annotationRoutes( /** * @apiGroup Annotations * - * @api {delete} /api/ml/annotations/index Deletes annotation + * @api {delete} /api/ml/annotations/delete/:annotationId Deletes annotation * @apiName DeleteAnnotation * @apiDescription Deletes specified annotation * - * @apiParam {String} annotationId + * @apiSchema (params) deleteAnnotationSchema */ router.delete( { path: '/api/ml/annotations/delete/{annotationId}', validate: { - params: schema.object(deleteAnnotationSchema), + params: deleteAnnotationSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/anomaly_detectors.ts b/x-pack/plugins/ml/server/routes/anomaly_detectors.ts index d03e76072c315..a675eb58dc792 100644 --- a/x-pack/plugins/ml/server/routes/anomaly_detectors.ts +++ b/x-pack/plugins/ml/server/routes/anomaly_detectors.ts @@ -10,6 +10,13 @@ import { RouteInitialization } from '../types'; import { anomalyDetectionJobSchema, anomalyDetectionUpdateJobSchema, + jobIdSchema, + getRecordsSchema, + getBucketsSchema, + getOverallBucketsSchema, + getCategoriesSchema, + forecastAnomalyDetector, + getBucketParamsSchema, } from './schemas/anomaly_detectors_schema'; /** @@ -50,15 +57,13 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName GetAnomalyDetectorsById * @apiDescription Returns the anomaly detection job. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema */ router.get( { path: '/api/ml/anomaly_detectors/{jobId}', validate: { - params: schema.object({ - jobId: schema.string(), - }), + params: jobIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -108,15 +113,13 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName GetAnomalyDetectorsStatsById * @apiDescription Returns anomaly detection job statistics. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema */ router.get( { path: '/api/ml/anomaly_detectors/{jobId}/_stats', validate: { - params: schema.object({ - jobId: schema.string(), - }), + params: jobIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -139,15 +142,14 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName CreateAnomalyDetectors * @apiDescription Creates an anomaly detection job. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema + * @apiSchema (body) anomalyDetectionJobSchema */ router.put( { path: '/api/ml/anomaly_detectors/{jobId}', validate: { - params: schema.object({ - jobId: schema.string(), - }), + params: jobIdSchema, body: schema.object(anomalyDetectionJobSchema), }, }, @@ -174,16 +176,15 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName UpdateAnomalyDetectors * @apiDescription Updates certain properties of an anomaly detection job. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema + * @apiSchema (body) anomalyDetectionUpdateJobSchema */ router.post( { path: '/api/ml/anomaly_detectors/{jobId}/_update', validate: { - params: schema.object({ - jobId: schema.string(), - }), - body: schema.object({ ...anomalyDetectionUpdateJobSchema }), + params: jobIdSchema, + body: anomalyDetectionUpdateJobSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -209,15 +210,13 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName OpenAnomalyDetectorsJob * @apiDescription Opens an anomaly detection job. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema */ router.post( { path: '/api/ml/anomaly_detectors/{jobId}/_open', validate: { - params: schema.object({ - jobId: schema.string(), - }), + params: jobIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -242,15 +241,13 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName CloseAnomalyDetectorsJob * @apiDescription Closes an anomaly detection job. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema */ router.post( { path: '/api/ml/anomaly_detectors/{jobId}/_close', validate: { - params: schema.object({ - jobId: schema.string(), - }), + params: jobIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -279,15 +276,13 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName DeleteAnomalyDetectorsJob * @apiDescription Deletes specified anomaly detection job. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema */ router.delete( { path: '/api/ml/anomaly_detectors/{jobId}', validate: { - params: schema.object({ - jobId: schema.string(), - }), + params: jobIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -315,8 +310,6 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/anomaly_detectors/_validate/detector Validate detector * @apiName ValidateAnomalyDetector * @apiDescription Validates specified detector. - * - * @apiParam {String} jobId Job ID. */ router.post( { @@ -346,16 +339,15 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName ForecastAnomalyDetector * @apiDescription Creates a forecast for the specified anomaly detection job, predicting the future behavior of a time series by using its historical behavior. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema + * @apiSchema (body) forecastAnomalyDetector */ router.post( { path: '/api/ml/anomaly_detectors/{jobId}/_forecast', validate: { - params: schema.object({ - jobId: schema.string(), - }), - body: schema.object({ duration: schema.any() }), + params: jobIdSchema, + body: forecastAnomalyDetector, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -382,7 +374,8 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName GetRecords * @apiDescription Retrieves anomaly records for a job. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema + * @apiSchema (body) getRecordsSchema * * @apiSuccess {Number} count * @apiSuccess {Object[]} records @@ -391,23 +384,8 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { { path: '/api/ml/anomaly_detectors/{jobId}/results/records', validate: { - params: schema.object({ - jobId: schema.string(), - }), - body: schema.object({ - desc: schema.maybe(schema.boolean()), - end: schema.maybe(schema.string()), - exclude_interim: schema.maybe(schema.boolean()), - page: schema.maybe( - schema.object({ - from: schema.maybe(schema.number()), - size: schema.maybe(schema.number()), - }) - ), - record_score: schema.maybe(schema.number()), - sort: schema.maybe(schema.string()), - start: schema.maybe(schema.string()), - }), + params: jobIdSchema, + body: getRecordsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -432,8 +410,8 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName GetBuckets * @apiDescription The get buckets API presents a chronological view of the records, grouped by bucket. * - * @apiParam {String} jobId Job ID. - * @apiParam {String} timestamp. + * @apiSchema (params) getBucketParamsSchema + * @apiSchema (body) getBucketsSchema * * @apiSuccess {Number} count * @apiSuccess {Object[]} buckets @@ -442,25 +420,8 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { { path: '/api/ml/anomaly_detectors/{jobId}/results/buckets/{timestamp?}', validate: { - params: schema.object({ - jobId: schema.string(), - timestamp: schema.maybe(schema.string()), - }), - body: schema.object({ - anomaly_score: schema.maybe(schema.number()), - desc: schema.maybe(schema.boolean()), - end: schema.maybe(schema.string()), - exclude_interim: schema.maybe(schema.boolean()), - expand: schema.maybe(schema.boolean()), - page: schema.maybe( - schema.object({ - from: schema.maybe(schema.number()), - size: schema.maybe(schema.number()), - }) - ), - sort: schema.maybe(schema.string()), - start: schema.maybe(schema.string()), - }), + params: getBucketParamsSchema, + body: getBucketsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -486,7 +447,8 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName GetOverallBuckets * @apiDescription Retrieves overall bucket results that summarize the bucket results of multiple anomaly detection jobs. * - * @apiParam {String} jobId Job ID. + * @apiSchema (params) jobIdSchema + * @apiSchema (body) getOverallBucketsSchema * * @apiSuccess {Number} count * @apiSuccess {Object[]} overall_buckets @@ -495,15 +457,8 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { { path: '/api/ml/anomaly_detectors/{jobId}/results/overall_buckets', validate: { - params: schema.object({ - jobId: schema.string(), - }), - body: schema.object({ - topN: schema.number(), - bucketSpan: schema.string(), - start: schema.number(), - end: schema.number(), - }), + params: jobIdSchema, + body: getOverallBucketsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -531,17 +486,13 @@ export function jobRoutes({ router, mlLicense }: RouteInitialization) { * @apiName GetCategories * @apiDescription Returns the categories results for the specified job ID and category ID. * - * @apiParam {String} jobId Job ID. - * @apiParam {String} categoryId Category ID. + * @apiSchema (params) getCategoriesSchema */ router.get( { path: '/api/ml/anomaly_detectors/{jobId}/results/categories/{categoryId}', validate: { - params: schema.object({ - categoryId: schema.string(), - jobId: schema.string(), - }), + params: getCategoriesSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/apidoc.json b/x-pack/plugins/ml/server/routes/apidoc.json index c5aa3e4d792fd..4848de6db7049 100644 --- a/x-pack/plugins/ml/server/routes/apidoc.json +++ b/x-pack/plugins/ml/server/routes/apidoc.json @@ -1,6 +1,6 @@ { "name": "ml_kibana_api", - "version": "0.1.0", + "version": "7.8.0", "description": "ML Kibana API", "title": "ML Kibana API", "order": [ @@ -9,61 +9,65 @@ "GetDataFrameAnalyticsById", "GetDataFrameAnalyticsStats", "GetDataFrameAnalyticsStatsById", - "UpdateDataFrameAnalytics", "EvaluateDataFrameAnalytics", "ExplainDataFrameAnalytics", - "DeleteDataFrameAnalytics", "StartDataFrameAnalyticsJob", "StopsDataFrameAnalyticsJob", "GetDataFrameAnalyticsMessages", + "UpdateDataFrameAnalytics", + "DeleteDataFrameAnalytics", + "DataVisualizer", "GetOverallStats", "GetStatsForFields", + "AnomalyDetectors", + "CreateAnomalyDetectors", + "OpenAnomalyDetectorsJob", "GetAnomalyDetectors", "GetAnomalyDetectorsById", "GetAnomalyDetectorsStats", "GetAnomalyDetectorsStatsById", - "CreateAnomalyDetectors", - "UpdateAnomalyDetectors", - "OpenAnomalyDetectorsJob", "CloseAnomalyDetectorsJob", - "DeleteAnomalyDetectorsJob", "ValidateAnomalyDetector", "ForecastAnomalyDetector", "GetRecords", "GetBuckets", "GetOverallBuckets", "GetCategories", + "UpdateAnomalyDetectors", + "DeleteAnomalyDetectorsJob", + "FileDataVisualizer", "AnalyzeFile", "ImportFile", + "ResultsService", "GetAnomaliesTableData", "GetCategoryDefinition", "GetMaxAnomalyScore", "GetCategoryExamples", "GetPartitionFieldsValues", + "DataRecognizer", "RecognizeIndex", "GetModule", "SetupModule", "CheckExistingModuleJobs", + "Annotations", "GetAnnotations", "IndexAnnotations", "DeleteAnnotation", + "JobService", "ForceStartDatafeeds", "StopDatafeeds", - "DeleteJobs", "CloseJobs", "JobsSummary", "JobsWithTimeRange", "CreateFullJobsList", "GetAllGroups", - "UpdateGroups", - "DeletingJobTasks", "JobsExist", "NewJobCaps", "NewJobLineChart", @@ -72,42 +76,60 @@ "GetLookBackProgress", "ValidateCategoryExamples", "TopCategories", + "UpdateGroups", + "DeletingJobTasks", + "DeleteJobs", + + "Calendars", + "PutCalendars", + "GetCalendars", + "GetCalendarById", + "UpdateCalendarById", + "DeleteCalendarById", + "Filters", + "CreateFilter", "GetFilters", "GetFilterById", - "CreateFilter", + "GetFiltersStats", "UpdateFilter", "DeleteFilter", - "GetFiltersStats", + "Indices", "FieldCaps", + "SystemRoutes", "HasPrivileges", "MlCapabilities", "MlNodeCount", "MlInfo", "MlEsSearch", + "JobAuditMessages", "GetJobAuditMessages", "GetAllJobAuditMessages", + "JobValidation", "EstimateBucketSpan", "CalculateModelMemoryLimit", "ValidateCardinality", "ValidateJob", + "NotificationSettings", "GetNotificationSettings", + "DatafeedService", + "CreateDatafeed", + "PreviewDatafeed", "GetDatafeeds", "GetDatafeed", "GetDatafeedsStats", "GetDatafeedStats", - "CreateDatafeed", "UpdateDatafeed", - "DeleteDatafeed", "StartDatafeed", "StopDatafeed", - "PreviewDatafeed", + "DeleteDatafeed", + "FieldsService", "GetCardinalityOfFields", "GetTimeFieldRange" diff --git a/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_extractor.ts b/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_extractor.ts new file mode 100644 index 0000000000000..01adcb462689e --- /dev/null +++ b/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_extractor.ts @@ -0,0 +1,168 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as ts from 'typescript'; + +export interface DocEntry { + name: string; + documentation?: string; + type: string; + optional?: boolean; + nested?: DocEntry[]; +} + +/** Generate documentation for all schema definitions in a set of .ts files */ +export function extractDocumentation( + fileNames: string[], + options: ts.CompilerOptions = { + target: ts.ScriptTarget.ES2015, + module: ts.ModuleKind.CommonJS, + } +): Map { + // Build a program using the set of root file names in fileNames + const program = ts.createProgram(fileNames, options); + + // Get the checker, we will use it to find more about properties + const checker: ts.TypeChecker = program.getTypeChecker(); + + // Result map + const result = new Map(); + + // Visit every sourceFile in the program + for (const sourceFile of program.getSourceFiles()) { + if (!sourceFile.isDeclarationFile) { + // Walk the tree to search for schemas + ts.forEachChild(sourceFile, visit); + } + } + + return result; + + /** visit nodes finding exported schemas */ + function visit(node: ts.Node) { + if (isNodeExported(node) && ts.isVariableDeclaration(node)) { + const schemaName = node.name.getText(); + const schemaType = checker.getTypeAtLocation(node); + result.set(schemaName, extractDocEntries(schemaType!)); + } + + if (node.getChildCount() > 0) { + ts.forEachChild(node, visit); + } + } + + /** + * Extracts doc entries for the schema definition + * @param schemaType + */ + function extractDocEntries(schemaType: ts.Type): DocEntry[] { + const collection: DocEntry[] = []; + + const members = getTypeMembers(schemaType); + + if (!members) { + return collection; + } + + members.forEach(member => { + collection.push(serializeProperty(member)); + }); + + return collection; + } + + /** + * Resolves members of the type + * @param type + */ + function getTypeMembers(type: ts.Type): ts.Symbol[] | undefined { + const argsOfType = checker.getTypeArguments((type as unknown) as ts.TypeReference); + + let members = type.getProperties(); + + if (argsOfType && argsOfType.length > 0) { + members = argsOfType[0].getProperties(); + } + + return members; + } + + function resolveTypeArgument(type: ts.Type): ts.SymbolTable | string { + // required to extract members + type.getProperty('type'); + + // @ts-ignores + let members = type.members; + + const typeArguments = checker.getTypeArguments((type as unknown) as ts.TypeReference); + + if (type.aliasTypeArguments) { + // @ts-ignores + members = type.aliasTypeArguments[0].members; + } + + if (typeArguments.length > 0) { + members = resolveTypeArgument(typeArguments[0]); + } + + if (members === undefined) { + members = checker.typeToString(type); + } + + return members; + } + + function serializeProperty(symbol: ts.Symbol): DocEntry { + // @ts-ignore + const typeOfSymbol = symbol.type; + const typeArguments = checker.getTypeArguments((typeOfSymbol as unknown) as ts.TypeReference); + + let resultType: ts.Type = typeOfSymbol; + + let members; + if (typeArguments.length > 0) { + members = resolveTypeArgument(typeArguments[0]); + resultType = typeArguments[0]; + } + + let typeAsString = checker.typeToString(resultType); + + const nestedEntries: DocEntry[] = []; + if (members && typeof members !== 'string' && members.size > 0) { + // we hit an object or collection + typeAsString = + resultType.symbol.name === 'Array' || typeOfSymbol.symbol.name === 'Array' + ? `${symbol.getName()}[]` + : symbol.getName(); + + members.forEach(member => { + nestedEntries.push(serializeProperty(member)); + }); + } + + return { + name: symbol.getName(), + documentation: getCommentString(symbol), + type: typeAsString, + ...(nestedEntries.length > 0 ? { nested: nestedEntries } : {}), + }; + } + + function getCommentString(symbol: ts.Symbol): string { + return ts.displayPartsToString(symbol.getDocumentationComment(checker)).replace(/\n/g, ' '); + } + + /** + * True if this is visible outside this file, false otherwise + */ + function isNodeExported(node: ts.Node): boolean { + return ( + // eslint-disable-next-line no-bitwise + (ts.getCombinedModifierFlags(node as ts.Declaration) & ts.ModifierFlags.Export) !== 0 || + (!!node.parent && node.parent.kind === ts.SyntaxKind.SourceFile) + ); + } +} diff --git a/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_parser.ts b/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_parser.ts new file mode 100644 index 0000000000000..eabe7dcd7bd8f --- /dev/null +++ b/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_parser.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +function parse(content?: string) { + const schema = typeof content === 'string' && content.trim(); + + if (!schema) { + return null; + } + + const result = schema.match(/\((\w+)\)\s+(\w+)/); + + if (result === null || result.length < 3) { + throw new Error( + 'Invalid schema definition. Required format is `@apiSchema () `' + ); + } + + const group = result[1]; + + return { + group, + name: result[2], + }; +} + +/** + * Exports + */ +module.exports = { + parse, + path: 'local.schemas', + method: 'push', +}; diff --git a/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_worker.ts b/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_worker.ts new file mode 100644 index 0000000000000..7514e482783b3 --- /dev/null +++ b/x-pack/plugins/ml/server/routes/apidoc_scripts/schema_worker.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as fs from 'fs'; +import * as path from 'path'; +import { DocEntry, extractDocumentation } from './schema_extractor'; +import { ApiParameter, Block } from './types'; + +export function postProcess(parsedFiles: any[]): void { + const schemasDirPath = `${__dirname}${path.sep}..${path.sep}..${path.sep}schemas${path.sep}`; + const schemaFiles = fs + .readdirSync(schemasDirPath) + .map(filename => path.resolve(schemasDirPath + filename)); + + const schemaDocs = extractDocumentation(schemaFiles); + + parsedFiles.forEach(parsedFile => { + parsedFile.forEach((block: Block) => { + const { + local: { schemas }, + } = block; + if (!schemas || schemas.length === 0) return; + + for (const schema of schemas) { + const { name: schemaName, group: paramsGroup } = schema; + const schemaFields = schemaDocs.get(schemaName); + + if (!schemaFields) return; + + updateBlockParameters(schemaFields, block, paramsGroup); + } + }); + }); +} + +/** + * Extracts schema's doc entries to apidoc parameters + * @param docEntries + * @param block + * @param paramsGroup + */ +function updateBlockParameters(docEntries: DocEntry[], block: Block, paramsGroup: string): void { + if (!block.local.parameter) { + block.local.parameter = { + fields: {}, + }; + } + + if (!block.local.parameter.fields![paramsGroup]) { + block.local.parameter.fields![paramsGroup] = []; + } + const collection = block.local.parameter.fields![paramsGroup] as ApiParameter[]; + + for (const field of docEntries) { + collection.push({ + group: paramsGroup, + type: escapeSpecial(field.type), + size: undefined, + allowedValues: undefined, + optional: !!field.optional, + field: field.name, + defaultValue: undefined, + description: field.documentation, + }); + + if (field.nested) { + updateBlockParameters(field.nested, block, field.name); + } + } +} + +/** + * Escape special character to make sure the markdown table isn't broken + */ +function escapeSpecial(str: string): string { + return str.replace(/\|/g, '\\|'); +} diff --git a/x-pack/plugins/ml/server/routes/apidoc_scripts/tsconfig.json b/x-pack/plugins/ml/server/routes/apidoc_scripts/tsconfig.json new file mode 100644 index 0000000000000..e3108b8c759f4 --- /dev/null +++ b/x-pack/plugins/ml/server/routes/apidoc_scripts/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "./target", + "target": "es6", + "moduleResolution": "node" + }, + "include": [ + "schema_worker.ts", + "schema_parser.ts", + "schema_extractor.ts", + "version_filter.ts" + ] +} diff --git a/x-pack/plugins/ml/server/routes/apidoc_scripts/types.ts b/x-pack/plugins/ml/server/routes/apidoc_scripts/types.ts new file mode 100644 index 0000000000000..08a443905ee05 --- /dev/null +++ b/x-pack/plugins/ml/server/routes/apidoc_scripts/types.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export interface ApiParameter { + group: string; + type: any; + size: undefined; + allowedValues: undefined; + optional: boolean; + field: string; + defaultValue: undefined; + description?: string; +} + +interface Local { + group: string; + type: string; + url: string; + title: string; + name: string; + description: string; + parameter: { + fields?: { + [key: string]: ApiParameter[] | undefined; + }; + }; + success: { fields: ObjectConstructor[] }; + version: string; + filename: string; + schemas?: Array<{ + name: string; + group: string; + }>; +} + +export interface Block { + global: any; + local: Local; +} diff --git a/x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts b/x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts new file mode 100644 index 0000000000000..8cbe38d667b2c --- /dev/null +++ b/x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Block } from './types'; + +const API_VERSION = '7.8.0'; + +/** + * Post Filter parsed results. + * Updates api version of the endpoints. + */ +export function postFilter(parsedFiles: any[]) { + parsedFiles.forEach(parsedFile => { + parsedFile.forEach((block: Block) => { + block.local.version = API_VERSION; + }); + }); +} diff --git a/x-pack/plugins/ml/server/routes/calendars.ts b/x-pack/plugins/ml/server/routes/calendars.ts index 34950c6ed79f7..a17601f74ae93 100644 --- a/x-pack/plugins/ml/server/routes/calendars.ts +++ b/x-pack/plugins/ml/server/routes/calendars.ts @@ -5,10 +5,9 @@ */ import { RequestHandlerContext } from 'kibana/server'; -import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; -import { calendarSchema } from './schemas/calendars_schema'; +import { calendarSchema, calendarIdSchema, calendarIdsSchema } from './schemas/calendars_schema'; import { CalendarManager, Calendar, FormCalendar } from '../models/calendar'; function getAllCalendars(context: RequestHandlerContext) { @@ -42,7 +41,13 @@ function getCalendarsByIds(context: RequestHandlerContext, calendarIds: string) } export function calendars({ router, mlLicense }: RouteInitialization) { - // Gets calendars - size limit has been explicitly set to 1000 + /** + * @apiGroup Calendars + * + * @api {get} /api/ml/calendars Gets calendars + * @apiName GetCalendars + * @apiDescription Gets calendars - size limit has been explicitly set to 1000 + */ router.get( { path: '/api/ml/calendars', @@ -61,11 +66,20 @@ export function calendars({ router, mlLicense }: RouteInitialization) { }) ); + /** + * @apiGroup Calendars + * + * @api {get} /api/ml/calendars/:calendarIds Gets a calendar + * @apiName GetCalendarById + * @apiDescription Gets calendar by id + * + * @apiSchema (params) calendarIdsSchema + */ router.get( { path: '/api/ml/calendars/{calendarIds}', validate: { - params: schema.object({ calendarIds: schema.string() }), + params: calendarIdsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -88,11 +102,20 @@ export function calendars({ router, mlLicense }: RouteInitialization) { }) ); + /** + * @apiGroup Calendars + * + * @api {put} /api/ml/calendars Creates a calendar + * @apiName PutCalendars + * @apiDescription Creates a calendar + * + * @apiSchema (body) calendarSchema + */ router.put( { path: '/api/ml/calendars', validate: { - body: schema.object({ ...calendarSchema }), + body: calendarSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -109,12 +132,22 @@ export function calendars({ router, mlLicense }: RouteInitialization) { }) ); + /** + * @apiGroup Calendars + * + * @api {put} /api/ml/calendars/:calendarId Updates a calendar + * @apiName UpdateCalendarById + * @apiDescription Updates a calendar + * + * @apiSchema (params) calendarIdSchema + * @apiSchema (body) calendarSchema + */ router.put( { path: '/api/ml/calendars/{calendarId}', validate: { - params: schema.object({ calendarId: schema.string() }), - body: schema.object({ ...calendarSchema }), + params: calendarIdSchema, + body: calendarSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -132,11 +165,20 @@ export function calendars({ router, mlLicense }: RouteInitialization) { }) ); + /** + * @apiGroup Calendars + * + * @api {delete} /api/ml/calendars/:calendarId Deletes a calendar + * @apiName DeleteCalendarById + * @apiDescription Deletes a calendar + * + * @apiSchema (params) calendarIdSchema + */ router.delete( { path: '/api/ml/calendars/{calendarId}', validate: { - params: schema.object({ calendarId: schema.string() }), + params: calendarIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts index 7ed1aa02b24ab..dd9e0ea66aa9d 100644 --- a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts +++ b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { analyticsAuditMessagesProvider } from '../models/data_frame_analytics/analytics_audit_messages'; import { RouteInitialization } from '../types'; @@ -12,6 +11,8 @@ import { dataAnalyticsJobConfigSchema, dataAnalyticsEvaluateSchema, dataAnalyticsExplainSchema, + analyticsIdSchema, + stopsDataFrameAnalyticsJobQuerySchema, } from './schemas/data_analytics_schema'; /** @@ -31,9 +32,7 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat router.get( { path: '/api/ml/data_frame/analytics', - validate: { - params: schema.object({ analyticsId: schema.maybe(schema.string()) }), - }, + validate: false, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { try { @@ -54,13 +53,13 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiName GetDataFrameAnalyticsById * @apiDescription Returns the data frame analytics job. * - * @apiParam {String} analyticsId Analytics ID. + * @apiSchema (params) analyticsIdSchema */ router.get( { path: '/api/ml/data_frame/analytics/{analyticsId}', validate: { - params: schema.object({ analyticsId: schema.string() }), + params: analyticsIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -111,13 +110,13 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiName GetDataFrameAnalyticsStatsById * @apiDescription Returns data frame analytics job statistics. * - * @apiParam {String} analyticsId Analytics ID. + * @apiSchema (params) analyticsIdSchema */ router.get( { path: '/api/ml/data_frame/analytics/{analyticsId}/_stats', validate: { - params: schema.object({ analyticsId: schema.string() }), + params: analyticsIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -146,16 +145,15 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiDescription This API creates a data frame analytics job that performs an analysis * on the source index and stores the outcome in a destination index. * - * @apiParam {String} analyticsId Analytics ID. + * @apiSchema (params) analyticsIdSchema + * @apiSchema (body) dataAnalyticsJobConfigSchema */ router.put( { path: '/api/ml/data_frame/analytics/{analyticsId}', validate: { - params: schema.object({ - analyticsId: schema.string(), - }), - body: schema.object(dataAnalyticsJobConfigSchema), + params: analyticsIdSchema, + body: dataAnalyticsJobConfigSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -183,12 +181,14 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @api {post} /api/ml/data_frame/_evaluate Evaluate the data frame analytics for an annotated index * @apiName EvaluateDataFrameAnalytics * @apiDescription Evaluates the data frame analytics for an annotated index. + * + * @apiSchema (body) dataAnalyticsEvaluateSchema */ router.post( { path: '/api/ml/data_frame/_evaluate', validate: { - body: schema.object({ ...dataAnalyticsEvaluateSchema }), + body: dataAnalyticsEvaluateSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -216,19 +216,13 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiDescription This API provides explanations for a data frame analytics config * that either exists already or one that has not been created yet. * - * @apiParam {String} [description] - * @apiParam {Object} [dest] - * @apiParam {Object} source - * @apiParam {String} source.index - * @apiParam {Object} analysis - * @apiParam {Object} [analyzed_fields] - * @apiParam {String} [model_memory_limit] + * @apiSchema (body) dataAnalyticsExplainSchema */ router.post( { path: '/api/ml/data_frame/analytics/_explain', validate: { - body: schema.object({ ...dataAnalyticsExplainSchema }), + body: dataAnalyticsExplainSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -255,15 +249,13 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiName DeleteDataFrameAnalytics * @apiDescription Deletes specified data frame analytics job. * - * @apiParam {String} analyticsId Analytics ID. + * @apiSchema (params) analyticsIdSchema */ router.delete( { path: '/api/ml/data_frame/analytics/{analyticsId}', validate: { - params: schema.object({ - analyticsId: schema.string(), - }), + params: analyticsIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -291,15 +283,13 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiName StartDataFrameAnalyticsJob * @apiDescription Starts a data frame analytics job. * - * @apiParam {String} analyticsId Analytics ID. + * @apiSchema (params) analyticsIdSchema */ router.post( { path: '/api/ml/data_frame/analytics/{analyticsId}/_start', validate: { - params: schema.object({ - analyticsId: schema.string(), - }), + params: analyticsIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -324,16 +314,15 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiName StopsDataFrameAnalyticsJob * @apiDescription Stops a data frame analytics job. * - * @apiParam {String} analyticsId Analytics ID. + * @apiSchema (params) analyticsIdSchema + * @apiSchema (query) stopsDataFrameAnalyticsJobQuerySchema */ router.post( { path: '/api/ml/data_frame/analytics/{analyticsId}/_stop', validate: { - params: schema.object({ - analyticsId: schema.string(), - force: schema.maybe(schema.boolean()), - }), + params: analyticsIdSchema, + query: stopsDataFrameAnalyticsJobQuerySchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -367,13 +356,13 @@ export function dataFrameAnalyticsRoutes({ router, mlLicense }: RouteInitializat * @apiName GetDataFrameAnalyticsMessages * @apiDescription Returns the list of audit messages for data frame analytics jobs. * - * @apiParam {String} analyticsId Analytics ID. + * @apiSchema (params) analyticsIdSchema */ router.get( { path: '/api/ml/data_frame/analytics/{analyticsId}/messages', validate: { - params: schema.object({ analyticsId: schema.string() }), + params: analyticsIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/data_visualizer.ts b/x-pack/plugins/ml/server/routes/data_visualizer.ts index b37c80b815e1a..a4c0d5553a4b2 100644 --- a/x-pack/plugins/ml/server/routes/data_visualizer.ts +++ b/x-pack/plugins/ml/server/routes/data_visualizer.ts @@ -11,6 +11,7 @@ import { Field } from '../models/data_visualizer/data_visualizer'; import { dataVisualizerFieldStatsSchema, dataVisualizerOverallStatsSchema, + indexPatternTitleSchema, } from './schemas/data_visualizer_schema'; import { RouteInitialization } from '../types'; @@ -75,12 +76,16 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) * @apiName GetStatsForFields * @apiDescription Returns fields stats of the index pattern. * - * @apiParam {String} indexPatternTitle Index pattern title. + * @apiSchema (params) indexPatternTitleSchema + * @apiSchema (body) dataVisualizerFieldStatsSchema */ router.post( { path: '/api/ml/data_visualizer/get_field_stats/{indexPatternTitle}', - validate: dataVisualizerFieldStatsSchema, + validate: { + params: indexPatternTitleSchema, + body: dataVisualizerFieldStatsSchema, + }, }, mlLicense.basicLicenseAPIGuard(async (context, request, response) => { try { @@ -127,12 +132,16 @@ export function dataVisualizerRoutes({ router, mlLicense }: RouteInitialization) * @apiName GetOverallStats * @apiDescription Returns overall stats of the index pattern. * - * @apiParam {String} indexPatternTitle Index pattern title. + * @apiSchema (params) indexPatternTitleSchema + * @apiSchema (body) dataVisualizerOverallStatsSchema */ router.post( { path: '/api/ml/data_visualizer/get_overall_stats/{indexPatternTitle}', - validate: dataVisualizerOverallStatsSchema, + validate: { + params: indexPatternTitleSchema, + body: dataVisualizerOverallStatsSchema, + }, }, mlLicense.basicLicenseAPIGuard(async (context, request, response) => { try { diff --git a/x-pack/plugins/ml/server/routes/datafeeds.ts b/x-pack/plugins/ml/server/routes/datafeeds.ts index c1ee839340996..ec667e1d305f5 100644 --- a/x-pack/plugins/ml/server/routes/datafeeds.ts +++ b/x-pack/plugins/ml/server/routes/datafeeds.ts @@ -4,10 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; -import { startDatafeedSchema, datafeedConfigSchema } from './schemas/datafeeds_schema'; +import { + startDatafeedSchema, + datafeedConfigSchema, + datafeedIdSchema, + deleteDatafeedQuerySchema, +} from './schemas/datafeeds_schema'; /** * Routes for datafeed service @@ -44,12 +48,14 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {get} /api/ml/datafeeds/:datafeedId Get datafeed for given datafeed id * @apiName GetDatafeed * @apiDescription Retrieves configuration information for datafeed + * + * @apiSchema (params) datafeedIdSchema */ router.get( { path: '/api/ml/datafeeds/{datafeedId}', validate: { - params: schema.object({ datafeedId: schema.string() }), + params: datafeedIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -97,12 +103,14 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {get} /api/ml/datafeeds/:datafeedId/_stats Get datafeed stats for given datafeed id * @apiName GetDatafeedStats * @apiDescription Retrieves usage information for datafeed + * + * @apiSchema (params) datafeedIdSchema */ router.get( { path: '/api/ml/datafeeds/{datafeedId}/_stats', validate: { - params: schema.object({ datafeedId: schema.string() }), + params: datafeedIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -127,12 +135,15 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {put} /api/ml/datafeeds/:datafeedId Creates datafeed * @apiName CreateDatafeed * @apiDescription Instantiates a datafeed + * + * @apiSchema (params) datafeedIdSchema + * @apiSchema (body) datafeedConfigSchema */ router.put( { path: '/api/ml/datafeeds/{datafeedId}', validate: { - params: schema.object({ datafeedId: schema.string() }), + params: datafeedIdSchema, body: datafeedConfigSchema, }, }, @@ -159,12 +170,15 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/datafeeds/:datafeedId/_update Updates datafeed for given datafeed id * @apiName UpdateDatafeed * @apiDescription Updates certain properties of a datafeed + * + * @apiSchema (params) datafeedIdSchema + * @apiSchema (body) datafeedConfigSchema */ router.post( { path: '/api/ml/datafeeds/{datafeedId}/_update', validate: { - params: schema.object({ datafeedId: schema.string() }), + params: datafeedIdSchema, body: datafeedConfigSchema, }, }, @@ -191,13 +205,16 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {delete} /api/ml/datafeeds/:datafeedId Deletes datafeed * @apiName DeleteDatafeed * @apiDescription Deletes an existing datafeed + * + * @apiSchema (params) datafeedIdSchema + * @apiSchema (query) deleteDatafeedQuerySchema */ router.delete( { path: '/api/ml/datafeeds/{datafeedId}', validate: { - params: schema.object({ datafeedId: schema.string() }), - query: schema.maybe(schema.object({ force: schema.maybe(schema.any()) })), + params: datafeedIdSchema, + query: deleteDatafeedQuerySchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -227,12 +244,15 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/datafeeds/:datafeedId/_start Starts datafeed for given datafeed id(s) * @apiName StartDatafeed * @apiDescription Starts one or more datafeeds + * + * @apiSchema (params) datafeedIdSchema + * @apiSchema (body) startDatafeedSchema */ router.post( { path: '/api/ml/datafeeds/{datafeedId}/_start', validate: { - params: schema.object({ datafeedId: schema.string() }), + params: datafeedIdSchema, body: startDatafeedSchema, }, }, @@ -262,12 +282,14 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/datafeeds/:datafeedId/_stop Stops datafeed for given datafeed id(s) * @apiName StopDatafeed * @apiDescription Stops one or more datafeeds + * + * @apiSchema (params) datafeedIdSchema */ router.post( { path: '/api/ml/datafeeds/{datafeedId}/_stop', validate: { - params: schema.object({ datafeedId: schema.string() }), + params: datafeedIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -293,12 +315,14 @@ export function dataFeedRoutes({ router, mlLicense }: RouteInitialization) { * @api {get} /api/ml/datafeeds/:datafeedId/_preview Preview datafeed for given datafeed id * @apiName PreviewDatafeed * @apiDescription Previews a datafeed + * + * @apiSchema (params) datafeedIdSchema */ router.get( { path: '/api/ml/datafeeds/{datafeedId}/_preview', validate: { - params: schema.object({ datafeedId: schema.string() }), + params: datafeedIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/fields_service.ts b/x-pack/plugins/ml/server/routes/fields_service.ts index db7613b163457..9a5f47409c8a0 100644 --- a/x-pack/plugins/ml/server/routes/fields_service.ts +++ b/x-pack/plugins/ml/server/routes/fields_service.ts @@ -35,6 +35,8 @@ export function fieldsService({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/fields_service/field_cardinality Get cardinality of fields * @apiName GetCardinalityOfFields * @apiDescription Returns the cardinality of one or more fields. Returns an Object whose keys are the names of the fields, with values equal to the cardinality of the field + * + * @apiSchema (body) getCardinalityOfFieldsSchema */ router.post( { @@ -63,6 +65,8 @@ export function fieldsService({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/fields_service/time_field_range Get time field range * @apiName GetTimeFieldRange * @apiDescription Returns the timefield range for the given index + * + * @apiSchema (body) getTimeFieldRangeSchema */ router.post( { diff --git a/x-pack/plugins/ml/server/routes/file_data_visualizer.ts b/x-pack/plugins/ml/server/routes/file_data_visualizer.ts index 9f30847d9eb2e..3f3fc3f547b6a 100644 --- a/x-pack/plugins/ml/server/routes/file_data_visualizer.ts +++ b/x-pack/plugins/ml/server/routes/file_data_visualizer.ts @@ -22,6 +22,11 @@ import { import { RouteInitialization } from '../types'; import { updateTelemetry } from '../lib/telemetry'; +import { + analyzeFileQuerySchema, + importFileBodySchema, + importFileQuerySchema, +} from './schemas/file_data_visualizer_schema'; function analyzeFiles(context: RequestHandlerContext, data: InputData, overrides: InputOverrides) { const { analyzeFile } = fileDataVisualizerProvider(context.ml!.mlClient.callAsCurrentUser); @@ -51,30 +56,15 @@ export function fileDataVisualizerRoutes({ router, mlLicense }: RouteInitializat * @api {post} /api/ml/file_data_visualizer/analyze_file Analyze file data * @apiName AnalyzeFile * @apiDescription Performs analysis of the file data. + * + * @apiSchema (query) analyzeFileQuerySchema */ router.post( { path: '/api/ml/file_data_visualizer/analyze_file', validate: { body: schema.any(), - query: schema.maybe( - schema.object({ - charset: schema.maybe(schema.string()), - column_names: schema.maybe(schema.string()), - delimiter: schema.maybe(schema.string()), - explain: schema.maybe(schema.string()), - format: schema.maybe(schema.string()), - grok_pattern: schema.maybe(schema.string()), - has_header_row: schema.maybe(schema.string()), - line_merge_size_limit: schema.maybe(schema.string()), - lines_to_sample: schema.maybe(schema.string()), - quote: schema.maybe(schema.string()), - should_trim_fields: schema.maybe(schema.string()), - timeout: schema.maybe(schema.string()), - timestamp_field: schema.maybe(schema.string()), - timestamp_format: schema.maybe(schema.string()), - }) - ), + query: analyzeFileQuerySchema, }, options: { body: { @@ -99,24 +89,16 @@ export function fileDataVisualizerRoutes({ router, mlLicense }: RouteInitializat * @api {post} /api/ml/file_data_visualizer/import Import file data * @apiName ImportFile * @apiDescription Imports file data into elasticsearch index. + * + * @apiSchema (query) importFileQuerySchema + * @apiSchema (body) importFileBodySchema */ router.post( { path: '/api/ml/file_data_visualizer/import', validate: { - query: schema.object({ - id: schema.maybe(schema.string()), - }), - body: schema.object({ - index: schema.maybe(schema.string()), - data: schema.arrayOf(schema.any()), - settings: schema.maybe(schema.any()), - mappings: schema.any(), - ingestPipeline: schema.object({ - id: schema.maybe(schema.string()), - pipeline: schema.maybe(schema.any()), - }), - }), + query: importFileQuerySchema, + body: importFileBodySchema, }, options: { body: { diff --git a/x-pack/plugins/ml/server/routes/filters.ts b/x-pack/plugins/ml/server/routes/filters.ts index e827ed96b12af..738c25070358d 100644 --- a/x-pack/plugins/ml/server/routes/filters.ts +++ b/x-pack/plugins/ml/server/routes/filters.ts @@ -5,10 +5,9 @@ */ import { RequestHandlerContext } from 'kibana/server'; -import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; -import { createFilterSchema, updateFilterSchema } from './schemas/filters_schema'; +import { createFilterSchema, filterIdSchema, updateFilterSchema } from './schemas/filters_schema'; import { FilterManager, FormFilter } from '../models/filter'; // TODO - add function for returning a list of just the filter IDs. @@ -79,6 +78,8 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { * @apiName GetFilterById * @apiDescription Retrieves the filter with the specified ID. * + * @apiSchema (params) filterIdSchema + * * @apiSuccess {Boolean} success * @apiSuccess {Object} filter the filter with the specified ID */ @@ -86,7 +87,7 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { { path: '/api/ml/filters/{filterId}', validate: { - params: schema.object({ filterId: schema.string() }), + params: filterIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -108,6 +109,8 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { * @apiName CreateFilter * @apiDescription Instantiates a filter, for use by custom rules in anomaly detection. * + * @apiSchema (body) createFilterSchema + * * @apiSuccess {Boolean} success * @apiSuccess {Object} filter created filter */ @@ -115,7 +118,7 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { { path: '/api/ml/filters', validate: { - body: schema.object(createFilterSchema), + body: createFilterSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -139,6 +142,9 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { * @apiName UpdateFilter * @apiDescription Updates the description of a filter, adds items or removes items. * + * @apiSchema (params) filterIdSchema + * @apiSchema (body) updateFilterSchema + * * @apiSuccess {Boolean} success * @apiSuccess {Object} filter updated filter */ @@ -146,8 +152,8 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { { path: '/api/ml/filters/{filterId}', validate: { - params: schema.object({ filterId: schema.string() }), - body: schema.object(updateFilterSchema), + params: filterIdSchema, + body: updateFilterSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -172,13 +178,13 @@ export function filtersRoutes({ router, mlLicense }: RouteInitialization) { * @apiName DeleteFilter * @apiDescription Deletes the filter with the specified ID. * - * @apiParam {String} filterId the ID of the filter to delete + * @apiSchema (params) filterIdSchema */ router.delete( { path: '/api/ml/filters/{filterId}', validate: { - params: schema.object({ filterId: schema.string() }), + params: filterIdSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/indices.ts b/x-pack/plugins/ml/server/routes/indices.ts index fe66cc8b01396..e434936beba63 100644 --- a/x-pack/plugins/ml/server/routes/indices.ts +++ b/x-pack/plugins/ml/server/routes/indices.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; +import { indicesSchema } from './schemas/indices_schema'; /** * Indices routes. @@ -15,18 +15,17 @@ export function indicesRoutes({ router, mlLicense }: RouteInitialization) { /** * @apiGroup Indices * - * @api {post} /api/ml/indices/field_caps + * @api {post} /api/ml/indices/field_caps Field caps * @apiName FieldCaps * @apiDescription Retrieves the capabilities of fields among multiple indices. + * + * @apiSchema (body) indicesSchema */ router.post( { path: '/api/ml/indices/field_caps', validate: { - body: schema.object({ - index: schema.maybe(schema.string()), - fields: schema.maybe(schema.arrayOf(schema.string())), - }), + body: indicesSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/job_audit_messages.ts b/x-pack/plugins/ml/server/routes/job_audit_messages.ts index 5c6d8023cc172..71499748691f6 100644 --- a/x-pack/plugins/ml/server/routes/job_audit_messages.ts +++ b/x-pack/plugins/ml/server/routes/job_audit_messages.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; import { jobAuditMessagesProvider } from '../models/job_audit_messages'; +import { jobAuditMessagesQuerySchema, jobIdSchema } from './schemas/job_audit_messages_schema'; /** * Routes for job audit message routes @@ -19,13 +19,16 @@ export function jobAuditMessagesRoutes({ router, mlLicense }: RouteInitializatio * @api {get} /api/ml/job_audit_messages/messages/:jobId Get audit messages * @apiName GetJobAuditMessages * @apiDescription Returns audit messages for specified job ID + * + * @apiSchema (params) jobIdSchema + * @apiSchema (query) jobAuditMessagesQuerySchema */ router.get( { path: '/api/ml/job_audit_messages/messages/{jobId}', validate: { - params: schema.object({ jobId: schema.maybe(schema.string()) }), - query: schema.maybe(schema.object({ from: schema.maybe(schema.any()) })), + params: jobIdSchema, + query: jobAuditMessagesQuerySchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -52,13 +55,14 @@ export function jobAuditMessagesRoutes({ router, mlLicense }: RouteInitializatio * @api {get} /api/ml/job_audit_messages/messages Get all audit messages * @apiName GetAllJobAuditMessages * @apiDescription Returns all audit messages + * + * @apiSchema (query) jobAuditMessagesQuerySchema */ router.get( { path: '/api/ml/job_audit_messages/messages', validate: { - params: schema.object({ jobId: schema.maybe(schema.string()) }), - query: schema.maybe(schema.object({ from: schema.maybe(schema.any()) })), + query: jobAuditMessagesQuerySchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/job_service.ts b/x-pack/plugins/ml/server/routes/job_service.ts index 718f9e81603b1..493974cbafe36 100644 --- a/x-pack/plugins/ml/server/routes/job_service.ts +++ b/x-pack/plugins/ml/server/routes/job_service.ts @@ -53,12 +53,14 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/force_start_datafeeds Start datafeeds * @apiName ForceStartDatafeeds * @apiDescription Starts one or more datafeeds + * + * @apiSchema (body) forceStartDatafeedSchema */ router.post( { path: '/api/ml/jobs/force_start_datafeeds', validate: { - body: schema.object(forceStartDatafeedSchema), + body: forceStartDatafeedSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -82,12 +84,14 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/stop_datafeeds Stop datafeeds * @apiName StopDatafeeds * @apiDescription Stops one or more datafeeds + * + * @apiSchema (body) datafeedIdsSchema */ router.post( { path: '/api/ml/jobs/stop_datafeeds', validate: { - body: schema.object(datafeedIdsSchema), + body: datafeedIdsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -111,12 +115,14 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/delete_jobs Delete jobs * @apiName DeleteJobs * @apiDescription Deletes an existing anomaly detection job + * + * @apiSchema (body) jobIdsSchema */ router.post( { path: '/api/ml/jobs/delete_jobs', validate: { - body: schema.object(jobIdsSchema), + body: jobIdsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -140,12 +146,14 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/close_jobs Close jobs * @apiName CloseJobs * @apiDescription Closes one or more anomaly detection jobs + * + * @apiSchema (body) jobIdsSchema */ router.post( { path: '/api/ml/jobs/close_jobs', validate: { - body: schema.object(jobIdsSchema), + body: jobIdsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -169,12 +177,14 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/jobs_summary Jobs summary * @apiName JobsSummary * @apiDescription Creates a summary jobs list. Jobs include job stats, datafeed stats, and calendars. + * + * @apiSchema (body) jobIdsSchema */ router.post( { path: '/api/ml/jobs/jobs_summary', validate: { - body: schema.object(jobIdsSchema), + body: jobIdsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -198,6 +208,8 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/jobs_with_time_range Jobs with time range * @apiName JobsWithTimeRange * @apiDescription Creates a list of jobs with data about the job's time range + * + * @apiSchema (body) jobsWithTimerangeSchema */ router.post( { @@ -226,12 +238,14 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/jobs Create jobs list * @apiName CreateFullJobsList * @apiDescription Creates a list of jobs + * + * @apiSchema (body) jobIdsSchema */ router.post( { path: '/api/ml/jobs/jobs', validate: { - body: schema.object(jobIdsSchema), + body: jobIdsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -281,6 +295,8 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/update_groups Update job groups * @apiName UpdateGroups * @apiDescription Updates 'groups' property of an anomaly detection job + * + * @apiSchema (body) updateGroupsSchema */ router.post( { @@ -336,12 +352,14 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/jobs_exist Check if jobs exist * @apiName JobsExist * @apiDescription Checks if each of the jobs in the specified list of IDs exist + * + * @apiSchema (body) jobIdsSchema */ router.post( { path: '/api/ml/jobs/jobs_exist', validate: { - body: schema.object(jobIdsSchema), + body: jobIdsSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -397,6 +415,8 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/new_job_line_chart Get job line chart data * @apiName NewJobLineChart * @apiDescription Returns line chart data for anomaly detection job + * + * @apiSchema (body) chartSchema */ router.post( { @@ -447,6 +467,8 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/new_job_population_chart Get population job chart data * @apiName NewJobPopulationChart * @apiDescription Returns population job chart data + * + * @apiSchema (body) chartSchema */ router.post( { @@ -523,6 +545,8 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/look_back_progress Get lookback progress * @apiName GetLookBackProgress * @apiDescription Returns current progress of anomaly detection job + * + * @apiSchema (body) lookBackProgressSchema */ router.post( { @@ -552,6 +576,8 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/categorization_field_examples Get categorization field examples * @apiName ValidateCategoryExamples * @apiDescription Validates category examples + * + * @apiSchema (body) categorizationFieldExamplesSchema */ router.post( { @@ -611,6 +637,8 @@ export function jobServiceRoutes({ router, mlLicense }: RouteInitialization) { * @api {post} /api/ml/jobs/top_categories Get top categories * @apiName TopCategories * @apiDescription Returns list of top categories + * + * @apiSchema (body) topCategoriesSchema */ router.post( { diff --git a/x-pack/plugins/ml/server/routes/job_validation.ts b/x-pack/plugins/ml/server/routes/job_validation.ts index 75d9cdf375049..dd2bd9deadf43 100644 --- a/x-pack/plugins/ml/server/routes/job_validation.ts +++ b/x-pack/plugins/ml/server/routes/job_validation.ts @@ -6,7 +6,7 @@ import Boom from 'boom'; import { RequestHandlerContext } from 'kibana/server'; -import { schema, TypeOf } from '@kbn/config-schema'; +import { TypeOf } from '@kbn/config-schema'; import { AnalysisConfig } from '../../common/types/anomaly_detection_jobs'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; @@ -48,6 +48,8 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, * @api {post} /api/ml/validate/estimate_bucket_span Estimate bucket span * @apiName EstimateBucketSpan * @apiDescription Estimates minimum viable bucket span based on the characteristics of a pre-viewed subset of the data + * + * @apiSchema (body) estimateBucketSpanSchema */ router.post( { @@ -94,6 +96,8 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, * @apiName CalculateModelMemoryLimit * @apiDescription Calls _estimate_model_memory endpoint to retrieve model memory estimation. * + * @apiSchema (body) modelMemoryLimitSchema + * * @apiSuccess {String} modelMemoryLimit */ router.post( @@ -122,12 +126,14 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, * @api {post} /api/ml/validate/cardinality Validate cardinality * @apiName ValidateCardinality * @apiDescription Validates cardinality for the given job configuration + * + * @apiSchema (body) validateCardinalitySchema */ router.post( { path: '/api/ml/validate/cardinality', validate: { - body: schema.object(validateCardinalitySchema), + body: validateCardinalitySchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -152,6 +158,8 @@ export function jobValidationRoutes({ router, mlLicense }: RouteInitialization, * @api {post} /api/ml/validate/job Validates job * @apiName ValidateJob * @apiDescription Validates the given job configuration + * + * @apiSchema (body) validateJobSchema */ router.post( { diff --git a/x-pack/plugins/ml/server/routes/modules.ts b/x-pack/plugins/ml/server/routes/modules.ts index 358cd0ac2871c..2d462b6dc207a 100644 --- a/x-pack/plugins/ml/server/routes/modules.ts +++ b/x-pack/plugins/ml/server/routes/modules.ts @@ -152,7 +152,7 @@ export function dataRecognizer({ router, mlLicense }: RouteInitialization) { * @apiName SetupModule * @apiDescription Created module items. * - * @apiParam {String} moduleId Module id + * @apiSchema (body) setupModuleBodySchema */ router.post( { diff --git a/x-pack/plugins/ml/server/routes/results_service.ts b/x-pack/plugins/ml/server/routes/results_service.ts index 9849410eaf0d4..89c267340fe52 100644 --- a/x-pack/plugins/ml/server/routes/results_service.ts +++ b/x-pack/plugins/ml/server/routes/results_service.ts @@ -5,7 +5,6 @@ */ import { RequestHandlerContext } from 'kibana/server'; -import { schema } from '@kbn/config-schema'; import { wrapError } from '../client/error_wrapper'; import { RouteInitialization } from '../types'; import { @@ -80,12 +79,14 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) * @api {post} /api/ml/results/anomalies_table_data Prepare anomalies records for table display * @apiName GetAnomaliesTableData * @apiDescription Retrieves anomaly records for an anomaly detection job and formats them for anomalies table display + * + * @apiSchema (body) anomaliesTableDataSchema */ router.post( { path: '/api/ml/results/anomalies_table_data', validate: { - body: schema.object(anomaliesTableDataSchema), + body: anomaliesTableDataSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -107,12 +108,14 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) * @api {post} /api/ml/results/category_definition Returns category definition * @apiName GetCategoryDefinition * @apiDescription Returns the definition of the category with the specified ID and job ID + * + * @apiSchema (body) categoryDefinitionSchema */ router.post( { path: '/api/ml/results/category_definition', validate: { - body: schema.object(categoryDefinitionSchema), + body: categoryDefinitionSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -134,12 +137,14 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) * @api {post} /api/ml/results/max_anomaly_score Returns the maximum anomaly_score * @apiName GetMaxAnomalyScore * @apiDescription Returns the maximum anomaly score of the bucket results for the request job ID(s) and time range + * + * @apiSchema (body) maxAnomalyScoreSchema */ router.post( { path: '/api/ml/results/max_anomaly_score', validate: { - body: schema.object(maxAnomalyScoreSchema), + body: maxAnomalyScoreSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -161,12 +166,14 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) * @api {post} /api/ml/results/category_examples Returns category examples * @apiName GetCategoryExamples * @apiDescription Returns examples for the categories with the specified IDs from the job with the supplied ID + * + * @apiSchema (body) categoryExamplesSchema */ router.post( { path: '/api/ml/results/category_examples', validate: { - body: schema.object(categoryExamplesSchema), + body: categoryExamplesSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { @@ -188,12 +195,14 @@ export function resultsServiceRoutes({ router, mlLicense }: RouteInitialization) * @api {post} /api/ml/results/partition_fields_values Returns partition fields values * @apiName GetPartitionFieldsValues * @apiDescription Returns the partition fields with values that match the provided criteria for the specified job ID. + * + * @apiSchema (body) partitionFieldValuesSchema */ router.post( { path: '/api/ml/results/partition_fields_values', validate: { - body: schema.object(partitionFieldValuesSchema), + body: partitionFieldValuesSchema, }, }, mlLicense.fullLicenseAPIGuard(async (context, request, response) => { diff --git a/x-pack/plugins/ml/server/routes/schemas/annotations_schema.ts b/x-pack/plugins/ml/server/routes/schemas/annotations_schema.ts index 7d3d6aabb129c..fade2093ac842 100644 --- a/x-pack/plugins/ml/server/routes/schemas/annotations_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/annotations_schema.ts @@ -6,7 +6,7 @@ import { schema } from '@kbn/config-schema'; -export const indexAnnotationSchema = { +export const indexAnnotationSchema = schema.object({ timestamp: schema.number(), end_timestamp: schema.number(), annotation: schema.string(), @@ -16,15 +16,16 @@ export const indexAnnotationSchema = { create_username: schema.maybe(schema.string()), modified_time: schema.maybe(schema.number()), modified_username: schema.maybe(schema.string()), + /** Document id */ _id: schema.maybe(schema.string()), key: schema.maybe(schema.string()), -}; +}); -export const getAnnotationsSchema = { +export const getAnnotationsSchema = schema.object({ jobIds: schema.arrayOf(schema.string()), earliestMs: schema.oneOf([schema.nullable(schema.number()), schema.maybe(schema.number())]), latestMs: schema.oneOf([schema.nullable(schema.number()), schema.maybe(schema.number())]), maxAnnotations: schema.number(), -}; +}); -export const deleteAnnotationSchema = { annotationId: schema.string() }; +export const deleteAnnotationSchema = schema.object({ annotationId: schema.string() }); diff --git a/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts b/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts index 22c3d94dfb29e..ab1305d9bc354 100644 --- a/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/anomaly_detectors_schema.ts @@ -26,6 +26,7 @@ const detectorSchema = schema.object({ over_field_name: schema.maybe(schema.string()), partition_field_name: schema.maybe(schema.string()), detector_description: schema.maybe(schema.string()), + /** Custom rules */ custom_rules: customRulesSchema, }); @@ -37,20 +38,24 @@ const customUrlSchema = { const customSettingsSchema = schema.object( { + /** Indicates the creator entity */ created_by: schema.maybe(schema.string()), - custom_urls: schema.maybe(schema.arrayOf(schema.maybe(schema.object({ ...customUrlSchema })))), + custom_urls: schema.maybe(schema.arrayOf(schema.maybe(schema.object(customUrlSchema)))), }, { unknowns: 'allow' } // Create / Update job API allows other fields to be added to custom_settings. ); -export const anomalyDetectionUpdateJobSchema = { +export const anomalyDetectionUpdateJobSchema = schema.object({ description: schema.maybe(schema.string()), detectors: schema.maybe( schema.arrayOf( schema.maybe( schema.object({ + /** Detector index */ detector_index: schema.number(), + /** Description */ description: schema.maybe(schema.string()), + /** Custom rules */ custom_rules: customRulesSchema, }) ) @@ -64,7 +69,7 @@ export const anomalyDetectionUpdateJobSchema = { }) ), groups: schema.maybe(schema.arrayOf(schema.maybe(schema.string()))), -}; +}); export const analysisConfigSchema = schema.object({ bucket_span: schema.maybe(schema.string()), @@ -78,6 +83,7 @@ export const anomalyDetectionJobSchema = { analysis_config: analysisConfigSchema, analysis_limits: schema.maybe( schema.object({ + /** Limit of categorization examples */ categorization_examples_limit: schema.maybe(schema.number()), model_memory_limit: schema.maybe(schema.string()), }) @@ -88,6 +94,7 @@ export const anomalyDetectionJobSchema = { allow_lazy_open: schema.maybe(schema.any()), data_counts: schema.maybe(schema.any()), data_description: schema.object({ + /** Format */ format: schema.maybe(schema.string()), time_field: schema.string(), time_format: schema.maybe(schema.string()), @@ -110,3 +117,63 @@ export const anomalyDetectionJobSchema = { results_retention_days: schema.maybe(schema.number()), state: schema.maybe(schema.string()), }; + +export const jobIdSchema = schema.object({ + /** Job id */ + jobId: schema.string(), +}); + +export const getRecordsSchema = schema.object({ + desc: schema.maybe(schema.boolean()), + end: schema.maybe(schema.string()), + exclude_interim: schema.maybe(schema.boolean()), + page: schema.maybe( + schema.object({ + from: schema.maybe(schema.number()), + size: schema.maybe(schema.number()), + }) + ), + record_score: schema.maybe(schema.number()), + sort: schema.maybe(schema.string()), + start: schema.maybe(schema.string()), +}); + +export const getBucketsSchema = schema.object({ + anomaly_score: schema.maybe(schema.number()), + desc: schema.maybe(schema.boolean()), + end: schema.maybe(schema.string()), + exclude_interim: schema.maybe(schema.boolean()), + expand: schema.maybe(schema.boolean()), + /** Page definition */ + page: schema.maybe( + schema.object({ + /** Page offset */ + from: schema.maybe(schema.number()), + /** Size of the page */ + size: schema.maybe(schema.number()), + }) + ), + sort: schema.maybe(schema.string()), + start: schema.maybe(schema.string()), +}); + +export const getBucketParamsSchema = schema.object({ + jobId: schema.string(), + timestamp: schema.maybe(schema.string()), +}); + +export const getOverallBucketsSchema = schema.object({ + topN: schema.number(), + bucketSpan: schema.string(), + start: schema.number(), + end: schema.number(), +}); + +export const getCategoriesSchema = schema.object({ + /** Category id */ + categoryId: schema.string(), + /** Job id */ + jobId: schema.string(), +}); + +export const forecastAnomalyDetector = schema.object({ duration: schema.any() }); diff --git a/x-pack/plugins/ml/server/routes/schemas/calendars_schema.ts b/x-pack/plugins/ml/server/routes/schemas/calendars_schema.ts index f5e59d983a9aa..6d8f94311816d 100644 --- a/x-pack/plugins/ml/server/routes/schemas/calendars_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/calendars_schema.ts @@ -6,7 +6,7 @@ import { schema } from '@kbn/config-schema'; -export const calendarSchema = { +export const calendarSchema = schema.object({ calendar_id: schema.maybe(schema.string()), calendarId: schema.string(), job_ids: schema.arrayOf(schema.maybe(schema.string())), @@ -22,4 +22,11 @@ export const calendarSchema = { }) ) ), -}; +}); + +export const calendarIdSchema = schema.object({ calendarId: schema.string() }); + +export const calendarIdsSchema = schema.object({ + /** Comma-separated list of calendar IDs */ + calendarIds: schema.string(), +}); diff --git a/x-pack/plugins/ml/server/routes/schemas/data_analytics_schema.ts b/x-pack/plugins/ml/server/routes/schemas/data_analytics_schema.ts index 21454fa884b82..f1d4947a7abc5 100644 --- a/x-pack/plugins/ml/server/routes/schemas/data_analytics_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/data_analytics_schema.ts @@ -6,7 +6,7 @@ import { schema } from '@kbn/config-schema'; -export const dataAnalyticsJobConfigSchema = { +export const dataAnalyticsJobConfigSchema = schema.object({ description: schema.maybe(schema.string()), dest: schema.object({ index: schema.string(), @@ -17,7 +17,9 @@ export const dataAnalyticsJobConfigSchema = { query: schema.maybe(schema.any()), _source: schema.maybe( schema.object({ + /** Fields to include in results */ includes: schema.maybe(schema.arrayOf(schema.maybe(schema.string()))), + /** Fields to exclude from results */ excludes: schema.maybe(schema.arrayOf(schema.maybe(schema.string()))), }) ), @@ -26,9 +28,9 @@ export const dataAnalyticsJobConfigSchema = { analysis: schema.any(), analyzed_fields: schema.any(), model_memory_limit: schema.string(), -}; +}); -export const dataAnalyticsEvaluateSchema = { +export const dataAnalyticsEvaluateSchema = schema.object({ index: schema.string(), query: schema.maybe(schema.any()), evaluation: schema.maybe( @@ -37,15 +39,27 @@ export const dataAnalyticsEvaluateSchema = { classification: schema.maybe(schema.any()), }) ), -}; +}); -export const dataAnalyticsExplainSchema = { +export const dataAnalyticsExplainSchema = schema.object({ description: schema.maybe(schema.string()), dest: schema.maybe(schema.any()), + /** Source */ source: schema.object({ index: schema.string(), }), analysis: schema.any(), analyzed_fields: schema.maybe(schema.any()), model_memory_limit: schema.maybe(schema.string()), -}; +}); + +export const analyticsIdSchema = schema.object({ + /** + * Analytics ID + */ + analyticsId: schema.string(), +}); + +export const stopsDataFrameAnalyticsJobQuerySchema = schema.object({ + force: schema.maybe(schema.boolean()), +}); diff --git a/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts b/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts index 0c10b2d5b4f16..1a1d02f991b55 100644 --- a/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts @@ -6,33 +6,27 @@ import { schema } from '@kbn/config-schema'; -export const dataVisualizerFieldStatsSchema = { - params: schema.object({ - indexPatternTitle: schema.string(), - }), - body: schema.object({ - query: schema.any(), - fields: schema.arrayOf(schema.any()), - samplerShardSize: schema.number(), - timeFieldName: schema.maybe(schema.string()), - earliest: schema.maybe(schema.number()), - latest: schema.maybe(schema.number()), - interval: schema.maybe(schema.string()), - maxExamples: schema.number(), - }), -}; +export const indexPatternTitleSchema = schema.object({ + indexPatternTitle: schema.string(), +}); -export const dataVisualizerOverallStatsSchema = { - params: schema.object({ - indexPatternTitle: schema.string(), - }), - body: schema.object({ - query: schema.any(), - aggregatableFields: schema.arrayOf(schema.string()), - nonAggregatableFields: schema.arrayOf(schema.string()), - samplerShardSize: schema.number(), - timeFieldName: schema.maybe(schema.string()), - earliest: schema.maybe(schema.number()), - latest: schema.maybe(schema.number()), - }), -}; +export const dataVisualizerFieldStatsSchema = schema.object({ + query: schema.any(), + fields: schema.arrayOf(schema.any()), + samplerShardSize: schema.number(), + timeFieldName: schema.maybe(schema.string()), + earliest: schema.maybe(schema.number()), + latest: schema.maybe(schema.number()), + interval: schema.maybe(schema.string()), + maxExamples: schema.number(), +}); + +export const dataVisualizerOverallStatsSchema = schema.object({ + query: schema.any(), + aggregatableFields: schema.arrayOf(schema.string()), + nonAggregatableFields: schema.arrayOf(schema.string()), + samplerShardSize: schema.number(), + timeFieldName: schema.maybe(schema.string()), + earliest: schema.maybe(schema.number()), + latest: schema.maybe(schema.number()), +}); diff --git a/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts b/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts index 466e70197e3d1..2cfb9d7d275d5 100644 --- a/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts @@ -42,3 +42,9 @@ export const datafeedConfigSchema = schema.object({ }) ), }); + +export const datafeedIdSchema = schema.object({ datafeedId: schema.string() }); + +export const deleteDatafeedQuerySchema = schema.maybe( + schema.object({ force: schema.maybe(schema.any()) }) +); diff --git a/x-pack/plugins/ml/server/routes/schemas/file_data_visualizer_schema.ts b/x-pack/plugins/ml/server/routes/schemas/file_data_visualizer_schema.ts new file mode 100644 index 0000000000000..9a80cf795cabf --- /dev/null +++ b/x-pack/plugins/ml/server/routes/schemas/file_data_visualizer_schema.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +export const analyzeFileQuerySchema = schema.maybe( + schema.object({ + charset: schema.maybe(schema.string()), + column_names: schema.maybe(schema.string()), + delimiter: schema.maybe(schema.string()), + explain: schema.maybe(schema.string()), + format: schema.maybe(schema.string()), + grok_pattern: schema.maybe(schema.string()), + has_header_row: schema.maybe(schema.string()), + line_merge_size_limit: schema.maybe(schema.string()), + lines_to_sample: schema.maybe(schema.string()), + quote: schema.maybe(schema.string()), + should_trim_fields: schema.maybe(schema.string()), + timeout: schema.maybe(schema.string()), + timestamp_field: schema.maybe(schema.string()), + timestamp_format: schema.maybe(schema.string()), + }) +); + +export const importFileQuerySchema = schema.object({ + id: schema.maybe(schema.string()), +}); + +export const importFileBodySchema = schema.object({ + index: schema.maybe(schema.string()), + data: schema.arrayOf(schema.any()), + settings: schema.maybe(schema.any()), + /** Mappings */ + mappings: schema.any(), + /** Ingest pipeline definition */ + ingestPipeline: schema.object({ + id: schema.maybe(schema.string()), + pipeline: schema.maybe(schema.any()), + }), +}); diff --git a/x-pack/plugins/ml/server/routes/schemas/filters_schema.ts b/x-pack/plugins/ml/server/routes/schemas/filters_schema.ts index dffee56565c73..d33d34c7096ce 100644 --- a/x-pack/plugins/ml/server/routes/schemas/filters_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/filters_schema.ts @@ -6,14 +6,21 @@ import { schema } from '@kbn/config-schema'; -export const createFilterSchema = { +export const createFilterSchema = schema.object({ filterId: schema.string(), description: schema.maybe(schema.string()), items: schema.arrayOf(schema.string()), -}; +}); -export const updateFilterSchema = { +export const updateFilterSchema = schema.object({ description: schema.maybe(schema.string()), addItems: schema.maybe(schema.arrayOf(schema.string())), removeItems: schema.maybe(schema.arrayOf(schema.string())), -}; +}); + +export const filterIdSchema = schema.object({ + /** + * ID of the filter + */ + filterId: schema.string(), +}); diff --git a/x-pack/plugins/ml/server/routes/schemas/indices_schema.ts b/x-pack/plugins/ml/server/routes/schemas/indices_schema.ts new file mode 100644 index 0000000000000..f1b06392292f0 --- /dev/null +++ b/x-pack/plugins/ml/server/routes/schemas/indices_schema.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { schema } from '@kbn/config-schema'; + +export const indicesSchema = schema.object({ + index: schema.maybe(schema.string()), + fields: schema.maybe(schema.arrayOf(schema.string())), +}); diff --git a/x-pack/plugins/ml/server/routes/schemas/job_audit_messages_schema.ts b/x-pack/plugins/ml/server/routes/schemas/job_audit_messages_schema.ts new file mode 100644 index 0000000000000..b94a004384eb1 --- /dev/null +++ b/x-pack/plugins/ml/server/routes/schemas/job_audit_messages_schema.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +export const jobIdSchema = schema.object({ jobId: schema.maybe(schema.string()) }); + +export const jobAuditMessagesQuerySchema = schema.maybe( + schema.object({ from: schema.maybe(schema.any()) }) +); diff --git a/x-pack/plugins/ml/server/routes/schemas/job_service_schema.ts b/x-pack/plugins/ml/server/routes/schemas/job_service_schema.ts index deb62678a777c..d2036b8a7c0fa 100644 --- a/x-pack/plugins/ml/server/routes/schemas/job_service_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/job_service_schema.ts @@ -29,21 +29,25 @@ export const chartSchema = { splitFieldValue: schema.maybe(schema.nullable(schema.string())), }; -export const datafeedIdsSchema = { datafeedIds: schema.arrayOf(schema.maybe(schema.string())) }; +export const datafeedIdsSchema = schema.object({ + datafeedIds: schema.arrayOf(schema.maybe(schema.string())), +}); -export const forceStartDatafeedSchema = { +export const forceStartDatafeedSchema = schema.object({ datafeedIds: schema.arrayOf(schema.maybe(schema.string())), start: schema.maybe(schema.number()), end: schema.maybe(schema.number()), -}; +}); -export const jobIdsSchema = { +export const jobIdsSchema = schema.object({ jobIds: schema.maybe( schema.oneOf([schema.string(), schema.arrayOf(schema.maybe(schema.string()))]) ), -}; +}); -export const jobsWithTimerangeSchema = { dateFormatTz: schema.maybe(schema.string()) }; +export const jobsWithTimerangeSchema = { + dateFormatTz: schema.maybe(schema.string()), +}; export const lookBackProgressSchema = { jobId: schema.string(), diff --git a/x-pack/plugins/ml/server/routes/schemas/job_validation_schema.ts b/x-pack/plugins/ml/server/routes/schemas/job_validation_schema.ts index 3ded6e770eed5..f12c85962a28d 100644 --- a/x-pack/plugins/ml/server/routes/schemas/job_validation_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/job_validation_schema.ts @@ -37,7 +37,7 @@ export const validateJobSchema = schema.object({ job: schema.object(anomalyDetectionJobSchema), }); -export const validateCardinalitySchema = { +export const validateCardinalitySchema = schema.object({ ...anomalyDetectionJobSchema, datafeed_config: datafeedConfigSchema, -}; +}); diff --git a/x-pack/plugins/ml/server/routes/schemas/results_service_schema.ts b/x-pack/plugins/ml/server/routes/schemas/results_service_schema.ts index 32d829db7f81b..f7317e534b33b 100644 --- a/x-pack/plugins/ml/server/routes/schemas/results_service_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/results_service_schema.ts @@ -12,7 +12,7 @@ const criteriaFieldSchema = schema.object({ fieldValue: schema.any(), }); -export const anomaliesTableDataSchema = { +export const anomaliesTableDataSchema = schema.object({ jobIds: schema.arrayOf(schema.string()), criteriaFields: schema.arrayOf(criteriaFieldSchema), influencers: schema.arrayOf( @@ -26,29 +26,29 @@ export const anomaliesTableDataSchema = { maxRecords: schema.number(), maxExamples: schema.maybe(schema.number()), influencersFilterQuery: schema.maybe(schema.any()), -}; +}); -export const categoryDefinitionSchema = { +export const categoryDefinitionSchema = schema.object({ jobId: schema.maybe(schema.string()), categoryId: schema.string(), -}; +}); -export const maxAnomalyScoreSchema = { +export const maxAnomalyScoreSchema = schema.object({ jobIds: schema.arrayOf(schema.string()), earliestMs: schema.maybe(schema.number()), latestMs: schema.maybe(schema.number()), -}; +}); -export const categoryExamplesSchema = { +export const categoryExamplesSchema = schema.object({ jobId: schema.string(), categoryIds: schema.arrayOf(schema.string()), maxExamples: schema.number(), -}; +}); -export const partitionFieldValuesSchema = { +export const partitionFieldValuesSchema = schema.object({ jobId: schema.string(), searchTerm: schema.maybe(schema.any()), criteriaFields: schema.arrayOf(criteriaFieldSchema), earliestMs: schema.number(), latestMs: schema.number(), -}; +}); diff --git a/yarn.lock b/yarn.lock index fdfdcada62e2c..19d28aea1acfd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2557,6 +2557,11 @@ resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q== +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" @@ -3461,6 +3466,13 @@ "@svgr/plugin-svgo" "^4.2.0" loader-utils "^1.2.3" +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + "@testim/chrome-version@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@testim/chrome-version/-/chrome-version-1.0.7.tgz#0cd915785ec4190f08a3a6acc9b61fc38fb5f1a9" @@ -5926,6 +5938,40 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +apidoc-core@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/apidoc-core/-/apidoc-core-0.11.1.tgz#b04a7e0292e4ac0d714b40789f1b92f414486c81" + integrity sha512-pt/ICBdFQCZTgL38Aw1XB3G9AajDU1JA5E3yoDEgg0mqbPTCkOL8AyWdysjvNtQS/kkXgSPazCZaZzZYqrPHog== + dependencies: + fs-extra "^8.1.0" + glob "^7.1.4" + iconv-lite "^0.5.0" + klaw-sync "^6.0.0" + lodash "~4.17.15" + semver "~6.3.0" + +apidoc-markdown@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/apidoc-markdown/-/apidoc-markdown-5.0.0.tgz#e2d59d7cbbaa10402b09cec3e8ec17a03a27be59" + integrity sha512-gp4I4MvtgJvZPikEd7lwn149jjnC454CanPhm5demROdHCuakY+3YtIKEgVrJOqnS2iwbeeF+u4riB9CoO11+A== + dependencies: + ejs "^3.0.1" + semver "^7.1.3" + yargs "^15.1.0" + +apidoc@^0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/apidoc/-/apidoc-0.20.1.tgz#b29a2e2ae47e2df6a29e1f1527b94edf91853072" + integrity sha512-V54vkZ2lDFBiGn0qusZmHbMi4svuFBq0rjZAIe3nwYvBY7iztW78vKOyHyTr9ASaTB7EGe8hhLbpEnYAIO31TQ== + dependencies: + apidoc-core "^0.11.1" + commander "^2.20.0" + fs-extra "^8.1.0" + lodash "^4.17.15" + markdown-it "^10.0.0" + nodemon "^2.0.2" + winston "^3.2.1" + apollo-cache-control@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.1.1.tgz#173d14ceb3eb9e7cb53de7eb8b61bee6159d4171" @@ -7660,6 +7706,20 @@ boxen@^3.0.0: type-fest "^0.3.0" widest-line "^2.0.0" +boxen@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" + integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^3.0.0" + cli-boxes "^2.2.0" + string-width "^4.1.0" + term-size "^2.1.0" + type-fest "^0.8.1" + widest-line "^3.1.0" + brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -8129,6 +8189,19 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + cachedir@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" @@ -8635,6 +8708,21 @@ chokidar@^2.0.0, chokidar@^2.1.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.2.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -8957,7 +9045,7 @@ clone-regexp@^1.0.0: is-regexp "^1.0.0" is-supported-regexp-flag "^1.0.0" -clone-response@1.0.2: +clone-response@1.0.2, clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -9423,6 +9511,18 @@ configstore@^3.1.2: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -10021,6 +10121,11 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + cson-parser@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/cson-parser/-/cson-parser-1.3.5.tgz#7ec675e039145533bf2a6a856073f1599d9c2d24" @@ -10858,6 +10963,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -11406,6 +11516,13 @@ dot-prop@^4.1.0, dot-prop@^4.1.1: dependencies: is-obj "^1.0.0" +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + dotenv-defaults@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.0.2.tgz#441cf5f067653fca4bbdce9dd3b803f6f84c585d" @@ -11603,6 +11720,11 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== +ejs@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.2.tgz#745b01cdcfe38c1c6a2da3bbb2d9957060a31226" + integrity sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA== + elastic-apm-http-client@^9.2.0: version "9.2.1" resolved "https://registry.yarnpkg.com/elastic-apm-http-client/-/elastic-apm-http-client-9.2.1.tgz#e0e980ceb9975ff770bdbf2f5cdaac39fd70e8e6" @@ -12137,6 +12259,11 @@ es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: es6-iterator "^2.0.1" es6-symbol "^3.1.1" +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -13965,7 +14092,7 @@ fs-exists-sync@^0.1.0: resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= -fs-extra@8.1.0, fs-extra@^8.0.1: +fs-extra@8.1.0, fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -14062,7 +14189,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.1.0, fsevents@~2.1.1: +fsevents@~2.1.0, fsevents@~2.1.1, fsevents@~2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== @@ -14294,7 +14421,7 @@ get-stream@^2.2.0: object-assign "^4.0.1" pinkie-promise "^2.0.0" -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -14548,6 +14675,13 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global-dirs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" + integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== + dependencies: + ini "^1.3.5" + global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -14868,6 +15002,23 @@ got@^8.3.1, got@^8.3.2: url-parse-lax "^3.0.0" url-to-options "^1.0.1" +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.4: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -15572,6 +15723,11 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + has@^1.0.1, has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -15898,6 +16054,11 @@ http-cache-semantics@3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -16162,6 +16323,11 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + ignore@^3.1.2, ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -16977,6 +17143,14 @@ is-installed-globally@0.1.0, is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-installed-globally@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" + integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== + dependencies: + global-dirs "^2.0.1" + is-path-inside "^3.0.1" + is-integer@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" @@ -17047,6 +17221,11 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-npm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" + integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + is-number-object@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" @@ -17079,6 +17258,11 @@ is-obj@^1.0.0, is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-object@^1.0.1, is-object@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" @@ -17343,6 +17527,11 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + is2@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.1.tgz#8ac355644840921ce435d94f05d3a94634d3481a" @@ -18636,6 +18825,13 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -18672,6 +18868,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -18732,6 +18935,13 @@ latest-version@^3.0.0, latest-version@^3.1.0: dependencies: package-json "^4.0.0" +latest-version@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + lazy-ass@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" @@ -19599,11 +19809,16 @@ lowercase-keys@1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lowlight@~1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.9.1.tgz#ed7c3dffc36f8c1f263735c0fe0c907847c11250" @@ -20247,7 +20462,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: +mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -21224,6 +21439,22 @@ nodemailer@^4.7.0: resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.7.0.tgz#4420e06abfffd77d0618f184ea49047db84f4ad8" integrity sha512-IludxDypFpYw4xpzKdMAozBSkzKHmNBvGanUREjJItgJ2NYcK/s8+PggVhj7c2yGFQykKsnnmv1+Aqo0ZfjHmw== +nodemon@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.3.tgz#e9c64df8740ceaef1cb00e1f3da57c0a93ef3714" + integrity sha512-lLQLPS90Lqwc99IHe0U94rDgvjo+G9I4uEIxRG3evSLROcqQ9hwc0AxlSHKS4T1JW/IMj/7N5mthiN58NL/5kw== + dependencies: + chokidar "^3.2.2" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^4.0.0" + "nomnom@>= 1.5.x": version "1.8.1" resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" @@ -21246,6 +21477,13 @@ nopt@^2.2.0: dependencies: abbrev "1" +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -21307,6 +21545,11 @@ normalize-url@^3.3.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + now-and-later@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" @@ -21993,6 +22236,11 @@ p-cancelable@^0.4.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -22175,6 +22423,16 @@ package-json@^5.0.0: registry-url "^3.1.0" semver "^5.5.0" +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + pad-component@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pad-component/-/pad-component-0.0.1.tgz#ad1f22ce1bf0fdc0d6ddd908af17f351a404b8ac" @@ -22678,6 +22936,11 @@ picomatch@^2.0.4, picomatch@^2.0.5: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.0.7: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -23322,6 +23585,11 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== +pstree.remy@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" + integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + public-encrypt@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" @@ -23509,6 +23777,13 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +pupa@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" + integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== + dependencies: + escape-goat "^2.0.0" + puppeteer-core@^1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-1.19.0.tgz#3c3f98edb5862583e3a9c19cbc0da57ccc63ba5c" @@ -23766,7 +24041,7 @@ raw-loader@~0.5.1: resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -24850,6 +25125,13 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + readline2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" @@ -25187,6 +25469,13 @@ registry-auth-token@^3.0.1, registry-auth-token@^3.3.2: rc "^1.1.6" safe-buffer "^5.0.1" +registry-auth-token@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" + integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + dependencies: + rc "^1.2.8" + registry-url@^3.0.0, registry-url@^3.0.3, registry-url@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" @@ -25194,6 +25483,13 @@ registry-url@^3.0.0, registry-url@^3.0.3, registry-url@^3.1.0: dependencies: rc "^1.0.1" +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + regjsgen@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" @@ -25793,7 +26089,7 @@ resolve@~1.10.1: dependencies: path-parse "^1.0.6" -responselike@1.0.2: +responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= @@ -26382,6 +26678,13 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + semver-greatest-satisfied-range@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" @@ -26431,7 +26734,7 @@ semver@^5.5.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@~6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -26441,6 +26744,11 @@ semver@^6.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== +semver@^7.1.3: + version "7.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.0.tgz#91f7c70ec944a63e5dc7a74cde2da375d8e0853c" + integrity sha512-uyvgU/igkrMgNHwLgXvlpD9jEADbJhB0+JXSywoO47JgJ6c16iau9F9cjtc/E5o0PoqRYTiTIAPRKaYe84z6eQ== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -27594,7 +27902,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== @@ -28372,6 +28680,11 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +term-size@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" + integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== + terser-webpack-plugin@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" @@ -28766,6 +29079,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -28850,6 +29168,13 @@ topojson-client@3.0.0, topojson-client@^3.0.0: dependencies: commander "2" +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + tough-cookie@>=2.3.3, tough-cookie@^2.0.0, tough-cookie@^2.3.3, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -29728,6 +30053,13 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +undefsafe@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" + integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== + dependencies: + debug "^2.2.0" + underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" @@ -29915,6 +30247,13 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + unist-util-is@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b" @@ -30084,6 +30423,25 @@ update-notifier@^2.5.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +update-notifier@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" + integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== + dependencies: + boxen "^4.2.0" + chalk "^3.0.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.3.1" + is-npm "^4.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.0.0" + pupa "^2.0.1" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + upper-case-first@^1.1.0, upper-case-first@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" @@ -31385,6 +31743,13 @@ widest-line@^2.0.1: dependencies: string-width "^2.1.1" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + win-release@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" @@ -31682,6 +32047,11 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + xhr@^2.0.1: version "2.4.1" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.1.tgz#ba982cced205ae5eec387169ac9dc77ca4853d38" @@ -32003,7 +32373,7 @@ yargs@^13.2.2, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.1" -yargs@^15.0.2, yargs@^15.3.1: +yargs@^15.0.2, yargs@^15.1.0, yargs@^15.3.1: version "15.3.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== From b6708514228e30ada75071df87425f8ef6eebe2d Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Wed, 15 Apr 2020 12:48:16 -0400 Subject: [PATCH 33/80] Add uptime CODEOWNER entries. (#63616) --- .github/CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 05972edacfe88..4a061d7415990 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -80,6 +80,8 @@ /x-pack/legacy/plugins/ingest_manager/ @elastic/ingest-management /x-pack/plugins/observability/ @elastic/logs-metrics-ui @elastic/apm-ui @elastic/uptime @elastic/ingest-management /x-pack/legacy/plugins/monitoring/ @elastic/stack-monitoring-ui +/x-pack/legacy/plugins/uptime @elastic/uptime +/x-pack/plugins/uptime @elastic/uptime # Machine Learning /x-pack/legacy/plugins/ml/ @elastic/ml-ui From c57297c95b7f6766092f772c0e8fffd569035ce4 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 15 Apr 2020 19:55:43 +0200 Subject: [PATCH 34/80] Bugfix clear saved query crashes kibana on Discover in some cases (#63554) * actual hotfix * clean up redundant code * add functional test --- .../discover/np_ready/angular/discover.js | 6 +----- .../query_string_input/language_switcher.tsx | 1 + .../ui/search_bar/create_search_bar.tsx | 5 +++-- .../ui/search_bar/lib/use_saved_query.ts | 4 ++-- .../apps/discover/_saved_queries.js | 19 ++++++++++++++++++ test/functional/services/query_bar.ts | 20 +++++++++++++++++++ 6 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js index d770e8334b3af..72276a38f6ac2 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js @@ -828,13 +828,9 @@ function discoverController( if (newSavedQueryId) { setAppState({ savedQuery: newSavedQueryId }); } else { - //reset filters and query string, remove savedQuery from state + // remove savedQueryId from state const state = { ...appStateContainer.getState(), - query: getDefaultQuery( - localStorage.get('kibana.userQueryLanguage') || config.get('search:queryLanguage') - ), - filters: [], }; delete state.savedQuery; appStateContainer.set(state); diff --git a/src/plugins/data/public/ui/query_string_input/language_switcher.tsx b/src/plugins/data/public/ui/query_string_input/language_switcher.tsx index 63f6997ce2fc3..ded48d462722d 100644 --- a/src/plugins/data/public/ui/query_string_input/language_switcher.tsx +++ b/src/plugins/data/public/ui/query_string_input/language_switcher.tsx @@ -61,6 +61,7 @@ export function QueryLanguageSwitcher(props: Props) { size="xs" onClick={() => setIsPopoverOpen(!isPopoverOpen)} className="euiFormControlLayout__append" + data-test-subj={'switchQueryLanguageButton'} > {props.language === 'lucene' ? luceneLabel : kqlLabel} diff --git a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx index 5ca334d6bdcfe..7723254f3aa51 100644 --- a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx @@ -124,7 +124,8 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) const onQuerySubmitRef = useRef(props.onQuerySubmit); const defaultQuery = { query: '', - language: core.uiSettings.get('search:queryLanguage'), + language: + storage.get('kibana.userQueryLanguage') || core.uiSettings.get('search:queryLanguage'), }; const [query, setQuery] = useState(props.query || defaultQuery); @@ -161,7 +162,7 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) setQuery, savedQueryId: props.savedQueryId, notifications: core.notifications, - uiSettings: core.uiSettings, + defaultLanguage: defaultQuery.language, }); // Fire onQuerySubmit on query or timerange change diff --git a/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts index 817e890b7b42b..79aee3438d7aa 100644 --- a/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts +++ b/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts @@ -29,8 +29,8 @@ interface UseSavedQueriesProps { queryService: DataPublicPluginStart['query']; setQuery: Function; notifications: CoreStart['notifications']; - uiSettings: CoreStart['uiSettings']; savedQueryId?: string; + defaultLanguage: string; } interface UseSavedQueriesReturn { @@ -41,7 +41,7 @@ interface UseSavedQueriesReturn { export const useSavedQuery = (props: UseSavedQueriesProps): UseSavedQueriesReturn => { // Handle saved queries - const defaultLanguage = props.uiSettings.get('search:queryLanguage'); + const defaultLanguage = props.defaultLanguage; const [savedQuery, setSavedQuery] = useState(); // Effect is used to convert a saved query id into an object diff --git a/test/functional/apps/discover/_saved_queries.js b/test/functional/apps/discover/_saved_queries.js index 3cdaccf32cdc3..76f3a3aea365f 100644 --- a/test/functional/apps/discover/_saved_queries.js +++ b/test/functional/apps/discover/_saved_queries.js @@ -147,6 +147,25 @@ export default function({ getService, getPageObjects }) { await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); expect(await queryBar.getQueryString()).to.eql(''); }); + + // https://github.com/elastic/kibana/issues/63505 + it('allows clearing if non default language was remembered in localstorage', async () => { + await queryBar.switchQueryLanguage('lucene'); + await PageObjects.common.navigateToApp('discover'); // makes sure discovered is reloaded without any state in url + await queryBar.expectQueryLanguageOrFail('lucene'); // make sure lucene is remembered after refresh (comes from localstorage) + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await queryBar.expectQueryLanguageOrFail('kql'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + await queryBar.expectQueryLanguageOrFail('lucene'); + }); + + // fails: bug in discover https://github.com/elastic/kibana/issues/63561 + // unskip this test when bug is fixed + it.skip('changing language removes saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await queryBar.switchQueryLanguage('lucene'); + expect(await queryBar.getQueryString()).to.eql(''); + }); }); }); } diff --git a/test/functional/services/query_bar.ts b/test/functional/services/query_bar.ts index ace8b97155c09..7c7fd2d81f170 100644 --- a/test/functional/services/query_bar.ts +++ b/test/functional/services/query_bar.ts @@ -17,6 +17,7 @@ * under the License. */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../ftr_provider_context'; export function QueryBarProvider({ getService, getPageObjects }: FtrProviderContext) { @@ -25,6 +26,7 @@ export function QueryBarProvider({ getService, getPageObjects }: FtrProviderCont const log = getService('log'); const PageObjects = getPageObjects(['header', 'common']); const find = getService('find'); + const browser = getService('browser'); class QueryBar { async getQueryString(): Promise { @@ -62,6 +64,24 @@ export function QueryBarProvider({ getService, getPageObjects }: FtrProviderCont public async clickQuerySubmitButton(): Promise { await testSubjects.click('querySubmitButton'); } + + public async switchQueryLanguage(lang: 'kql' | 'lucene'): Promise { + await testSubjects.click('switchQueryLanguageButton'); + const kqlToggle = await testSubjects.find('languageToggle'); + const currentLang = + (await kqlToggle.getAttribute('aria-checked')) === 'true' ? 'kql' : 'lucene'; + if (lang !== currentLang) { + await kqlToggle.click(); + } + + await browser.pressKeys(browser.keys.ESCAPE); // close popover + await this.expectQueryLanguageOrFail(lang); // make sure lang is switched + } + + public async expectQueryLanguageOrFail(lang: 'kql' | 'lucene'): Promise { + const queryLanguageButton = await testSubjects.find('switchQueryLanguageButton'); + expect((await queryLanguageButton.getVisibleText()).toLowerCase()).to.eql(lang); + } } return new QueryBar(); From 716211f2db5be3e545889f18b0f596f443ead7f6 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Wed, 15 Apr 2020 14:12:14 -0400 Subject: [PATCH 35/80] Update README.md (#63622) --- src/plugins/embeddable/README.md | 36 ++++++++++---------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/src/plugins/embeddable/README.md b/src/plugins/embeddable/README.md index 1fe91f426f43f..343a1cc32cd10 100644 --- a/src/plugins/embeddable/README.md +++ b/src/plugins/embeddable/README.md @@ -1,39 +1,25 @@ -# The Embeddable API V2 +# Embeddables -The Embeddable API's main goal is to have documented and standardized ways to share and exchange information and functionality across applications and plugins. +Embeddables are re-usable widgets that can be rendered in any environment or plugin. Developers can embed them directly in their plugin. End users can dynamically add them to any embeddable _containers_. -There are three main pieces of this infrastructure: - - Embeddables & Containers - - Actions - - Triggers +## Embeddable containers -## Embeddables & Containers +Containers are a special type of embeddable that can contain nested embeddables. Embeddables can be dynamically added to embeddable _containers_. Currently only dashboard uses this interface. -Embeddables are isolated, serializable, renderable widgets. A developer can hard code an embeddable inside their -application, or they can use some built in actions to allow users to dynamically add them to *containers*. - -Containers are a special type of embeddable that can contain nested embeddables. - -## Actions - -Actions are pluggable pieces of functionality exposed to the user that take an embeddable as context, plus an optional action context. - -## Triggers - -Triggers are the way actions are connected to a user action. We ship with two default triggers, `CONTEXT_MENU_TRIGGER` and `APPLY_FILTER`. - -Actions attached to the `CONTEXT_MENU_TRIGGER` will be displayed in supported embeddables context menu to the user. Actions attached to the `APPLY_FILTER` trigger will show up when any embeddable emits this trigger. +## Examples -A developer can register new triggers that their embeddables, or external components, can emit (as long as they have an embeddable to pass along as context). +Many example embeddables are implemented and registered [here](https://github.com/elastic/kibana/tree/master/examples/embeddable_examples). They can be played around with and explored [in the Embeddable Explorer example plugin](https://github.com/elastic/kibana/tree/master/examples/embeddable_explorer). Just run kibana with -## Examples +``` +yarn start --run-examples +``` -Many examples can be viewed in the functionally tested `kbn_tp_embeddable_explorer` plugin, as well as the jest tested classes inside the `embeddable_api/public/test_samples` folder. +and navigate to the Embeddable explorer app. ## Testing Run unit tests ```shell -node scripts/jest embeddable_api +node scripts/jest embeddable ``` From ac549ac6f5fe47ec3eacde87a1b1827c68ece119 Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Wed, 15 Apr 2020 14:57:44 -0400 Subject: [PATCH 36/80] [Lens] Only show copy on save for previously saved docs (#63535) * [Lens] Only show copy on save for previously saved docs * Update app.test.tsx import after kibana platform changes Co-authored-by: Marta Bondyra --- .../lens/public/app_plugin/app.test.tsx | 22 +++++++++++++++++++ x-pack/plugins/lens/public/app_plugin/app.tsx | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index d49c128dff604..41d0e3a7aa9a0 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -12,6 +12,7 @@ import { EditorFrameInstance } from '../types'; import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { Document, SavedObjectStore } from '../persistence'; import { mount } from 'enzyme'; +import { SavedObjectSaveModal } from '../../../../../src/plugins/saved_objects/public'; import { esFilters, FilterManager, @@ -650,6 +651,27 @@ describe('Lens App', () => { }, }); }); + + it('does not show the copy button on first save', async () => { + const args = defaultArgs; + args.editorFrame = frame; + + instance = mount(); + + const onChange = frame.mount.mock.calls[0][1].onChange; + await act(async () => + onChange({ + filterableIndexPatterns: [], + doc: ({ expression: 'valid expression' } as unknown) as Document, + }) + ); + instance.update(); + + await act(async () => getButton(instance).run(instance.getDOMNode())); + instance.update(); + + expect(instance.find(SavedObjectSaveModal).prop('showCopyOnSave')).toEqual(false); + }); }); }); diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index 2d8f1650e4008..28135dd12a724 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -387,7 +387,7 @@ export function App({ }} onClose={() => setState(s => ({ ...s, isSaveModalVisible: false }))} title={lastKnownDoc.title || ''} - showCopyOnSave={!addToDashboardMode} + showCopyOnSave={!!lastKnownDoc.id && !addToDashboardMode} objectType={i18n.translate('xpack.lens.app.saveModalType', { defaultMessage: 'Lens visualization', })} From 6c670b77f88777bcdbdaade738d59363e6ba7eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Wed, 15 Apr 2020 15:54:36 -0400 Subject: [PATCH 37/80] Split action types into own page (#63516) * Split action types into own page * Update docs/user/alerting/action-types.asciidoc Co-Authored-By: gchaps <33642766+gchaps@users.noreply.github.com> * Apply changes based on feedback Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- docs/user/alerting/action-types.asciidoc | 191 +++--------------- .../user/alerting/action-types/email.asciidoc | 29 +++ .../user/alerting/action-types/index.asciidoc | 24 +++ .../alerting/action-types/pagerduty.asciidoc | 33 +++ .../alerting/action-types/server-log.asciidoc | 21 ++ .../user/alerting/action-types/slack.asciidoc | 22 ++ .../alerting/action-types/webhook.asciidoc | 26 +++ 7 files changed, 183 insertions(+), 163 deletions(-) create mode 100644 docs/user/alerting/action-types/email.asciidoc create mode 100644 docs/user/alerting/action-types/index.asciidoc create mode 100644 docs/user/alerting/action-types/pagerduty.asciidoc create mode 100644 docs/user/alerting/action-types/server-log.asciidoc create mode 100644 docs/user/alerting/action-types/slack.asciidoc create mode 100644 docs/user/alerting/action-types/webhook.asciidoc diff --git a/docs/user/alerting/action-types.asciidoc b/docs/user/alerting/action-types.asciidoc index 02c09736e1fa0..2913bf28dd765 100644 --- a/docs/user/alerting/action-types.asciidoc +++ b/docs/user/alerting/action-types.asciidoc @@ -2,181 +2,46 @@ [[action-types]] == Action and connector types -{kib} provides the following types of actions: +Actions are Kibana services or integrations with third-party systems that run as background tasks on the Kibana server when alert conditions are met. {kib} provides the following types of actions: -* <> -* <> -* <> -* <> -* <> -* <> +[cols="2"] +|=== -This section describes how to configure connectors and actions for each type. +a| <> -[NOTE] -============================================== -Some action types are paid commercial features, while others are free. -For a comparison of the Elastic license levels, -see https://www.elastic.co/subscriptions[the subscription page]. -============================================== - -[float] -[[email-action-type]] -=== Email - -The email action type uses the SMTP protocol to send mail message, using an integration of https://nodemailer.com/[Nodemailer]. Email message text is sent as both plain text and html text. - -[float] -[[email-connector-configuration]] -==== Connector configuration - -Email connectors have the following configuration properties: - -Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. -Sender:: The from address for all emails sent with this connector, specified in `user@host-name` format. -Host:: Host name of the service provider. If you are using the <> setting, make sure this hostname is whitelisted. -Port:: The port to connect to on the service provider. -Secure:: If true the connection will use TLS when connecting to the service provider. See https://nodemailer.com/smtp/#tls-options[nodemailer TLS documentation] for more information. -Username:: username for 'login' type authentication. -Password:: password for 'login' type authentication. - -[float] -[[email-action-configuration]] -==== Action configuration - -Email actions have the following configuration properties: - -To, CC, BCC:: Each is a list of addresses. Addresses can be specified in `user@host-name` format, or in `name ` format. One of To, CC, or BCC must contain an entry. -Subject:: The subject line of the email. -Message:: The message text of the email. Markdown format is supported. - -[float] -[[index-action-type]] -=== Index - -The index action type will index a document into {es}. - -[float] -[[index-connector-configuration]] -==== Connector configuration - -Index connectors have the following configuration properties: - -Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. -Index:: The {es} index to be written to. -Refresh:: Setting for the {ref}/docs-refresh.html[refresh] policy for the write request. -Execution time field:: This field will be automatically set to the time the alert condition was detected. - -[float] -[[index-action-configuration]] -==== Action configuration - -Index actions have the following properties: - -Document:: The document to index in json format. - -[float] -[[pagerduty-action-type]] -=== PagerDuty - -The PagerDuty action type uses the https://v2.developer.pagerduty.com/docs/events-api-v2[v2 Events API] to trigger, acknowledge, and resolve PagerDuty alerts. - -[float] -[[pagerduty-connector-configuration]] -==== Connector configuration +| Send email from your server. -PagerDuty connectors have the following configuration properties: +a| <> -Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. -API URL:: An optional PagerDuty event URL. Defaults to `https://events.pagerduty.com/v2/enqueue`. If you are using the <> setting, make sure the hostname is whitelisted. -Routing Key:: A 32 character PagerDuty Integration Key for an integration on a service or on a global ruleset. +| Index data into Elasticsearch. -[float] -[[pagerduty-action-configuration]] -==== Action configuration +a| <> -PagerDuty actions have the following properties: +| Send an event in PagerDuty. -Severity:: The perceived severity of on the affected system. This can be one of `Critical`, `Error`, `Warning` or `Info`(default). -Event action:: One of `Trigger` (default), `Resolve`, or `Acknowledge`. See https://v2.developer.pagerduty.com/docs/events-api-v2#event-action[event action] for more details. -Dedup Key:: All actions sharing this key will be associated with the same PagerDuty alert. This value is used to correlate trigger and resolution. This value is *optional*, and if unset defaults to `action:`. The maximum length is *255* characters. See https://v2.developer.pagerduty.com/docs/events-api-v2#alert-de-duplication[alert deduplication] for details. -Timestamp:: An *optional* https://v2.developer.pagerduty.com/v2/docs/types#datetime[ISO-8601 format date-time], indicating the time the event was detected or generated. -Component:: An *optional* value indicating the component of the source machine that is responsible for the event, for example `mysql` or `eth0`. -Group:: An *optional* value indicating the logical grouping of components of a service, for example `app-stack`. -Source:: An *optional* value indicating the affected system, preferably a hostname or fully qualified domain name. Defaults to the {kib} saved object id of the action. -Summary:: An *optional* text summary of the event, defaults to `No summary provided`. The maximum length is 1024 characters. -Class:: An *optional* value indicating the class/type of the event, for example `ping failure` or `cpu load`. +a| <> -For more details on these properties, see https://v2.developer.pagerduty.com/v2/docs/send-an-event-events-api-v2[PagerDuty v2 event parameters]. +| Add a message to a Kibana log. -[float] -[[server-log-action-type]] -=== Server log +a| <> -This action type writes and entry to the {kib} server log. +| Send a message to a Slack channel or user. -[float] -[[server-log-connector-configuration]] -==== Connector configuration +a| <> -Server log connectors have the following configuration properties: +| Send a request to a web service. +|=== -Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. - -[float] -[[server-log-action-configuration]] -==== Action configuration - -Server log actions have the following properties: - -Message:: The message to log. - -[float] -[[slack-action-type]] -=== Slack - -The Slack action type uses https://api.slack.com/incoming-webhooks[Slack Incoming Webhooks]. - -[float] -[[slack-connector-configuration]] -==== Connector configuration - -Slack connectors have the following configuration properties: - -Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. -Webhook URL:: The URL of the incoming webhook. See https://api.slack.com/messaging/webhooks#getting_started[Slack Incoming Webhooks] for instructions on generating this URL. If you are using the <> setting, make sure the hostname is whitelisted. - -[float] -[[slack-action-configuration]] -==== Action configuration - -Slack actions have the following properties: - -Message:: The message text, converted to the `text` field in the Webhook JSON payload. Currently only the text field is supported. Markdown, images, and other advanced formatting are not yet supported. - -[float] -[[webhook-action-type]] -=== Webhook - -The Webhook action type uses https://github.com/axios/axios[axios] to send a POST or PUT request to a web service. - -[float] -[[webhook-connector-configuration]] -==== Connector configuration - -Webhook connectors have the following configuration properties: - -Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. -URL:: The request URL. If you are using the <> setting, make sure the hostname is whitelisted. -Method:: HTTP request method, either `post`(default) or `put`. -Headers:: A set of key-value pairs sent as headers with the request -User:: An optional username. If set, HTTP basic authentication is used. Currently only basic authentication is supported. -Password:: An optional password. If set, HTTP basic authentication is used. Currently only basic authentication is supported. - -[float] -[[webhook-action-configuration]] -==== Action configuration - -Webhook actions have the following properties: +[NOTE] +============================================== +Some action types are paid commercial features, while others are free. +For a comparison of the Elastic subscription levels, +see https://www.elastic.co/subscriptions[the subscription page]. +============================================== -Body:: A json payload sent to the request URL. \ No newline at end of file +include::action-types/email.asciidoc[] +include::action-types/index.asciidoc[] +include::action-types/pagerduty.asciidoc[] +include::action-types/server-log.asciidoc[] +include::action-types/slack.asciidoc[] +include::action-types/webhook.asciidoc[] diff --git a/docs/user/alerting/action-types/email.asciidoc b/docs/user/alerting/action-types/email.asciidoc new file mode 100644 index 0000000000000..be3623dd9e59c --- /dev/null +++ b/docs/user/alerting/action-types/email.asciidoc @@ -0,0 +1,29 @@ +[role="xpack"] +[[email-action-type]] +== Email action type + +The email action type uses the SMTP protocol to send mail message, using an integration of https://nodemailer.com/[Nodemailer]. Email message text is sent as both plain text and html text. + +[float] +[[email-connector-configuration]] +==== Connector configuration + +Email connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +Sender:: The from address for all emails sent with this connector, specified in `user@host-name` format. +Host:: Host name of the service provider. If you are using the <> setting, make sure this hostname is whitelisted. +Port:: The port to connect to on the service provider. +Secure:: If true the connection will use TLS when connecting to the service provider. See https://nodemailer.com/smtp/#tls-options[nodemailer TLS documentation] for more information. +Username:: username for 'login' type authentication. +Password:: password for 'login' type authentication. + +[float] +[[email-action-configuration]] +==== Action configuration + +Email actions have the following configuration properties: + +To, CC, BCC:: Each is a list of addresses. Addresses can be specified in `user@host-name` format, or in `name ` format. One of To, CC, or BCC must contain an entry. +Subject:: The subject line of the email. +Message:: The message text of the email. Markdown format is supported. \ No newline at end of file diff --git a/docs/user/alerting/action-types/index.asciidoc b/docs/user/alerting/action-types/index.asciidoc new file mode 100644 index 0000000000000..75d9e57b1f212 --- /dev/null +++ b/docs/user/alerting/action-types/index.asciidoc @@ -0,0 +1,24 @@ +[role="xpack"] +[[index-action-type]] +== Index action type + +The index action type will index a document into {es}. + +[float] +[[index-connector-configuration]] +==== Connector configuration + +Index connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +Index:: The {es} index to be written to. +Refresh:: Setting for the {ref}/docs-refresh.html[refresh] policy for the write request. +Execution time field:: This field will be automatically set to the time the alert condition was detected. + +[float] +[[index-action-configuration]] +==== Action configuration + +Index actions have the following properties: + +Document:: The document to index in json format. \ No newline at end of file diff --git a/docs/user/alerting/action-types/pagerduty.asciidoc b/docs/user/alerting/action-types/pagerduty.asciidoc new file mode 100644 index 0000000000000..50a1f31e4a9ae --- /dev/null +++ b/docs/user/alerting/action-types/pagerduty.asciidoc @@ -0,0 +1,33 @@ +[role="xpack"] +[[pagerduty-action-type]] +== PagerDuty action type + +The PagerDuty action type uses the https://v2.developer.pagerduty.com/docs/events-api-v2[v2 Events API] to trigger, acknowledge, and resolve PagerDuty alerts. + +[float] +[[pagerduty-connector-configuration]] +==== Connector configuration + +PagerDuty connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +API URL:: An optional PagerDuty event URL. Defaults to `https://events.pagerduty.com/v2/enqueue`. If you are using the <> setting, make sure the hostname is whitelisted. +Routing Key:: A 32 character PagerDuty Integration Key for an integration on a service or on a global ruleset. + +[float] +[[pagerduty-action-configuration]] +==== Action configuration + +PagerDuty actions have the following properties: + +Severity:: The perceived severity of on the affected system. This can be one of `Critical`, `Error`, `Warning` or `Info`(default). +Event action:: One of `Trigger` (default), `Resolve`, or `Acknowledge`. See https://v2.developer.pagerduty.com/docs/events-api-v2#event-action[event action] for more details. +Dedup Key:: All actions sharing this key will be associated with the same PagerDuty alert. This value is used to correlate trigger and resolution. This value is *optional*, and if unset defaults to `action:`. The maximum length is *255* characters. See https://v2.developer.pagerduty.com/docs/events-api-v2#alert-de-duplication[alert deduplication] for details. +Timestamp:: An *optional* https://v2.developer.pagerduty.com/v2/docs/types#datetime[ISO-8601 format date-time], indicating the time the event was detected or generated. +Component:: An *optional* value indicating the component of the source machine that is responsible for the event, for example `mysql` or `eth0`. +Group:: An *optional* value indicating the logical grouping of components of a service, for example `app-stack`. +Source:: An *optional* value indicating the affected system, preferably a hostname or fully qualified domain name. Defaults to the {kib} saved object id of the action. +Summary:: An *optional* text summary of the event, defaults to `No summary provided`. The maximum length is 1024 characters. +Class:: An *optional* value indicating the class/type of the event, for example `ping failure` or `cpu load`. + +For more details on these properties, see https://v2.developer.pagerduty.com/v2/docs/send-an-event-events-api-v2[PagerDuty v2 event parameters]. \ No newline at end of file diff --git a/docs/user/alerting/action-types/server-log.asciidoc b/docs/user/alerting/action-types/server-log.asciidoc new file mode 100644 index 0000000000000..4efbdf3bea099 --- /dev/null +++ b/docs/user/alerting/action-types/server-log.asciidoc @@ -0,0 +1,21 @@ +[role="xpack"] +[[server-log-action-type]] +== Server log action type + +This action type writes and entry to the {kib} server log. + +[float] +[[server-log-connector-configuration]] +==== Connector configuration + +Server log connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. + +[float] +[[server-log-action-configuration]] +==== Action configuration + +Server log actions have the following properties: + +Message:: The message to log. \ No newline at end of file diff --git a/docs/user/alerting/action-types/slack.asciidoc b/docs/user/alerting/action-types/slack.asciidoc new file mode 100644 index 0000000000000..a4bacbf162e46 --- /dev/null +++ b/docs/user/alerting/action-types/slack.asciidoc @@ -0,0 +1,22 @@ +[role="xpack"] +[[slack-action-type]] +== Slack action type + +The Slack action type uses https://api.slack.com/incoming-webhooks[Slack Incoming Webhooks]. + +[float] +[[slack-connector-configuration]] +==== Connector configuration + +Slack connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +Webhook URL:: The URL of the incoming webhook. See https://api.slack.com/messaging/webhooks#getting_started[Slack Incoming Webhooks] for instructions on generating this URL. If you are using the <> setting, make sure the hostname is whitelisted. + +[float] +[[slack-action-configuration]] +==== Action configuration + +Slack actions have the following properties: + +Message:: The message text, converted to the `text` field in the Webhook JSON payload. Currently only the text field is supported. Markdown, images, and other advanced formatting are not yet supported. \ No newline at end of file diff --git a/docs/user/alerting/action-types/webhook.asciidoc b/docs/user/alerting/action-types/webhook.asciidoc new file mode 100644 index 0000000000000..8c211aa83af89 --- /dev/null +++ b/docs/user/alerting/action-types/webhook.asciidoc @@ -0,0 +1,26 @@ +[role="xpack"] +[[webhook-action-type]] +== Webhook action type + +The Webhook action type uses https://github.com/axios/axios[axios] to send a POST or PUT request to a web service. + +[float] +[[webhook-connector-configuration]] +==== Connector configuration + +Webhook connectors have the following configuration properties: + +Name:: The name of the connector. The name is used to identify a connector in the management UI connector listing, or in the connector list when configuring an action. +URL:: The request URL. If you are using the <> setting, make sure the hostname is whitelisted. +Method:: HTTP request method, either `post`(default) or `put`. +Headers:: A set of key-value pairs sent as headers with the request +User:: An optional username. If set, HTTP basic authentication is used. Currently only basic authentication is supported. +Password:: An optional password. If set, HTTP basic authentication is used. Currently only basic authentication is supported. + +[float] +[[webhook-action-configuration]] +==== Action configuration + +Webhook actions have the following properties: + +Body:: A json payload sent to the request URL. \ No newline at end of file From 23e3f1aab5f9ec405e2c9fe98e4f0bd34ee46db4 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Wed, 15 Apr 2020 14:05:19 -0700 Subject: [PATCH 38/80] [Reporting] Add "warning" status as an alternate type of completed job (#63498) * [Reporting] Add "warning" as a status * test * fix warning status handling * Simplify logic * fix syntax * more different statuses * fix warning * feedbacks --- .../server/lib/esqueue/__tests__/worker.js | 21 +++++++++++++++++++ .../constants/{statuses.js => statuses.ts} | 1 + .../reporting/server/lib/esqueue/worker.js | 6 +++++- .../server/routes/lib/get_document_payload.ts | 5 +++-- x-pack/legacy/plugins/reporting/types.d.ts | 3 ++- x-pack/plugins/reporting/constants.ts | 2 ++ x-pack/plugins/reporting/index.d.ts | 7 ++++++- .../buttons/report_download_button.tsx | 2 +- .../public/components/report_listing.test.tsx | 21 +++++++++---------- .../public/components/report_listing.tsx | 12 ++++++++++- .../reporting/public/lib/stream_handler.ts | 3 ++- 11 files changed, 64 insertions(+), 19 deletions(-) rename x-pack/legacy/plugins/reporting/server/lib/esqueue/constants/{statuses.js => statuses.ts} (89%) diff --git a/x-pack/legacy/plugins/reporting/server/lib/esqueue/__tests__/worker.js b/x-pack/legacy/plugins/reporting/server/lib/esqueue/__tests__/worker.js index ad93a1882746d..ea80a652bb506 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/esqueue/__tests__/worker.js +++ b/x-pack/legacy/plugins/reporting/server/lib/esqueue/__tests__/worker.js @@ -760,6 +760,27 @@ describe('Worker class', function() { }); }); + it('handle warnings in the output by reflecting a warning status', () => { + const workerFn = () => { + return Promise.resolve({ + ...payload, + warnings: [`Don't run with scissors!`], + }); + }; + worker = new Worker(mockQueue, 'test', workerFn, defaultWorkerOptions); + + return worker + ._performJob({ + test: true, + ...job, + }) + .then(() => { + sinon.assert.calledOnce(updateSpy); + const doc = updateSpy.firstCall.args[1].body.doc; + expect(doc).to.have.property('status', constants.JOB_STATUS_WARNINGS); + }); + }); + it('should emit completion event', function(done) { worker = new Worker(mockQueue, 'test', noop, defaultWorkerOptions); diff --git a/x-pack/legacy/plugins/reporting/server/lib/esqueue/constants/statuses.js b/x-pack/legacy/plugins/reporting/server/lib/esqueue/constants/statuses.ts similarity index 89% rename from x-pack/legacy/plugins/reporting/server/lib/esqueue/constants/statuses.js rename to x-pack/legacy/plugins/reporting/server/lib/esqueue/constants/statuses.ts index 620a567e18fe7..7c7f1431adf23 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/esqueue/constants/statuses.js +++ b/x-pack/legacy/plugins/reporting/server/lib/esqueue/constants/statuses.ts @@ -8,6 +8,7 @@ export const statuses = { JOB_STATUS_PENDING: 'pending', JOB_STATUS_PROCESSING: 'processing', JOB_STATUS_COMPLETED: 'completed', + JOB_STATUS_WARNINGS: 'completed_with_warnings', JOB_STATUS_FAILED: 'failed', JOB_STATUS_CANCELLED: 'cancelled', }; diff --git a/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js b/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js index 113059fa2fa47..ab0bb6740f078 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js +++ b/x-pack/legacy/plugins/reporting/server/lib/esqueue/worker.js @@ -285,8 +285,12 @@ export class Worker extends events.EventEmitter { const completedTime = moment().toISOString(); const docOutput = this._formatOutput(output); + const status = + output && output.warnings && output.warnings.length > 0 + ? constants.JOB_STATUS_WARNINGS + : constants.JOB_STATUS_COMPLETED; const doc = { - status: constants.JOB_STATUS_COMPLETED, + status, completed_at: completedTime, output: docOutput, }; diff --git a/x-pack/legacy/plugins/reporting/server/routes/lib/get_document_payload.ts b/x-pack/legacy/plugins/reporting/server/routes/lib/get_document_payload.ts index aef37754681ec..c243d0b4266ea 100644 --- a/x-pack/legacy/plugins/reporting/server/routes/lib/get_document_payload.ts +++ b/x-pack/legacy/plugins/reporting/server/routes/lib/get_document_payload.ts @@ -9,6 +9,7 @@ import contentDisposition from 'content-disposition'; import * as _ from 'lodash'; import { CSV_JOB_TYPE } from '../../../common/constants'; import { ExportTypeDefinition, ExportTypesRegistry, JobDocOutput, JobSource } from '../../../types'; +import { statuses } from '../../lib/esqueue/constants/statuses'; interface ICustomHeaders { [x: string]: any; @@ -99,11 +100,11 @@ export function getDocumentPayloadFactory(exportTypesRegistry: ExportTypesRegist const { status, jobtype: jobType, payload: { title } = { title: '' } } = doc._source; const { output } = doc._source; - if (status === 'completed') { + if (status === statuses.JOB_STATUS_COMPLETED || status === statuses.JOB_STATUS_WARNINGS) { return getCompleted(output, jobType, title); } - if (status === 'failed') { + if (status === statuses.JOB_STATUS_FAILED) { return getFailure(output); } diff --git a/x-pack/legacy/plugins/reporting/types.d.ts b/x-pack/legacy/plugins/reporting/types.d.ts index eec7da7dc6733..2e7da6663ab03 100644 --- a/x-pack/legacy/plugins/reporting/types.d.ts +++ b/x-pack/legacy/plugins/reporting/types.d.ts @@ -8,6 +8,7 @@ import { EventEmitter } from 'events'; import { ResponseObject } from 'hapi'; import { Legacy } from 'kibana'; import { CallCluster } from '../../../../src/legacy/core_plugins/elasticsearch'; +import { JobStatus } from '../../../plugins/reporting'; // reporting new platform import { CancellationToken } from './common/cancellation_token'; import { ReportingCore } from './server/core'; import { LevelLogger } from './server/lib/level_logger'; @@ -150,7 +151,7 @@ export interface JobSource { jobtype: string; output: JobDocOutput; payload: JobDocPayload; - status: string; // completed, failed, etc + status: JobStatus; }; } diff --git a/x-pack/plugins/reporting/constants.ts b/x-pack/plugins/reporting/constants.ts index 8f47a0a6b2ac1..5756d29face12 100644 --- a/x-pack/plugins/reporting/constants.ts +++ b/x-pack/plugins/reporting/constants.ts @@ -24,6 +24,7 @@ export const REPORTING_MANAGEMENT_HOME = '/app/kibana#/management/kibana/reporti // Statuses export const JOB_STATUS_FAILED = 'failed'; export const JOB_STATUS_COMPLETED = 'completed'; +export const JOB_STATUS_WARNINGS = 'completed_with_warnings'; export enum JobStatuses { PENDING = 'pending', @@ -31,6 +32,7 @@ export enum JobStatuses { COMPLETED = 'completed', FAILED = 'failed', CANCELLED = 'cancelled', + WARNINGS = 'completed_with_warnings', } // Types diff --git a/x-pack/plugins/reporting/index.d.ts b/x-pack/plugins/reporting/index.d.ts index 7c1a2ebd7d9de..26d661e29bd94 100644 --- a/x-pack/plugins/reporting/index.d.ts +++ b/x-pack/plugins/reporting/index.d.ts @@ -14,7 +14,12 @@ import { } from '../../../src/core/public'; export type JobId = string; -export type JobStatus = 'completed' | 'pending' | 'processing' | 'failed'; +export type JobStatus = + | 'completed' + | 'completed_with_warnings' + | 'pending' + | 'processing' + | 'failed'; export type HttpService = HttpSetup; export type NotificationsService = NotificationsStart; diff --git a/x-pack/plugins/reporting/public/components/buttons/report_download_button.tsx b/x-pack/plugins/reporting/public/components/buttons/report_download_button.tsx index b0674c149609d..6c13264ebcb1f 100644 --- a/x-pack/plugins/reporting/public/components/buttons/report_download_button.tsx +++ b/x-pack/plugins/reporting/public/components/buttons/report_download_button.tsx @@ -14,7 +14,7 @@ type Props = { record: ListingJob } & ListingProps; export const ReportDownloadButton: FunctionComponent = (props: Props) => { const { record, apiClient, intl } = props; - if (record.status !== JobStatuses.COMPLETED) { + if (record.status !== JobStatuses.COMPLETED && record.status !== JobStatuses.WARNINGS) { return null; } diff --git a/x-pack/plugins/reporting/public/components/report_listing.test.tsx b/x-pack/plugins/reporting/public/components/report_listing.test.tsx index 9b541261a690b..380a3b3295b9f 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.test.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.test.tsx @@ -17,17 +17,16 @@ import { ReportListing } from './report_listing'; const reportingAPIClient = { list: () => Promise.resolve([ - { _index: '.reporting-2019.08.18', _id: 'jzoik8dh1q2i89fb5f19znm6', _source: { payload: { layout: { id: 'preserve_layout', dimensions: { width: 1635, height: 792 } }, type: 'dashboard', title: 'Names', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:24.869Z', jobtype: 'printable_pdf', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoik7tn1q2i89fb5f60e5ve', _score: null, _source: { payload: { layout: { id: 'preserve_layout', dimensions: { width: 1635, height: 792 } }, type: 'dashboard', title: 'Names', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:24.155Z', jobtype: 'printable_pdf', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoik5tb1q2i89fb5fckchny', _score: null, _source: { payload: { layout: { id: 'png', dimensions: { width: 1898, height: 876 } }, title: 'cool dashboard', type: 'dashboard', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:21.551Z', jobtype: 'PNG', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoik5a11q2i89fb5f130t2m', _score: null, _source: { payload: { layout: { id: 'png', dimensions: { width: 1898, height: 876 } }, title: 'cool dashboard', type: 'dashboard', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:20.857Z', jobtype: 'PNG', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoik3ka1q2i89fb5fdx93g7', _score: null, _source: { payload: { layout: { id: 'preserve_layout', dimensions: { width: 1898, height: 876 } }, type: 'dashboard', title: 'cool dashboard', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:18.634Z', jobtype: 'printable_pdf', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoik2vt1q2i89fb5ffw723n', _score: null, _source: { payload: { layout: { id: 'preserve_layout', dimensions: { width: 1898, height: 876 } }, type: 'dashboard', title: 'cool dashboard', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:17.753Z', jobtype: 'printable_pdf', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoik1851q2i89fb5fdge6e7', _score: null, _source: { payload: { layout: { id: 'preserve_layout', dimensions: { width: 1080, height: 720 } }, type: 'canvas workpad', title: 'My Canvas Workpad - Dark', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:15.605Z', jobtype: 'printable_pdf', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoijyre1q2i89fb5fa7xzvi', _score: null, _source: { payload: { type: 'dashboard', title: 'tests-panels', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:12.410Z', jobtype: 'printable_pdf', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jzoijv5h1q2i89fb5ffklnhx', _score: null, _source: { payload: { type: 'dashboard', title: 'tests-panels', }, max_attempts: 3, browser_type: 'chromium', created_at: '2019-08-23T19:34:07.733Z', jobtype: 'printable_pdf', created_by: 'elastic', attempts: 0, status: 'pending', }, }, // prettier-ignore - { _index: '.reporting-2019.08.18', _id: 'jznhgk7r1bx789fb5f6hxok7', _score: null, _source: { kibana_name: 'spicy.local', browser_type: 'chromium', created_at: '2019-08-23T02:15:47.799Z', jobtype: 'printable_pdf', created_by: 'elastic', kibana_id: 'ca75e26c-2b7d-464f-aef0-babb67c735a0', output: { content_type: 'application/pdf', size: 877114 }, completed_at: '2019-08-23T02:15:57.707Z', payload: { type: 'dashboard (legacy)', title: 'tests-panels', }, max_attempts: 3, started_at: '2019-08-23T02:15:48.794Z', attempts: 1, status: 'completed', }, }, // prettier-ignore - ]), + { _id: 'k90e51pk1ieucbae0c3t8wo2', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 0, browser_type: 'chromium', created_at: '2020-04-14T21:01:13.064Z', created_by: 'elastic', jobtype: 'printable_pdf', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T21:01:13.062Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e7-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '1970-01-01T00:00:00.000Z', status: 'pending', timeout: 300000, }, sort: [1586898073064], }, // prettier-ignore + { _id: 'k90e51pk1ieucbae0c3t8wo1', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 1, browser_type: 'chromium', created_at: '2020-04-14T21:01:13.064Z', created_by: 'elastic', jobtype: 'printable_pdf', kibana_id: '5b2de169-2785-441b-ae8c-186a1936b17d', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T21:01:13.062Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e7-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '2020-04-14T21:06:14.526Z', started_at: '2020-04-14T21:01:14.526Z', status: 'processing', timeout: 300000, }, sort: [1586898073064], }, + { _id: 'k90cmthd1gv8cbae0c2le8bo', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 1, browser_type: 'chromium', completed_at: '2020-04-14T20:19:14.748Z', created_at: '2020-04-14T20:19:02.977Z', created_by: 'elastic', jobtype: 'printable_pdf', kibana_id: '5b2de169-2785-441b-ae8c-186a1936b17d', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, output: { content_type: 'application/pdf', size: 80262, }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T20:19:02.976Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e7-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '2020-04-14T20:24:04.073Z', started_at: '2020-04-14T20:19:04.073Z', status: 'completed', timeout: 300000, }, sort: [1586895542977], }, + { _id: 'k906958e1d4wcbae0c9hip1a', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 1, browser_type: 'chromium', completed_at: '2020-04-14T17:21:08.223Z', created_at: '2020-04-14T17:20:27.326Z', created_by: 'elastic', jobtype: 'printable_pdf', kibana_id: '5b2de169-2785-441b-ae8c-186a1936b17d', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, output: { content_type: 'application/pdf', size: 49468, warnings: [ 'An error occurred when trying to read the page for visualization panel info. You may need to increase \'xpack.reporting.capture.timeouts.waitForElements\'. TimeoutError: waiting for selector "[data-shared-item],[data-shared-items-count]" failed: timeout 30000ms exceeded', ], }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T17:20:27.326Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e8-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '2020-04-14T17:25:29.444Z', started_at: '2020-04-14T17:20:29.444Z', status: 'completed_with_warnings', timeout: 300000, }, sort: [1586884827326], }, + { _id: 'k9067y2a1d4wcbae0cad38n0', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 1, browser_type: 'chromium', completed_at: '2020-04-14T17:19:53.244Z', created_at: '2020-04-14T17:19:31.379Z', created_by: 'elastic', jobtype: 'printable_pdf', kibana_id: '5b2de169-2785-441b-ae8c-186a1936b17d', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, output: { content_type: 'application/pdf', size: 80262, }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T17:19:31.378Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e7-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '2020-04-14T17:24:39.883Z', started_at: '2020-04-14T17:19:39.883Z', status: 'completed', timeout: 300000, }, sort: [1586884771379], }, + { _id: 'k9067s1m1d4wcbae0cdnvcms', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 1, browser_type: 'chromium', completed_at: '2020-04-14T17:19:36.822Z', created_at: '2020-04-14T17:19:23.578Z', created_by: 'elastic', jobtype: 'printable_pdf', kibana_id: '5b2de169-2785-441b-ae8c-186a1936b17d', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, output: { content_type: 'application/pdf', size: 80262, }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T17:19:23.578Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e7-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '2020-04-14T17:24:25.247Z', started_at: '2020-04-14T17:19:25.247Z', status: 'completed', timeout: 300000, }, sort: [1586884763578], }, + { _id: 'k9065q3s1d4wcbae0c00fxlh', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 1, browser_type: 'chromium', completed_at: '2020-04-14T17:18:03.910Z', created_at: '2020-04-14T17:17:47.752Z', created_by: 'elastic', jobtype: 'printable_pdf', kibana_id: '5b2de169-2785-441b-ae8c-186a1936b17d', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, output: { content_type: 'application/pdf', size: 80262, }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T17:17:47.750Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e7-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '2020-04-14T17:22:50.379Z', started_at: '2020-04-14T17:17:50.379Z', status: 'completed', timeout: 300000, }, sort: [1586884667752], }, + { _id: 'k905zdw11d34cbae0c3y6tzh', _index: '.reporting-2020.04.12', _score: null, _source: { attempts: 1, browser_type: 'chromium', completed_at: '2020-04-14T17:13:03.719Z', created_at: '2020-04-14T17:12:51.985Z', created_by: 'elastic', jobtype: 'printable_pdf', kibana_id: '5b2de169-2785-441b-ae8c-186a1936b17d', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'preserve_layout', objectType: 'canvas workpad', }, output: { content_type: 'application/pdf', size: 80262, }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-14T17:12:51.984Z', layout: { dimensions: { height: 720, width: 1080, }, id: 'preserve_layout', }, objectType: 'canvas workpad', relativeUrls: [ '/s/hsyjklk/app/canvas#/export/workpad/pdf/workpad-53d38306-eda4-410f-b5e7-efbeca1a8c63/page/1', ], title: 'My Canvas Workpad', }, priority: 10, process_expiration: '2020-04-14T17:17:52.431Z', started_at: '2020-04-14T17:12:52.431Z', status: 'completed', timeout: 300000, }, sort: [1586884371985], }, + { _id: 'k8t4ylcb07mi9d006214ifyg', _index: '.reporting-2020.04.05', _score: null, _source: { attempts: 1, browser_type: 'chromium', completed_at: '2020-04-09T19:10:10.049Z', created_at: '2020-04-09T19:09:52.139Z', created_by: 'elastic', jobtype: 'PNG', kibana_id: 'f2e59b4e-f79b-4a48-8a7d-6d50a3c1d914', kibana_name: 'spicy.local', max_attempts: 1, meta: { layout: 'png', objectType: 'visualization', }, output: { content_type: 'image/png', }, payload: { basePath: '/kbn', browserTimezone: 'America/Phoenix', forceNow: '2020-04-09T19:09:52.137Z', layout: { dimensions: { height: 1575, width: 1423, }, id: 'png', }, objectType: 'visualization', relativeUrl: "/s/hsyjklk/app/kibana#/visualize/edit/94d1fe40-7a94-11ea-b373-0749f92ad295?_a=(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!((enabled:!t,id:'1',params:(),schema:metric,type:count)),params:(addLegend:!f,addTooltip:!t,metric:(colorSchema:'Green%20to%20Red',colorsRange:!((from:0,to:10000)),invertColors:!f,labels:(show:!t),metricColorMode:None,percentageMode:!f,style:(bgColor:!f,bgFill:%23000,fontSize:60,labelColor:!f,subText:''),useRanges:!f),type:metric),title:count,type:metric))&_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-15y,to:now))&indexPattern=d81752b0-7434-11ea-be36-1f978cda44d4&type=metric", title: 'count', }, priority: 10, process_expiration: '2020-04-09T19:14:54.570Z', started_at: '2020-04-09T19:09:54.570Z', status: 'completed', timeout: 300000, }, sort: [1586459392139], }, + ]), // prettier-ignore total: () => Promise.resolve(18), } as any; diff --git a/x-pack/plugins/reporting/public/components/report_listing.tsx b/x-pack/plugins/reporting/public/components/report_listing.tsx index 93dd293876f82..885e9577471a0 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.tsx @@ -87,6 +87,12 @@ const jobStatusLabelsMap = new Map([ defaultMessage: 'Completed', }), ], + [ + JobStatuses.WARNINGS, + i18n.translate('xpack.reporting.jobStatuses.warningText', { + defaultMessage: 'Completed with warnings', + }), + ], [ JobStatuses.FAILED, i18n.translate('xpack.reporting.jobStatuses.failedText', { @@ -410,7 +416,11 @@ class ReportListingUi extends Component { statusTimestamp = this.formatDate(record.started_at); } else if ( record.completed_at && - (status === JobStatuses.COMPLETED || status === JobStatuses.FAILED) + ([ + JobStatuses.COMPLETED, + JobStatuses.FAILED, + JobStatuses.WARNINGS, + ] as string[]).includes(status) ) { statusTimestamp = this.formatDate(record.completed_at); } diff --git a/x-pack/plugins/reporting/public/lib/stream_handler.ts b/x-pack/plugins/reporting/public/lib/stream_handler.ts index 1aae30f6fdfb0..3c121f1712685 100644 --- a/x-pack/plugins/reporting/public/lib/stream_handler.ts +++ b/x-pack/plugins/reporting/public/lib/stream_handler.ts @@ -11,6 +11,7 @@ import { JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY, JOB_STATUS_COMPLETED, JOB_STATUS_FAILED, + JOB_STATUS_WARNINGS, } from '../../constants'; import { @@ -112,7 +113,7 @@ export class ReportingNotifierStreamHandler { _source: { status: jobStatus }, } = job; if (storedJobs.includes(jobId)) { - if (jobStatus === JOB_STATUS_COMPLETED) { + if (jobStatus === JOB_STATUS_COMPLETED || jobStatus === JOB_STATUS_WARNINGS) { completedJobs.push(summarizeJob(job)); } else if (jobStatus === JOB_STATUS_FAILED) { failedJobs.push(summarizeJob(job)); From f4c81b440d489c6a49ea67eeb2a911d7dcf6631e Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Wed, 15 Apr 2020 14:52:32 -0700 Subject: [PATCH 39/80] [Reporting] Switch Serverside Config Wrapper to NP (#62500) * New config * fix translations json * add csv.useByteOrderMarkEncoding to schema * imports cleanup * restore "get default chromium sandbox disabled" functionality * integrate getDefaultChromiumSandboxDisabled * fix tests * --wip-- [skip ci] * add more schema tests * diff prettiness * trash legacy files that moved to NP * create_config tests * Hoist create_config * better disableSandbox tests * fix ts * fix export * fix bad code * make comments better * fix i18n * comment * automatically setting... logs * replace log_configuration * fix lint * This is f2 * improve startup log about sandbox info * update docs with log reference * revert log removal Co-authored-by: Elastic Machine --- docs/user/reporting/chromium-sandbox.asciidoc | 10 +- .../__snapshots__/index.test.ts.snap | 387 ------------------ x-pack/legacy/plugins/reporting/config.ts | 183 --------- x-pack/legacy/plugins/reporting/index.test.ts | 34 -- x-pack/legacy/plugins/reporting/index.ts | 12 - .../plugins/reporting/log_configuration.ts | 35 -- .../browsers/chromium/driver_factory/args.ts | 2 +- .../reporting/server/browsers/index.ts | 1 - .../plugins/reporting/server/config/config.js | 21 - .../plugins/reporting/server/config/index.ts | 134 +----- .../legacy/plugins/reporting/server/legacy.ts | 10 +- .../lib/esqueue/helpers/index_timestamp.js | 1 + .../legacy/plugins/reporting/server/plugin.ts | 5 - .../plugins/reporting/server/types.d.ts | 3 +- .../create_mock_reportingplugin.ts | 1 - x-pack/plugins/reporting/config.ts | 10 - x-pack/plugins/reporting/kibana.json | 5 +- .../server/config/create_config.test.ts | 165 ++++++++ .../reporting/server/config/create_config.ts | 124 ++++++ ...default_chromium_sandbox_disabled.test.ts} | 12 +- .../default_chromium_sandbox_disabled.ts | 11 +- .../plugins/reporting/server/config/index.ts | 23 ++ .../reporting/server/config/schema.test.ts | 134 ++++++ .../plugins/reporting/server/config/schema.ts | 174 ++++++++ x-pack/plugins/reporting/server/index.ts | 14 + x-pack/plugins/reporting/server/plugin.ts | 38 ++ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 28 files changed, 709 insertions(+), 842 deletions(-) delete mode 100644 x-pack/legacy/plugins/reporting/__snapshots__/index.test.ts.snap delete mode 100644 x-pack/legacy/plugins/reporting/config.ts delete mode 100644 x-pack/legacy/plugins/reporting/index.test.ts delete mode 100644 x-pack/legacy/plugins/reporting/log_configuration.ts delete mode 100644 x-pack/legacy/plugins/reporting/server/config/config.js delete mode 100644 x-pack/plugins/reporting/config.ts create mode 100644 x-pack/plugins/reporting/server/config/create_config.test.ts create mode 100644 x-pack/plugins/reporting/server/config/create_config.ts rename x-pack/{legacy/plugins/reporting/server/browsers/default_chromium_sandbox_disabled.test.js => plugins/reporting/server/config/default_chromium_sandbox_disabled.test.ts} (82%) rename x-pack/{legacy/plugins/reporting/server/browsers => plugins/reporting/server/config}/default_chromium_sandbox_disabled.ts (80%) create mode 100644 x-pack/plugins/reporting/server/config/index.ts create mode 100644 x-pack/plugins/reporting/server/config/schema.test.ts create mode 100644 x-pack/plugins/reporting/server/config/schema.ts create mode 100644 x-pack/plugins/reporting/server/index.ts create mode 100644 x-pack/plugins/reporting/server/plugin.ts diff --git a/docs/user/reporting/chromium-sandbox.asciidoc b/docs/user/reporting/chromium-sandbox.asciidoc index 5d4fbfb153a0b..bfef5b8b86c6b 100644 --- a/docs/user/reporting/chromium-sandbox.asciidoc +++ b/docs/user/reporting/chromium-sandbox.asciidoc @@ -11,12 +11,12 @@ sandboxing techniques differ for each operating system. The Linux sandbox depends on user namespaces, which were introduced with the 3.8 Linux kernel. However, many distributions don't have user namespaces enabled by default, or they require the CAP_SYS_ADMIN capability. {reporting} will automatically disable the sandbox when it is running on Debian and CentOS as additional steps are required to enable -unprivileged usernamespaces. In these situations, you'll see the following message in your {kib} logs: -`Enabling the Chromium sandbox provides an additional layer of protection`. +unprivileged usernamespaces. In these situations, you'll see the following message in your {kib} startup logs: +`Chromium sandbox provides an additional layer of protection, but is not supported for your OS. +Automatically setting 'xpack.reporting.capture.browser.chromium.disableSandbox: true'.` -If your kernel is 3.8 or newer, it's -recommended to enable usernamespaces and set `xpack.reporting.capture.browser.chromium.disableSandbox: false` in your -`kibana.yml` to enable the sandbox. +Reporting will automatically enable the Chromium sandbox at startup when a supported OS is detected. However, if your kernel is 3.8 or newer, it's +recommended to set `xpack.reporting.capture.browser.chromium.disableSandbox: false` in your `kibana.yml` to explicitly enable usernamespaces. ==== Docker When running {kib} in a Docker container, all container processes are run within a usernamespace with seccomp-bpf and diff --git a/x-pack/legacy/plugins/reporting/__snapshots__/index.test.ts.snap b/x-pack/legacy/plugins/reporting/__snapshots__/index.test.ts.snap deleted file mode 100644 index 3ae3079da136b..0000000000000 --- a/x-pack/legacy/plugins/reporting/__snapshots__/index.test.ts.snap +++ /dev/null @@ -1,387 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`config schema with context {"dev":false,"dist":false} produces correct config 1`] = ` -Object { - "capture": Object { - "browser": Object { - "autoDownload": true, - "chromium": Object { - "disableSandbox": "", - "maxScreenshotDimension": 1950, - "proxy": Object { - "enabled": false, - }, - }, - "type": "chromium", - }, - "concurrency": 4, - "loadDelay": 3000, - "maxAttempts": 1, - "networkPolicy": Object { - "enabled": true, - "rules": Array [ - Object { - "allow": true, - "protocol": "http:", - }, - Object { - "allow": true, - "protocol": "https:", - }, - Object { - "allow": true, - "protocol": "ws:", - }, - Object { - "allow": true, - "protocol": "wss:", - }, - Object { - "allow": true, - "protocol": "data:", - }, - Object { - "allow": false, - }, - ], - }, - "settleTime": 1000, - "timeout": 20000, - "timeouts": Object { - "openUrl": 30000, - "renderComplete": 30000, - "waitForElements": 30000, - }, - "viewport": Object { - "height": 1200, - "width": 1950, - }, - "zoom": 2, - }, - "csv": Object { - "checkForFormulas": true, - "enablePanelActionDownload": true, - "maxSizeBytes": 10485760, - "scroll": Object { - "duration": "30s", - "size": 500, - }, - "useByteOrderMarkEncoding": false, - }, - "enabled": true, - "encryptionKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "index": ".reporting", - "kibanaServer": Object {}, - "poll": Object { - "jobCompletionNotifier": Object { - "interval": 10000, - "intervalErrorMultiplier": 5, - }, - "jobsRefresh": Object { - "interval": 5000, - "intervalErrorMultiplier": 5, - }, - }, - "queue": Object { - "indexInterval": "week", - "pollEnabled": true, - "pollInterval": 3000, - "pollIntervalErrorMultiplier": 10, - "timeout": 120000, - }, - "roles": Object { - "allow": Array [ - "reporting_user", - ], - }, -} -`; - -exports[`config schema with context {"dev":false,"dist":true} produces correct config 1`] = ` -Object { - "capture": Object { - "browser": Object { - "autoDownload": false, - "chromium": Object { - "disableSandbox": "", - "maxScreenshotDimension": 1950, - "proxy": Object { - "enabled": false, - }, - }, - "type": "chromium", - }, - "concurrency": 4, - "loadDelay": 3000, - "maxAttempts": 3, - "networkPolicy": Object { - "enabled": true, - "rules": Array [ - Object { - "allow": true, - "protocol": "http:", - }, - Object { - "allow": true, - "protocol": "https:", - }, - Object { - "allow": true, - "protocol": "ws:", - }, - Object { - "allow": true, - "protocol": "wss:", - }, - Object { - "allow": true, - "protocol": "data:", - }, - Object { - "allow": false, - }, - ], - }, - "settleTime": 1000, - "timeout": 20000, - "timeouts": Object { - "openUrl": 30000, - "renderComplete": 30000, - "waitForElements": 30000, - }, - "viewport": Object { - "height": 1200, - "width": 1950, - }, - "zoom": 2, - }, - "csv": Object { - "checkForFormulas": true, - "enablePanelActionDownload": true, - "maxSizeBytes": 10485760, - "scroll": Object { - "duration": "30s", - "size": 500, - }, - "useByteOrderMarkEncoding": false, - }, - "enabled": true, - "index": ".reporting", - "kibanaServer": Object {}, - "poll": Object { - "jobCompletionNotifier": Object { - "interval": 10000, - "intervalErrorMultiplier": 5, - }, - "jobsRefresh": Object { - "interval": 5000, - "intervalErrorMultiplier": 5, - }, - }, - "queue": Object { - "indexInterval": "week", - "pollEnabled": true, - "pollInterval": 3000, - "pollIntervalErrorMultiplier": 10, - "timeout": 120000, - }, - "roles": Object { - "allow": Array [ - "reporting_user", - ], - }, -} -`; - -exports[`config schema with context {"dev":true,"dist":false} produces correct config 1`] = ` -Object { - "capture": Object { - "browser": Object { - "autoDownload": true, - "chromium": Object { - "disableSandbox": "", - "maxScreenshotDimension": 1950, - "proxy": Object { - "enabled": false, - }, - }, - "type": "chromium", - }, - "concurrency": 4, - "loadDelay": 3000, - "maxAttempts": 1, - "networkPolicy": Object { - "enabled": true, - "rules": Array [ - Object { - "allow": true, - "protocol": "http:", - }, - Object { - "allow": true, - "protocol": "https:", - }, - Object { - "allow": true, - "protocol": "ws:", - }, - Object { - "allow": true, - "protocol": "wss:", - }, - Object { - "allow": true, - "protocol": "data:", - }, - Object { - "allow": false, - }, - ], - }, - "settleTime": 1000, - "timeout": 20000, - "timeouts": Object { - "openUrl": 30000, - "renderComplete": 30000, - "waitForElements": 30000, - }, - "viewport": Object { - "height": 1200, - "width": 1950, - }, - "zoom": 2, - }, - "csv": Object { - "checkForFormulas": true, - "enablePanelActionDownload": true, - "maxSizeBytes": 10485760, - "scroll": Object { - "duration": "30s", - "size": 500, - }, - "useByteOrderMarkEncoding": false, - }, - "enabled": true, - "encryptionKey": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "index": ".reporting", - "kibanaServer": Object {}, - "poll": Object { - "jobCompletionNotifier": Object { - "interval": 10000, - "intervalErrorMultiplier": 5, - }, - "jobsRefresh": Object { - "interval": 5000, - "intervalErrorMultiplier": 5, - }, - }, - "queue": Object { - "indexInterval": "week", - "pollEnabled": true, - "pollInterval": 3000, - "pollIntervalErrorMultiplier": 10, - "timeout": 120000, - }, - "roles": Object { - "allow": Array [ - "reporting_user", - ], - }, -} -`; - -exports[`config schema with context {"dev":true,"dist":true} produces correct config 1`] = ` -Object { - "capture": Object { - "browser": Object { - "autoDownload": false, - "chromium": Object { - "disableSandbox": "", - "maxScreenshotDimension": 1950, - "proxy": Object { - "enabled": false, - }, - }, - "type": "chromium", - }, - "concurrency": 4, - "loadDelay": 3000, - "maxAttempts": 3, - "networkPolicy": Object { - "enabled": true, - "rules": Array [ - Object { - "allow": true, - "protocol": "http:", - }, - Object { - "allow": true, - "protocol": "https:", - }, - Object { - "allow": true, - "protocol": "ws:", - }, - Object { - "allow": true, - "protocol": "wss:", - }, - Object { - "allow": true, - "protocol": "data:", - }, - Object { - "allow": false, - }, - ], - }, - "settleTime": 1000, - "timeout": 20000, - "timeouts": Object { - "openUrl": 30000, - "renderComplete": 30000, - "waitForElements": 30000, - }, - "viewport": Object { - "height": 1200, - "width": 1950, - }, - "zoom": 2, - }, - "csv": Object { - "checkForFormulas": true, - "enablePanelActionDownload": true, - "maxSizeBytes": 10485760, - "scroll": Object { - "duration": "30s", - "size": 500, - }, - "useByteOrderMarkEncoding": false, - }, - "enabled": true, - "index": ".reporting", - "kibanaServer": Object {}, - "poll": Object { - "jobCompletionNotifier": Object { - "interval": 10000, - "intervalErrorMultiplier": 5, - }, - "jobsRefresh": Object { - "interval": 5000, - "intervalErrorMultiplier": 5, - }, - }, - "queue": Object { - "indexInterval": "week", - "pollEnabled": true, - "pollInterval": 3000, - "pollIntervalErrorMultiplier": 10, - "timeout": 120000, - }, - "roles": Object { - "allow": Array [ - "reporting_user", - ], - }, -} -`; diff --git a/x-pack/legacy/plugins/reporting/config.ts b/x-pack/legacy/plugins/reporting/config.ts deleted file mode 100644 index 5eceb84c83e43..0000000000000 --- a/x-pack/legacy/plugins/reporting/config.ts +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { BROWSER_TYPE } from './common/constants'; -// @ts-ignore untyped module -import { config as appConfig } from './server/config/config'; -import { getDefaultChromiumSandboxDisabled } from './server/browsers'; - -export async function config(Joi: any) { - return Joi.object({ - enabled: Joi.boolean().default(true), - kibanaServer: Joi.object({ - protocol: Joi.string().valid(['http', 'https']), - hostname: Joi.string().invalid('0'), - port: Joi.number().integer(), - }).default(), - queue: Joi.object({ - indexInterval: Joi.string().default('week'), - pollEnabled: Joi.boolean().default(true), - pollInterval: Joi.number() - .integer() - .default(3000), - pollIntervalErrorMultiplier: Joi.number() - .integer() - .default(10), - timeout: Joi.number() - .integer() - .default(120000), - }).default(), - capture: Joi.object({ - timeouts: Joi.object({ - openUrl: Joi.number() - .integer() - .default(30000), - waitForElements: Joi.number() - .integer() - .default(30000), - renderComplete: Joi.number() - .integer() - .default(30000), - }).default(), - networkPolicy: Joi.object({ - enabled: Joi.boolean().default(true), - rules: Joi.array() - .items( - Joi.object({ - allow: Joi.boolean().required(), - protocol: Joi.string(), - host: Joi.string(), - }) - ) - .default([ - { allow: true, protocol: 'http:' }, - { allow: true, protocol: 'https:' }, - { allow: true, protocol: 'ws:' }, - { allow: true, protocol: 'wss:' }, - { allow: true, protocol: 'data:' }, - { allow: false }, // Default action is to deny! - ]), - }).default(), - zoom: Joi.number() - .integer() - .default(2), - viewport: Joi.object({ - width: Joi.number() - .integer() - .default(1950), - height: Joi.number() - .integer() - .default(1200), - }).default(), - timeout: Joi.number() - .integer() - .default(20000), // deprecated - loadDelay: Joi.number() - .integer() - .default(3000), - settleTime: Joi.number() - .integer() - .default(1000), // deprecated - concurrency: Joi.number() - .integer() - .default(appConfig.concurrency), // deprecated - browser: Joi.object({ - type: Joi.any() - .valid(BROWSER_TYPE) - .default(BROWSER_TYPE), - autoDownload: Joi.boolean().when('$dist', { - is: true, - then: Joi.default(false), - otherwise: Joi.default(true), - }), - chromium: Joi.object({ - inspect: Joi.boolean() - .when('$dev', { - is: false, - then: Joi.valid(false), - else: Joi.default(false), - }) - .default(), - disableSandbox: Joi.boolean().default(await getDefaultChromiumSandboxDisabled()), - proxy: Joi.object({ - enabled: Joi.boolean().default(false), - server: Joi.string() - .uri({ scheme: ['http', 'https'] }) - .when('enabled', { - is: Joi.valid(false), - then: Joi.valid(null), - else: Joi.required(), - }), - bypass: Joi.array() - .items(Joi.string().regex(/^[^\s]+$/)) - .when('enabled', { - is: Joi.valid(false), - then: Joi.valid(null), - else: Joi.default([]), - }), - }).default(), - maxScreenshotDimension: Joi.number() - .integer() - .default(1950), - }).default(), - }).default(), - maxAttempts: Joi.number() - .integer() - .greater(0) - .when('$dist', { - is: true, - then: Joi.default(3), - otherwise: Joi.default(1), - }) - .default(), - }).default(), - csv: Joi.object({ - useByteOrderMarkEncoding: Joi.boolean().default(false), - checkForFormulas: Joi.boolean().default(true), - enablePanelActionDownload: Joi.boolean().default(true), - maxSizeBytes: Joi.number() - .integer() - .default(1024 * 1024 * 10), // bytes in a kB * kB in a mB * 10 - scroll: Joi.object({ - duration: Joi.string() - .regex(/^[0-9]+(d|h|m|s|ms|micros|nanos)$/, { name: 'DurationString' }) - .default('30s'), - size: Joi.number() - .integer() - .default(500), - }).default(), - }).default(), - encryptionKey: Joi.when(Joi.ref('$dist'), { - is: true, - then: Joi.string(), - otherwise: Joi.string().default('a'.repeat(32)), - }), - roles: Joi.object({ - allow: Joi.array() - .items(Joi.string()) - .default(['reporting_user']), - }).default(), - index: Joi.string().default('.reporting'), - poll: Joi.object({ - jobCompletionNotifier: Joi.object({ - interval: Joi.number() - .integer() - .default(10000), - intervalErrorMultiplier: Joi.number() - .integer() - .default(5), - }).default(), - jobsRefresh: Joi.object({ - interval: Joi.number() - .integer() - .default(5000), - intervalErrorMultiplier: Joi.number() - .integer() - .default(5), - }).default(), - }).default(), - }).default(); -} diff --git a/x-pack/legacy/plugins/reporting/index.test.ts b/x-pack/legacy/plugins/reporting/index.test.ts deleted file mode 100644 index 8148adab67874..0000000000000 --- a/x-pack/legacy/plugins/reporting/index.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { reporting } from './index'; -import { getConfigSchema } from '../../../test_utils'; - -// The snapshot records the number of cpus available -// to make the snapshot deterministic `os.cpus` needs to be mocked -// but the other members on `os` must remain untouched -jest.mock('os', () => { - const os = jest.requireActual('os'); - os.cpus = () => [{}, {}, {}, {}]; - return os; -}); - -// eslint-disable-next-line jest/valid-describe -const describeWithContext = describe.each([ - [{ dev: false, dist: false }], - [{ dev: true, dist: false }], - [{ dev: false, dist: true }], - [{ dev: true, dist: true }], -]); - -describeWithContext('config schema with context %j', context => { - it('produces correct config', async () => { - const schema = await getConfigSchema(reporting); - const value: any = await schema.validate({}, { context }); - value.capture.browser.chromium.disableSandbox = ''; - await expect(value).toMatchSnapshot(); - }); -}); diff --git a/x-pack/legacy/plugins/reporting/index.ts b/x-pack/legacy/plugins/reporting/index.ts index a5d27d0545da1..fb95e2c2edc24 100644 --- a/x-pack/legacy/plugins/reporting/index.ts +++ b/x-pack/legacy/plugins/reporting/index.ts @@ -8,7 +8,6 @@ import { i18n } from '@kbn/i18n'; import { Legacy } from 'kibana'; import { resolve } from 'path'; import { PLUGIN_ID, UI_SETTINGS_CUSTOM_PDF_LOGO } from './common/constants'; -import { config as reportingConfig } from './config'; import { legacyInit } from './server/legacy'; import { ReportingPluginSpecOptions } from './types'; @@ -17,10 +16,8 @@ const kbToBase64Length = (kb: number) => Math.floor((kb * 1024 * 8) / 6); export const reporting = (kibana: any) => { return new kibana.Plugin({ id: PLUGIN_ID, - configPrefix: 'xpack.reporting', publicDir: resolve(__dirname, 'public'), require: ['kibana', 'elasticsearch', 'xpack_main'], - config: reportingConfig, uiExports: { uiSettingDefaults: { @@ -47,14 +44,5 @@ export const reporting = (kibana: any) => { async init(server: Legacy.Server) { return legacyInit(server, this); }, - - deprecations({ unused }: any) { - return [ - unused('capture.concurrency'), - unused('capture.timeout'), - unused('capture.settleTime'), - unused('kibanaApp'), - ]; - }, } as ReportingPluginSpecOptions); }; diff --git a/x-pack/legacy/plugins/reporting/log_configuration.ts b/x-pack/legacy/plugins/reporting/log_configuration.ts deleted file mode 100644 index 7aaed2038bd52..0000000000000 --- a/x-pack/legacy/plugins/reporting/log_configuration.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import getosSync, { LinuxOs } from 'getos'; -import { promisify } from 'util'; -import { BROWSER_TYPE } from './common/constants'; -import { CaptureConfig } from './server/types'; -import { Logger } from './types'; - -const getos = promisify(getosSync); - -export async function logConfiguration(captureConfig: CaptureConfig, logger: Logger) { - const { - browser: { - type: browserType, - chromium: { disableSandbox }, - }, - } = captureConfig; - - logger.debug(`Browser type: ${browserType}`); - if (browserType === BROWSER_TYPE) { - logger.debug(`Chromium sandbox disabled: ${disableSandbox}`); - } - - const os = await getos(); - const { os: osName, dist, release } = os as LinuxOs; - if (dist) { - logger.debug(`Running on os "${osName}", distribution "${dist}", release "${release}"`); - } else { - logger.debug(`Running on os "${osName}"`); - } -} diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts index a2f7a1f3ad0da..928f3b8377809 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver_factory/args.ts @@ -10,7 +10,7 @@ type ViewportConfig = CaptureConfig['viewport']; type BrowserConfig = CaptureConfig['browser']['chromium']; interface LaunchArgs { - userDataDir: BrowserConfig['userDataDir']; + userDataDir: string; viewport: ViewportConfig; disableSandbox: BrowserConfig['disableSandbox']; proxy: BrowserConfig['proxy']; diff --git a/x-pack/legacy/plugins/reporting/server/browsers/index.ts b/x-pack/legacy/plugins/reporting/server/browsers/index.ts index 1e42e2736962e..7f902c84308f6 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/index.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/index.ts @@ -8,7 +8,6 @@ import * as chromiumDefinition from './chromium'; export { ensureAllBrowsersDownloaded } from './download'; export { createBrowserDriverFactory } from './create_browser_driver_factory'; -export { getDefaultChromiumSandboxDisabled } from './default_chromium_sandbox_disabled'; export { HeadlessChromiumDriver } from './chromium/driver'; export { HeadlessChromiumDriverFactory } from './chromium/driver_factory'; diff --git a/x-pack/legacy/plugins/reporting/server/config/config.js b/x-pack/legacy/plugins/reporting/server/config/config.js deleted file mode 100644 index 08e4db464b003..0000000000000 --- a/x-pack/legacy/plugins/reporting/server/config/config.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { cpus } from 'os'; - -const defaultCPUCount = 2; - -function cpuCount() { - try { - return cpus().length; - } catch (e) { - return defaultCPUCount; - } -} - -export const config = { - concurrency: cpuCount(), -}; diff --git a/x-pack/legacy/plugins/reporting/server/config/index.ts b/x-pack/legacy/plugins/reporting/server/config/index.ts index b7b67b57932eb..c6b915be3a94a 100644 --- a/x-pack/legacy/plugins/reporting/server/config/index.ts +++ b/x-pack/legacy/plugins/reporting/server/config/index.ts @@ -6,10 +6,9 @@ import { Legacy } from 'kibana'; import { CoreSetup } from 'src/core/server'; -import { i18n } from '@kbn/i18n'; -import crypto from 'crypto'; import { get } from 'lodash'; -import { NetworkPolicy } from '../../types'; +import { ConfigType as ReportingConfigType } from '../../../../../plugins/reporting/server'; +export { ReportingConfigType }; // make config.get() aware of the value type it returns interface Config { @@ -56,131 +55,6 @@ export interface ReportingConfig extends Config { kbnConfig: Config; } -type BrowserType = 'chromium'; - -interface BrowserConfig { - inspect: boolean; - userDataDir: string; - viewport: { width: number; height: number }; - disableSandbox: boolean; - proxy: { - enabled: boolean; - server?: string; - bypass?: string[]; - }; -} - -interface CaptureConfig { - browser: { - type: BrowserType; - autoDownload: boolean; - chromium: BrowserConfig; - }; - maxAttempts: number; - networkPolicy: NetworkPolicy; - loadDelay: number; - timeouts: { - openUrl: number; - waitForElements: number; - renderComplete: number; - }; - viewport: any; - zoom: any; -} - -interface QueueConfig { - indexInterval: string; - pollEnabled: boolean; - pollInterval: number; - pollIntervalErrorMultiplier: number; - timeout: number; -} - -interface ScrollConfig { - duration: string; - size: number; -} - -export interface ReportingConfigType { - capture: CaptureConfig; - csv: { - scroll: ScrollConfig; - enablePanelActionDownload: boolean; - checkForFormulas: boolean; - maxSizeBytes: number; - useByteOrderMarkEncoding: boolean; - }; - encryptionKey: string; - kibanaServer: any; - index: string; - queue: QueueConfig; - roles: any; -} - -const addConfigDefaults = ( - server: Legacy.Server, - core: CoreSetup, - baseConfig: ReportingConfigType -) => { - // encryption key - let encryptionKey = baseConfig.encryptionKey; - if (encryptionKey === undefined) { - server.log( - ['reporting', 'config', 'warning'], - i18n.translate('xpack.reporting.selfCheckEncryptionKey.warning', { - defaultMessage: - `Generating a random key for {setting}. To prevent pending reports ` + - `from failing on restart, please set {setting} in kibana.yml`, - values: { - setting: 'xpack.reporting.encryptionKey', - }, - }) - ); - encryptionKey = crypto.randomBytes(16).toString('hex'); - } - - const { kibanaServer: reportingServer } = baseConfig; - const serverInfo = core.http.getServerInfo(); - - // kibanaServer.hostname, default to server.host, don't allow "0" - let kibanaServerHostname = reportingServer.hostname ? reportingServer.hostname : serverInfo.host; - if (kibanaServerHostname === '0') { - server.log( - ['reporting', 'config', 'warning'], - i18n.translate('xpack.reporting.selfCheckHostname.warning', { - defaultMessage: - `Found 'server.host: "0"' in settings. This is incompatible with Reporting. ` + - `To enable Reporting to work, '{setting}: 0.0.0.0' is being automatically to the configuration. ` + - `You can change to 'server.host: 0.0.0.0' or add '{setting}: 0.0.0.0' in kibana.yml to prevent this message.`, - values: { - setting: 'xpack.reporting.kibanaServer.hostname', - }, - }) - ); - kibanaServerHostname = '0.0.0.0'; - } - - // kibanaServer.port, default to server.port - const kibanaServerPort = reportingServer.port - ? reportingServer.port - : serverInfo.port; // prettier-ignore - - // kibanaServer.protocol, default to server.protocol - const kibanaServerProtocol = reportingServer.protocol - ? reportingServer.protocol - : serverInfo.protocol; - - return { - ...baseConfig, - encryptionKey, - kibanaServer: { - hostname: kibanaServerHostname, - port: kibanaServerPort, - protocol: kibanaServerProtocol, - }, - }; -}; - export const buildConfig = ( core: CoreSetup, server: Legacy.Server, @@ -204,10 +78,8 @@ export const buildConfig = ( }, }; - // spreading arguments as an array allows the return type to be known by the compiler - reportingConfig = addConfigDefaults(server, core, reportingConfig); return { - get: (...keys: string[]) => get(reportingConfig, keys.join('.'), null), + get: (...keys: string[]) => get(reportingConfig, keys.join('.'), null), // spreading arguments as an array allows the return type to be known by the compiler kbnConfig: { get: (...keys: string[]) => get(kbnConfig, keys.join('.'), null), }, diff --git a/x-pack/legacy/plugins/reporting/server/legacy.ts b/x-pack/legacy/plugins/reporting/server/legacy.ts index 679b42aca6de5..d044dc866ed0e 100644 --- a/x-pack/legacy/plugins/reporting/server/legacy.ts +++ b/x-pack/legacy/plugins/reporting/server/legacy.ts @@ -5,7 +5,9 @@ */ import { Legacy } from 'kibana'; +import { take } from 'rxjs/operators'; import { PluginInitializerContext } from 'src/core/server'; +import { PluginsSetup } from '../../../../plugins/reporting/server'; import { SecurityPluginSetup } from '../../../../plugins/security/server'; import { ReportingPluginSpecOptions } from '../types'; import { buildConfig } from './config'; @@ -17,7 +19,6 @@ const buildLegacyDependencies = ( reportingPlugin: ReportingPluginSpecOptions ): LegacySetup => ({ route: server.route.bind(server), - config: server.config, plugins: { xpack_main: server.plugins.xpack_main, reporting: reportingPlugin, @@ -32,14 +33,13 @@ export const legacyInit = async ( reportingLegacyPlugin: ReportingPluginSpecOptions ) => { const { core: coreSetup } = server.newPlatform.setup; - const legacyConfig = server.config(); - const reportingConfig = buildConfig(coreSetup, server, legacyConfig.get('xpack.reporting')); - + const { config$ } = (server.newPlatform.setup.plugins.reporting as PluginsSetup).__legacy; + const reportingConfig = await config$.pipe(take(1)).toPromise(); const __LEGACY = buildLegacyDependencies(server, reportingLegacyPlugin); const pluginInstance = plugin( server.newPlatform.coreContext as PluginInitializerContext, - reportingConfig + buildConfig(coreSetup, server, reportingConfig) ); await pluginInstance.setup(coreSetup, { elasticsearch: coreSetup.elasticsearch, diff --git a/x-pack/legacy/plugins/reporting/server/lib/esqueue/helpers/index_timestamp.js b/x-pack/legacy/plugins/reporting/server/lib/esqueue/helpers/index_timestamp.js index 6cdbe8f968f75..ceb4ef43b2d9d 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/esqueue/helpers/index_timestamp.js +++ b/x-pack/legacy/plugins/reporting/server/lib/esqueue/helpers/index_timestamp.js @@ -8,6 +8,7 @@ import moment from 'moment'; export const intervals = ['year', 'month', 'week', 'day', 'hour', 'minute']; +// TODO: This helper function can be removed by using `schema.duration` objects in the reporting config schema export function indexTimestamp(intervalStr, separator = '-') { if (separator.match(/[a-z]/i)) throw new Error('Interval separator can not be a letter'); diff --git a/x-pack/legacy/plugins/reporting/server/plugin.ts b/x-pack/legacy/plugins/reporting/server/plugin.ts index c9ed2e81c6792..e0fa99106a93e 100644 --- a/x-pack/legacy/plugins/reporting/server/plugin.ts +++ b/x-pack/legacy/plugins/reporting/server/plugin.ts @@ -5,15 +5,12 @@ */ import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/server'; -import { logConfiguration } from '../log_configuration'; import { createBrowserDriverFactory } from './browsers'; import { ReportingCore, ReportingConfig } from './core'; import { createQueueFactory, enqueueJobFactory, LevelLogger, runValidations } from './lib'; import { setFieldFormats } from './services'; import { ReportingSetup, ReportingSetupDeps, ReportingStart, ReportingStartDeps } from './types'; import { registerReportingUsageCollector } from './usage'; -// @ts-ignore no module definition -import { mirrorPluginStatus } from '../../../server/lib/mirror_plugin_status'; export class ReportingPlugin implements Plugin { @@ -61,8 +58,6 @@ export class ReportingPlugin setFieldFormats(plugins.data.fieldFormats); - logConfiguration(this.config.get('capture'), this.logger); - return {}; } diff --git a/x-pack/legacy/plugins/reporting/server/types.d.ts b/x-pack/legacy/plugins/reporting/server/types.d.ts index bec00688432cc..fb77eae4e7eea 100644 --- a/x-pack/legacy/plugins/reporting/server/types.d.ts +++ b/x-pack/legacy/plugins/reporting/server/types.d.ts @@ -11,7 +11,7 @@ import { PluginStart as DataPluginStart } from '../../../../../src/plugins/data/ import { SecurityPluginSetup } from '../../../../plugins/security/server'; import { XPackMainPlugin } from '../../xpack_main/server/xpack_main'; import { ReportingPluginSpecOptions } from '../types'; -import { ReportingConfig, ReportingConfigType } from './core'; +import { ReportingConfigType } from './core'; export interface ReportingSetupDeps { elasticsearch: ElasticsearchServiceSetup; @@ -30,7 +30,6 @@ export type ReportingSetup = object; export type ReportingStart = object; export interface LegacySetup { - config: Legacy.Server['config']; plugins: { xpack_main: XPackMainPlugin & { status?: any; diff --git a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_reportingplugin.ts b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_reportingplugin.ts index 34ff91d1972a0..ec00023b4d449 100644 --- a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_reportingplugin.ts +++ b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_reportingplugin.ts @@ -11,7 +11,6 @@ jest.mock('../server/browsers'); jest.mock('../server/lib/create_queue'); jest.mock('../server/lib/enqueue_job'); jest.mock('../server/lib/validate'); -jest.mock('../log_configuration'); import { EventEmitter } from 'events'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths diff --git a/x-pack/plugins/reporting/config.ts b/x-pack/plugins/reporting/config.ts deleted file mode 100644 index f1d6b1a8f248f..0000000000000 --- a/x-pack/plugins/reporting/config.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export const reportingPollConfig = { - jobCompletionNotifier: { interval: 10000, intervalErrorMultiplier: 5 }, - jobsRefresh: { interval: 5000, intervalErrorMultiplier: 5 }, -}; diff --git a/x-pack/plugins/reporting/kibana.json b/x-pack/plugins/reporting/kibana.json index 3da2d2a094706..d068711b87c9d 100644 --- a/x-pack/plugins/reporting/kibana.json +++ b/x-pack/plugins/reporting/kibana.json @@ -2,6 +2,9 @@ "id": "reporting", "version": "8.0.0", "kibanaVersion": "kibana", + "optionalPlugins": [ + "usageCollection" + ], "configPath": ["xpack", "reporting"], "requiredPlugins": [ "home", @@ -12,6 +15,6 @@ "share", "kibanaLegacy" ], - "server": false, + "server": true, "ui": true } diff --git a/x-pack/plugins/reporting/server/config/create_config.test.ts b/x-pack/plugins/reporting/server/config/create_config.test.ts new file mode 100644 index 0000000000000..3107866be6496 --- /dev/null +++ b/x-pack/plugins/reporting/server/config/create_config.test.ts @@ -0,0 +1,165 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as Rx from 'rxjs'; +import { CoreSetup, Logger, PluginInitializerContext } from 'src/core/server'; +import { ConfigType as ReportingConfigType } from './schema'; +import { createConfig$ } from './create_config'; + +interface KibanaServer { + host?: string; + port?: number; + protocol?: string; +} + +const makeMockInitContext = (config: { + capture?: Partial; + encryptionKey?: string; + kibanaServer: Partial; +}): PluginInitializerContext => + ({ + config: { + create: () => + Rx.of({ + ...config, + capture: config.capture || { browser: { chromium: { disableSandbox: false } } }, + kibanaServer: config.kibanaServer || {}, + }), + }, + } as PluginInitializerContext); + +const makeMockCoreSetup = (serverInfo: KibanaServer): CoreSetup => + ({ http: { getServerInfo: () => serverInfo } } as any); + +describe('Reporting server createConfig$', () => { + let mockCoreSetup: CoreSetup; + let mockInitContext: PluginInitializerContext; + let mockLogger: Logger; + + beforeEach(() => { + mockCoreSetup = makeMockCoreSetup({ host: 'kibanaHost', port: 5601, protocol: 'http' }); + mockInitContext = makeMockInitContext({ + kibanaServer: {}, + }); + mockLogger = ({ warn: jest.fn(), debug: jest.fn() } as unknown) as Logger; + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('creates random encryption key and default config using host, protocol, and port from server info', async () => { + const result = await createConfig$(mockCoreSetup, mockInitContext, mockLogger).toPromise(); + + expect(result.encryptionKey).toMatch(/\S{32,}/); // random 32 characters + expect(result.kibanaServer).toMatchInlineSnapshot(` + Object { + "hostname": "kibanaHost", + "port": 5601, + "protocol": "http", + } + `); + expect((mockLogger.warn as any).mock.calls.length).toBe(1); + expect((mockLogger.warn as any).mock.calls[0]).toMatchObject([ + 'Generating a random key for xpack.reporting.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.reporting.encryptionKey in kibana.yml', + ]); + }); + + it('uses the user-provided encryption key', async () => { + mockInitContext = makeMockInitContext({ + encryptionKey: 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii', + kibanaServer: {}, + }); + const result = await createConfig$(mockCoreSetup, mockInitContext, mockLogger).toPromise(); + + expect(result.encryptionKey).toMatch('iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii'); + expect((mockLogger.warn as any).mock.calls.length).toBe(0); + }); + + it('uses the user-provided encryption key, reporting kibanaServer settings to override server info', async () => { + mockInitContext = makeMockInitContext({ + encryptionKey: 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii', + kibanaServer: { + hostname: 'reportingHost', + port: 5677, + protocol: 'httpsa', + }, + }); + const result = await createConfig$(mockCoreSetup, mockInitContext, mockLogger).toPromise(); + + expect(result).toMatchInlineSnapshot(` + Object { + "capture": Object { + "browser": Object { + "chromium": Object { + "disableSandbox": false, + }, + }, + }, + "encryptionKey": "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", + "kibanaServer": Object { + "hostname": "reportingHost", + "port": 5677, + "protocol": "httpsa", + }, + } + `); + expect((mockLogger.warn as any).mock.calls.length).toBe(0); + }); + + it('show warning when kibanaServer.hostName === "0"', async () => { + mockInitContext = makeMockInitContext({ + encryptionKey: 'aaaaaaaaaaaaabbbbbbbbbbbbaaaaaaaaa', + kibanaServer: { hostname: '0' }, + }); + const result = await createConfig$(mockCoreSetup, mockInitContext, mockLogger).toPromise(); + + expect(result.kibanaServer).toMatchInlineSnapshot(` + Object { + "hostname": "0.0.0.0", + "port": 5601, + "protocol": "http", + } + `); + expect((mockLogger.warn as any).mock.calls.length).toBe(1); + expect((mockLogger.warn as any).mock.calls[0]).toMatchObject([ + `Found 'server.host: \"0\"' in Kibana configuration. This is incompatible with Reporting. To enable Reporting to work, 'xpack.reporting.kibanaServer.hostname: 0.0.0.0' is being automatically ` + + `to the configuration. You can change the setting to 'server.host: 0.0.0.0' or add 'xpack.reporting.kibanaServer.hostname: 0.0.0.0' in kibana.yml to prevent this message.`, + ]); + }); + + it('uses user-provided disableSandbox: false', async () => { + mockInitContext = makeMockInitContext({ + encryptionKey: '888888888888888888888888888888888', + capture: { browser: { chromium: { disableSandbox: false } } }, + } as ReportingConfigType); + const result = await createConfig$(mockCoreSetup, mockInitContext, mockLogger).toPromise(); + + expect(result.capture.browser.chromium).toMatchObject({ disableSandbox: false }); + expect((mockLogger.warn as any).mock.calls.length).toBe(0); + }); + + it('uses user-provided disableSandbox: true', async () => { + mockInitContext = makeMockInitContext({ + encryptionKey: '888888888888888888888888888888888', + capture: { browser: { chromium: { disableSandbox: true } } }, + } as ReportingConfigType); + const result = await createConfig$(mockCoreSetup, mockInitContext, mockLogger).toPromise(); + + expect(result.capture.browser.chromium).toMatchObject({ disableSandbox: true }); + expect((mockLogger.warn as any).mock.calls.length).toBe(0); + }); + + it('provides a default for disableSandbox', async () => { + mockInitContext = makeMockInitContext({ + encryptionKey: '888888888888888888888888888888888', + } as ReportingConfigType); + const result = await createConfig$(mockCoreSetup, mockInitContext, mockLogger).toPromise(); + + expect(result.capture.browser.chromium).toMatchObject({ disableSandbox: expect.any(Boolean) }); + expect((mockLogger.warn as any).mock.calls.length).toBe(0); + }); +}); diff --git a/x-pack/plugins/reporting/server/config/create_config.ts b/x-pack/plugins/reporting/server/config/create_config.ts new file mode 100644 index 0000000000000..1e6e8bbde5d27 --- /dev/null +++ b/x-pack/plugins/reporting/server/config/create_config.ts @@ -0,0 +1,124 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n/'; +import { TypeOf } from '@kbn/config-schema'; +import crypto from 'crypto'; +import { capitalize } from 'lodash'; +import { map, mergeMap } from 'rxjs/operators'; +import { CoreSetup, Logger, PluginInitializerContext } from 'src/core/server'; +import { getDefaultChromiumSandboxDisabled } from './default_chromium_sandbox_disabled'; +import { ConfigSchema } from './schema'; + +/* + * Set up dynamic config defaults + * - xpack.capture.browser.chromium.disableSandbox + * - xpack.kibanaServer + * - xpack.reporting.encryptionKey + */ +export function createConfig$(core: CoreSetup, context: PluginInitializerContext, logger: Logger) { + return context.config.create>().pipe( + map(config => { + // encryption key + let encryptionKey = config.encryptionKey; + if (encryptionKey === undefined) { + logger.warn( + i18n.translate('xpack.reporting.serverConfig.randomEncryptionKey', { + defaultMessage: + 'Generating a random key for xpack.reporting.encryptionKey. To prevent sessions from being invalidated on ' + + 'restart, please set xpack.reporting.encryptionKey in kibana.yml', + }) + ); + encryptionKey = crypto.randomBytes(16).toString('hex'); + } + const { kibanaServer: reportingServer } = config; + const serverInfo = core.http.getServerInfo(); + // kibanaServer.hostname, default to server.host, don't allow "0" + let kibanaServerHostname = reportingServer.hostname + ? reportingServer.hostname + : serverInfo.host; + if (kibanaServerHostname === '0') { + logger.warn( + i18n.translate('xpack.reporting.serverConfig.invalidServerHostname', { + defaultMessage: + `Found 'server.host: "0"' in Kibana configuration. This is incompatible with Reporting. ` + + `To enable Reporting to work, '{configKey}: 0.0.0.0' is being automatically to the configuration. ` + + `You can change the setting to 'server.host: 0.0.0.0' or add '{configKey}: 0.0.0.0' in kibana.yml to prevent this message.`, + values: { configKey: 'xpack.reporting.kibanaServer.hostname' }, + }) + ); + kibanaServerHostname = '0.0.0.0'; + } + // kibanaServer.port, default to server.port + const kibanaServerPort = reportingServer.port + ? reportingServer.port + : serverInfo.port; // prettier-ignore + // kibanaServer.protocol, default to server.protocol + const kibanaServerProtocol = reportingServer.protocol + ? reportingServer.protocol + : serverInfo.protocol; + return { + ...config, + encryptionKey, + kibanaServer: { + hostname: kibanaServerHostname, + port: kibanaServerPort, + protocol: kibanaServerProtocol, + }, + }; + }), + mergeMap(async config => { + if (config.capture.browser.chromium.disableSandbox != null) { + // disableSandbox was set by user + return config; + } + + // disableSandbox was not set by user, apply default for OS + const { os, disableSandbox } = await getDefaultChromiumSandboxDisabled(); + const osName = [os.os, os.dist, os.release] + .filter(Boolean) + .map(capitalize) + .join(' '); + + logger.debug( + i18n.translate('xpack.reporting.serverConfig.osDetected', { + defaultMessage: `Running on OS: '{osName}'`, + values: { osName }, + }) + ); + + if (disableSandbox === true) { + logger.warn( + i18n.translate('xpack.reporting.serverConfig.autoSet.sandboxDisabled', { + defaultMessage: `Chromium sandbox provides an additional layer of protection, but is not supported for {osName} OS. Automatically setting '{configKey}: true'.`, + values: { + configKey: 'xpack.reporting.capture.browser.chromium.disableSandbox', + osName, + }, + }) + ); + } else { + logger.info( + i18n.translate('xpack.reporting.serverConfig.autoSet.sandboxEnabled', { + defaultMessage: `Chromium sandbox provides an additional layer of protection, and is supported for {osName} OS. Automatically enabling Chromium sandbox.`, + values: { osName }, + }) + ); + } + + return { + ...config, + capture: { + ...config.capture, + browser: { + ...config.capture.browser, + chromium: { ...config.capture.browser.chromium, disableSandbox }, + }, + }, + }; + }) + ); +} diff --git a/x-pack/legacy/plugins/reporting/server/browsers/default_chromium_sandbox_disabled.test.js b/x-pack/plugins/reporting/server/config/default_chromium_sandbox_disabled.test.ts similarity index 82% rename from x-pack/legacy/plugins/reporting/server/browsers/default_chromium_sandbox_disabled.test.js rename to x-pack/plugins/reporting/server/config/default_chromium_sandbox_disabled.test.ts index a022506f9e2da..307c96bb34909 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/default_chromium_sandbox_disabled.test.js +++ b/x-pack/plugins/reporting/server/config/default_chromium_sandbox_disabled.test.ts @@ -11,11 +11,17 @@ jest.mock('getos', () => { import { getDefaultChromiumSandboxDisabled } from './default_chromium_sandbox_disabled'; import getos from 'getos'; -function defaultTest(os, expectedDefault) { +interface TestObject { + os: string; + dist?: string; + release?: string; +} + +function defaultTest(os: TestObject, expectedDefault: boolean) { test(`${expectedDefault ? 'disabled' : 'enabled'} on ${JSON.stringify(os)}`, async () => { - getos.mockImplementation(cb => cb(null, os)); + (getos as jest.Mock).mockImplementation(cb => cb(null, os)); const actualDefault = await getDefaultChromiumSandboxDisabled(); - expect(actualDefault).toBe(expectedDefault); + expect(actualDefault.disableSandbox).toBe(expectedDefault); }); } diff --git a/x-pack/legacy/plugins/reporting/server/browsers/default_chromium_sandbox_disabled.ts b/x-pack/plugins/reporting/server/config/default_chromium_sandbox_disabled.ts similarity index 80% rename from x-pack/legacy/plugins/reporting/server/browsers/default_chromium_sandbox_disabled.ts rename to x-pack/plugins/reporting/server/config/default_chromium_sandbox_disabled.ts index a21a4b33722ff..525041d5c772b 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/default_chromium_sandbox_disabled.ts +++ b/x-pack/plugins/reporting/server/config/default_chromium_sandbox_disabled.ts @@ -31,12 +31,17 @@ const distroSupportsUnprivilegedUsernamespaces = (distro: string) => { return true; }; -export async function getDefaultChromiumSandboxDisabled() { +interface OsSummary { + disableSandbox: boolean; + os: { os: string; dist?: string; release?: string }; +} + +export async function getDefaultChromiumSandboxDisabled(): Promise { const os = await getos(); if (os.os === 'linux' && !distroSupportsUnprivilegedUsernamespaces(os.dist)) { - return true; + return { os, disableSandbox: true }; } else { - return false; + return { os, disableSandbox: false }; } } diff --git a/x-pack/plugins/reporting/server/config/index.ts b/x-pack/plugins/reporting/server/config/index.ts new file mode 100644 index 0000000000000..f0a0a093aa8c0 --- /dev/null +++ b/x-pack/plugins/reporting/server/config/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PluginConfigDescriptor } from 'kibana/server'; +import { ConfigSchema, ConfigType } from './schema'; + +export { createConfig$ } from './create_config'; + +export const config: PluginConfigDescriptor = { + schema: ConfigSchema, + deprecations: ({ unused }) => [ + unused('capture.browser.chromium.maxScreenshotDimension'), + unused('capture.concurrency'), + unused('capture.settleTime'), + unused('capture.timeout'), + unused('kibanaApp'), + ], +}; + +export { ConfigSchema, ConfigType }; diff --git a/x-pack/plugins/reporting/server/config/schema.test.ts b/x-pack/plugins/reporting/server/config/schema.test.ts new file mode 100644 index 0000000000000..41285c2bfa133 --- /dev/null +++ b/x-pack/plugins/reporting/server/config/schema.test.ts @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ConfigSchema } from './schema'; + +describe('Reporting Config Schema', () => { + it(`context {"dev":false,"dist":false} produces correct config`, () => { + expect(ConfigSchema.validate({}, { dev: false, dist: false })).toMatchObject({ + capture: { + browser: { + autoDownload: true, + chromium: { proxy: { enabled: false } }, + type: 'chromium', + }, + loadDelay: 3000, + maxAttempts: 1, + networkPolicy: { + enabled: true, + rules: [ + { allow: true, host: undefined, protocol: 'http:' }, + { allow: true, host: undefined, protocol: 'https:' }, + { allow: true, host: undefined, protocol: 'ws:' }, + { allow: true, host: undefined, protocol: 'wss:' }, + { allow: true, host: undefined, protocol: 'data:' }, + { allow: false, host: undefined, protocol: undefined }, + ], + }, + viewport: { height: 1200, width: 1950 }, + zoom: 2, + }, + csv: { + checkForFormulas: true, + enablePanelActionDownload: true, + maxSizeBytes: 10485760, + scroll: { duration: '30s', size: 500 }, + }, + encryptionKey: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + index: '.reporting', + kibanaServer: {}, + poll: { + jobCompletionNotifier: { interval: 10000, intervalErrorMultiplier: 5 }, + jobsRefresh: { interval: 5000, intervalErrorMultiplier: 5 }, + }, + queue: { + indexInterval: 'week', + pollEnabled: true, + pollInterval: 3000, + pollIntervalErrorMultiplier: 10, + timeout: 120000, + }, + roles: { allow: ['reporting_user'] }, + }); + }); + + it(`context {"dev":false,"dist":true} produces correct config`, () => { + expect(ConfigSchema.validate({}, { dev: false, dist: true })).toMatchObject({ + capture: { + browser: { + autoDownload: false, + chromium: { + inspect: false, + proxy: { enabled: false }, + }, + type: 'chromium', + }, + loadDelay: 3000, + maxAttempts: 3, + networkPolicy: { + enabled: true, + rules: [ + { allow: true, host: undefined, protocol: 'http:' }, + { allow: true, host: undefined, protocol: 'https:' }, + { allow: true, host: undefined, protocol: 'ws:' }, + { allow: true, host: undefined, protocol: 'wss:' }, + { allow: true, host: undefined, protocol: 'data:' }, + { allow: false, host: undefined, protocol: undefined }, + ], + }, + viewport: { height: 1200, width: 1950 }, + zoom: 2, + }, + csv: { + checkForFormulas: true, + enablePanelActionDownload: true, + maxSizeBytes: 10485760, + scroll: { duration: '30s', size: 500 }, + }, + index: '.reporting', + kibanaServer: {}, + poll: { + jobCompletionNotifier: { interval: 10000, intervalErrorMultiplier: 5 }, + jobsRefresh: { interval: 5000, intervalErrorMultiplier: 5 }, + }, + queue: { + indexInterval: 'week', + pollEnabled: true, + pollInterval: 3000, + pollIntervalErrorMultiplier: 10, + timeout: 120000, + }, + roles: { allow: ['reporting_user'] }, + }); + }); + + it(`allows optional settings`, () => { + // encryption key + expect( + ConfigSchema.validate({ encryptionKey: 'qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' }) + .encryptionKey + ).toBe('qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'); + + // disableSandbox + expect( + ConfigSchema.validate({ capture: { browser: { chromium: { disableSandbox: true } } } }) + .capture.browser.chromium + ).toMatchObject({ disableSandbox: true, proxy: { enabled: false } }); + + // kibanaServer + expect( + ConfigSchema.validate({ kibanaServer: { hostname: 'Frodo' } }).kibanaServer + ).toMatchObject({ hostname: 'Frodo' }); + }); + + it(`logs the proper validation messages`, () => { + // kibanaServer + const throwValidationErr = () => ConfigSchema.validate({ kibanaServer: { hostname: '0' } }); + expect(throwValidationErr).toThrowError( + `[kibanaServer.hostname]: must not be "0" for the headless browser to correctly resolve the host` + ); + }); +}); diff --git a/x-pack/plugins/reporting/server/config/schema.ts b/x-pack/plugins/reporting/server/config/schema.ts new file mode 100644 index 0000000000000..67d70c1513c15 --- /dev/null +++ b/x-pack/plugins/reporting/server/config/schema.ts @@ -0,0 +1,174 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import moment from 'moment'; + +const KibanaServerSchema = schema.object({ + hostname: schema.maybe( + schema.string({ + validate(value) { + if (value === '0') { + return 'must not be "0" for the headless browser to correctly resolve the host'; + } + }, + hostname: true, + }) + ), + port: schema.maybe(schema.number()), + protocol: schema.maybe( + schema.string({ + validate(value) { + if (!/^https?$/.test(value)) { + return 'must be "http" or "https"'; + } + }, + }) + ), +}); // default values are all dynamic in createConfig$ + +const QueueSchema = schema.object({ + indexInterval: schema.string({ defaultValue: 'week' }), + pollEnabled: schema.boolean({ defaultValue: true }), + pollInterval: schema.number({ defaultValue: 3000 }), + pollIntervalErrorMultiplier: schema.number({ defaultValue: 10 }), + timeout: schema.number({ defaultValue: moment.duration(2, 'm').asMilliseconds() }), +}); + +const RulesSchema = schema.object({ + allow: schema.boolean(), + host: schema.maybe(schema.string()), + protocol: schema.maybe(schema.string()), +}); + +const CaptureSchema = schema.object({ + timeouts: schema.object({ + openUrl: schema.number({ defaultValue: 30000 }), + waitForElements: schema.number({ defaultValue: 30000 }), + renderComplete: schema.number({ defaultValue: 30000 }), + }), + networkPolicy: schema.object({ + enabled: schema.boolean({ defaultValue: true }), + rules: schema.arrayOf(RulesSchema, { + defaultValue: [ + { host: undefined, allow: true, protocol: 'http:' }, + { host: undefined, allow: true, protocol: 'https:' }, + { host: undefined, allow: true, protocol: 'ws:' }, + { host: undefined, allow: true, protocol: 'wss:' }, + { host: undefined, allow: true, protocol: 'data:' }, + { host: undefined, allow: false, protocol: undefined }, // Default action is to deny! + ], + }), + }), + zoom: schema.number({ defaultValue: 2 }), + viewport: schema.object({ + width: schema.number({ defaultValue: 1950 }), + height: schema.number({ defaultValue: 1200 }), + }), + loadDelay: schema.number({ + defaultValue: moment.duration(3, 's').asMilliseconds(), + }), // TODO: use schema.duration + browser: schema.object({ + autoDownload: schema.conditional( + schema.contextRef('dist'), + true, + schema.boolean({ defaultValue: false }), + schema.boolean({ defaultValue: true }) + ), + chromium: schema.object({ + inspect: schema.conditional( + schema.contextRef('dist'), + true, + schema.boolean({ defaultValue: false }), + schema.maybe(schema.never()) + ), + disableSandbox: schema.maybe(schema.boolean()), // default value is dynamic in createConfig$ + proxy: schema.object({ + enabled: schema.boolean({ defaultValue: false }), + server: schema.conditional( + schema.siblingRef('enabled'), + true, + schema.uri({ scheme: ['http', 'https'] }), + schema.maybe(schema.never()) + ), + bypass: schema.conditional( + schema.siblingRef('enabled'), + true, + schema.arrayOf(schema.string({ hostname: true })), + schema.maybe(schema.never()) + ), + }), + }), + type: schema.string({ defaultValue: 'chromium' }), + }), + maxAttempts: schema.conditional( + schema.contextRef('dist'), + true, + schema.number({ defaultValue: 3 }), + schema.number({ defaultValue: 1 }) + ), +}); + +const CsvSchema = schema.object({ + checkForFormulas: schema.boolean({ defaultValue: true }), + enablePanelActionDownload: schema.boolean({ defaultValue: true }), + maxSizeBytes: schema.number({ + defaultValue: 1024 * 1024 * 10, // 10MB + }), // TODO: use schema.byteSize + useByteOrderMarkEncoding: schema.boolean({ defaultValue: false }), + scroll: schema.object({ + duration: schema.string({ + defaultValue: '30s', + validate(value) { + if (!/^[0-9]+(d|h|m|s|ms|micros|nanos)$/.test(value)) { + return 'must be a duration string'; + } + }, + }), + size: schema.number({ defaultValue: 500 }), + }), +}); + +const EncryptionKeySchema = schema.conditional( + schema.contextRef('dist'), + true, + schema.maybe(schema.string({ minLength: 32 })), // default value is dynamic in createConfig$ + schema.string({ minLength: 32, defaultValue: 'a'.repeat(32) }) +); + +const RolesSchema = schema.object({ + allow: schema.arrayOf(schema.string(), { defaultValue: ['reporting_user'] }), +}); + +const IndexSchema = schema.string({ defaultValue: '.reporting' }); + +const PollSchema = schema.object({ + jobCompletionNotifier: schema.object({ + interval: schema.number({ + defaultValue: moment.duration(10, 's').asMilliseconds(), + }), // TODO: use schema.duration + intervalErrorMultiplier: schema.number({ defaultValue: 5 }), + }), + jobsRefresh: schema.object({ + interval: schema.number({ + defaultValue: moment.duration(5, 's').asMilliseconds(), + }), // TODO: use schema.duration + intervalErrorMultiplier: schema.number({ defaultValue: 5 }), + }), +}); + +export const ConfigSchema = schema.object({ + kibanaServer: KibanaServerSchema, + queue: QueueSchema, + capture: CaptureSchema, + csv: CsvSchema, + encryptionKey: EncryptionKeySchema, + roles: RolesSchema, + index: IndexSchema, + poll: PollSchema, +}); + +export type ConfigType = TypeOf; diff --git a/x-pack/plugins/reporting/server/index.ts b/x-pack/plugins/reporting/server/index.ts new file mode 100644 index 0000000000000..2b1844cf2e10e --- /dev/null +++ b/x-pack/plugins/reporting/server/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PluginInitializerContext } from 'src/core/server'; +import { ReportingPlugin } from './plugin'; + +export { config, ConfigSchema } from './config'; +export { ConfigType, PluginsSetup } from './plugin'; + +export const plugin = (initializerContext: PluginInitializerContext) => + new ReportingPlugin(initializerContext); diff --git a/x-pack/plugins/reporting/server/plugin.ts b/x-pack/plugins/reporting/server/plugin.ts new file mode 100644 index 0000000000000..905ed2b237c86 --- /dev/null +++ b/x-pack/plugins/reporting/server/plugin.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; +import { CoreSetup, Logger, Plugin, PluginInitializerContext } from 'src/core/server'; +import { ConfigType, createConfig$ } from './config'; + +export interface PluginsSetup { + /** @deprecated */ + __legacy: { + config$: Observable; + }; +} + +export class ReportingPlugin implements Plugin { + private readonly log: Logger; + + constructor(private readonly initializerContext: PluginInitializerContext) { + this.log = this.initializerContext.logger.get(); + } + + public async setup(core: CoreSetup): Promise { + return { + __legacy: { + config$: createConfig$(core, this.initializerContext, this.log).pipe(first()), + }, + }; + } + + public start() {} + public stop() {} +} + +export { ConfigType }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a5d2c20447ad5..8e4b74c4c08fd 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -12431,7 +12431,6 @@ "xpack.reporting.screenCapturePanelContent.optimizeForPrintingLabel": "印刷用に最適化", "xpack.reporting.selfCheck.ok": "レポートプラグイン自己チェックOK!", "xpack.reporting.selfCheck.warning": "レポートプラグイン自己チェックで警告が発生しました: {err}", - "xpack.reporting.selfCheckEncryptionKey.warning": "{setting}のランダムキーを生成しています。保留中のレポートの再開が失敗しないように、kibana.ymlで{setting}を設定してください", "xpack.reporting.shareContextMenu.csvReportsButtonLabel": "CSV レポート", "xpack.reporting.shareContextMenu.pdfReportsButtonLabel": "PDF レポート", "xpack.reporting.shareContextMenu.pngReportsButtonLabel": "PNG レポート", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index ef749e9218e11..4cf18fc287cc6 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -12435,7 +12435,6 @@ "xpack.reporting.screenCapturePanelContent.optimizeForPrintingLabel": "打印优化", "xpack.reporting.selfCheck.ok": "Reporting 插件自检正常!", "xpack.reporting.selfCheck.warning": "Reporting 插件自检生成警告:{err}", - "xpack.reporting.selfCheckEncryptionKey.warning": "正在为 {setting} 生成随机密钥。要防止待处理报告在重新启动时失败,请在 kibana.yml 中设置 {setting}", "xpack.reporting.shareContextMenu.csvReportsButtonLabel": "CSV 报告", "xpack.reporting.shareContextMenu.pdfReportsButtonLabel": "PDF 报告", "xpack.reporting.shareContextMenu.pngReportsButtonLabel": "PNG 报告", From 3d41ca6d276b982cdf1113fd293e6bbb876eea03 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Wed, 15 Apr 2020 17:00:56 -0700 Subject: [PATCH 40/80] [Reporting] Make usable default element positions (#63191) * [Reporting] Make usable default element posistions * revert unrelated changes * fix ts Co-authored-by: Elastic Machine --- .../export_types/common/layouts/layout.ts | 2 +- .../common/lib/screenshots/observable.test.ts | 184 +++++++++++++++++- .../common/lib/screenshots/observable.ts | 33 +++- .../common/lib/screenshots/types.ts | 1 + .../chromium/driver/chromium_driver.ts | 13 +- .../create_mock_browserdriverfactory.ts | 18 +- .../create_mock_layoutinstance.ts | 2 +- 7 files changed, 219 insertions(+), 34 deletions(-) diff --git a/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts b/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts index 2c43517dbcaa9..5cd2f3e636a93 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/layouts/layout.ts @@ -54,7 +54,7 @@ export abstract class Layout { public abstract getPdfPageSize(pageSizeParams: PageSizeParams): string | Size; - public abstract getViewport(itemsCount: number): ViewZoomWidthHeight; + public abstract getViewport(itemsCount: number): ViewZoomWidthHeight | null; public abstract getBrowserZoom(): number; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts index 75ac3dca4ffa0..68d660257a56d 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.test.ts @@ -22,6 +22,7 @@ import { LevelLogger } from '../../../../server/lib'; import { createMockBrowserDriverFactory, createMockLayoutInstance } from '../../../../test_helpers'; import { ConditionalHeaders, HeadlessChromiumDriver } from '../../../../types'; import { CaptureConfig } from '../../../../server/types'; +import * as contexts from './constants'; import { screenshotsObservableFactory } from './observable'; import { ElementsPositionAndAttribute } from './types'; @@ -57,10 +58,30 @@ describe('Screenshot Observable Pipeline', () => { expect(result).toMatchInlineSnapshot(` Array [ Object { + "elementsPositionAndAttributes": Array [ + Object { + "attributes": Object { + "description": "Default ", + "title": "Default Mock Title", + }, + "position": Object { + "boundingClientRect": Object { + "height": 600, + "left": 0, + "top": 0, + "width": 800, + }, + "scroll": Object { + "x": 0, + "y": 0, + }, + }, + }, + ], "error": undefined, "screenshots": Array [ Object { - "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", + "base64EncodedData": "allyourBase64", "description": "Default ", "title": "Default Mock Title", }, @@ -95,6 +116,26 @@ describe('Screenshot Observable Pipeline', () => { expect(result).toMatchInlineSnapshot(` Array [ Object { + "elementsPositionAndAttributes": Array [ + Object { + "attributes": Object { + "description": "Default ", + "title": "Default Mock Title", + }, + "position": Object { + "boundingClientRect": Object { + "height": 600, + "left": 0, + "top": 0, + "width": 800, + }, + "scroll": Object { + "x": 0, + "y": 0, + }, + }, + }, + ], "error": undefined, "screenshots": Array [ Object { @@ -106,6 +147,26 @@ describe('Screenshot Observable Pipeline', () => { "timeRange": "Default GetTimeRange Result", }, Object { + "elementsPositionAndAttributes": Array [ + Object { + "attributes": Object { + "description": "Default ", + "title": "Default Mock Title", + }, + "position": Object { + "boundingClientRect": Object { + "height": 600, + "left": 0, + "top": 0, + "width": 800, + }, + "scroll": Object { + "x": 0, + "y": 0, + }, + }, + }, + ], "error": undefined, "screenshots": Array [ Object { @@ -150,10 +211,27 @@ describe('Screenshot Observable Pipeline', () => { await expect(getScreenshot()).resolves.toMatchInlineSnapshot(` Array [ Object { + "elementsPositionAndAttributes": Array [ + Object { + "attributes": Object {}, + "position": Object { + "boundingClientRect": Object { + "height": 200, + "left": 0, + "top": 0, + "width": 200, + }, + "scroll": Object { + "x": 0, + "y": 0, + }, + }, + }, + ], "error": [Error: An error occurred when trying to read the page for visualization panel info. You may need to increase 'xpack.reporting.capture.timeouts.waitForElements'. Error: Mock error!], "screenshots": Array [ Object { - "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", + "base64EncodedData": "allyourBase64", "description": undefined, "title": undefined, }, @@ -161,10 +239,27 @@ describe('Screenshot Observable Pipeline', () => { "timeRange": null, }, Object { + "elementsPositionAndAttributes": Array [ + Object { + "attributes": Object {}, + "position": Object { + "boundingClientRect": Object { + "height": 200, + "left": 0, + "top": 0, + "width": 200, + }, + "scroll": Object { + "x": 0, + "y": 0, + }, + }, + }, + ], "error": [Error: An error occurred when trying to read the page for visualization panel info. You may need to increase 'xpack.reporting.capture.timeouts.waitForElements'. Error: Mock error!], "screenshots": Array [ Object { - "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", + "base64EncodedData": "allyourBase64", "description": undefined, "title": undefined, }, @@ -208,10 +303,27 @@ describe('Screenshot Observable Pipeline', () => { await expect(getScreenshot()).resolves.toMatchInlineSnapshot(` Array [ Object { + "elementsPositionAndAttributes": Array [ + Object { + "attributes": Object {}, + "position": Object { + "boundingClientRect": Object { + "height": 200, + "left": 0, + "top": 0, + "width": 200, + }, + "scroll": Object { + "x": 0, + "y": 0, + }, + }, + }, + ], "error": "Instant timeout has fired!", "screenshots": Array [ Object { - "base64EncodedData": "allyourBase64 of boundingClientRect,scroll", + "base64EncodedData": "allyourBase64", "description": undefined, "title": undefined, }, @@ -221,5 +333,69 @@ describe('Screenshot Observable Pipeline', () => { ] `); }); + + it(`uses defaults for element positions and size when Kibana page is not ready`, async () => { + // mocks + const mockBrowserEvaluate = jest.fn(); + mockBrowserEvaluate.mockImplementation(() => { + const lastCallIndex = mockBrowserEvaluate.mock.calls.length - 1; + const { context: mockCall } = mockBrowserEvaluate.mock.calls[lastCallIndex][1]; + + if (mockCall === contexts.CONTEXT_ELEMENTATTRIBUTES) { + return Promise.resolve(null); + } else { + return Promise.resolve(); + } + }); + mockBrowserDriverFactory = await createMockBrowserDriverFactory(logger, { + evaluate: mockBrowserEvaluate, + }); + mockLayout.getViewport = () => null; + + // test + const getScreenshots$ = screenshotsObservableFactory(mockConfig, mockBrowserDriverFactory); + const getScreenshot = async () => { + return await getScreenshots$({ + logger, + urls: ['/welcome/home/start/index.php3?page=./home.php3'], + conditionalHeaders: {} as ConditionalHeaders, + layout: mockLayout, + browserTimezone: 'UTC', + }).toPromise(); + }; + + await expect(getScreenshot()).resolves.toMatchInlineSnapshot(` + Array [ + Object { + "elementsPositionAndAttributes": Array [ + Object { + "attributes": Object {}, + "position": Object { + "boundingClientRect": Object { + "height": 1200, + "left": 0, + "top": 0, + "width": 1800, + }, + "scroll": Object { + "x": 0, + "y": 0, + }, + }, + }, + ], + "error": undefined, + "screenshots": Array [ + Object { + "base64EncodedData": "allyourBase64", + "description": undefined, + "title": undefined, + }, + ], + "timeRange": undefined, + }, + ] + `); + }); }); }); diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts index 53a11c18abd79..519a3289395b9 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts @@ -18,6 +18,9 @@ import { ScreenSetupData, ScreenshotObservableOpts, ScreenshotResults } from './ import { waitForRenderComplete } from './wait_for_render'; import { waitForVisualizations } from './wait_for_visualizations'; +const DEFAULT_SCREENSHOT_CLIP_HEIGHT = 1200; +const DEFAULT_SCREENSHOT_CLIP_WIDTH = 1800; + export function screenshotsObservableFactory( captureConfig: CaptureConfig, browserDriverFactory: HeadlessChromiumDriverFactory @@ -42,7 +45,7 @@ export function screenshotsObservableFactory( mergeMap(() => openUrl(captureConfig, driver, url, conditionalHeaders, logger)), mergeMap(() => getNumberOfItems(captureConfig, driver, layout, logger)), mergeMap(async itemsCount => { - const viewport = layout.getViewport(itemsCount); + const viewport = layout.getViewport(itemsCount) || getDefaultViewPort(); await Promise.all([ driver.setViewport(viewport, logger), waitForVisualizations(captureConfig, driver, itemsCount, layout, logger), @@ -83,7 +86,12 @@ export function screenshotsObservableFactory( : getDefaultElementPosition(layout.getViewport(1)); const screenshots = await getScreenshots(driver, elements, logger); const { timeRange, error: setupError } = data; - return { timeRange, screenshots, error: setupError }; + return { + timeRange, + screenshots, + error: setupError, + elementsPositionAndAttributes: elements, + }; } ) ); @@ -97,17 +105,30 @@ export function screenshotsObservableFactory( }; } +/* + * If Kibana is showing a non-HTML error message, the viewport might not be + * provided by the browser. + */ +const getDefaultViewPort = () => ({ + height: DEFAULT_SCREENSHOT_CLIP_HEIGHT, + width: DEFAULT_SCREENSHOT_CLIP_WIDTH, + zoom: 1, +}); /* * If an error happens setting up the page, we don't know if there actually * are any visualizations showing. These defaults should help capture the page * enough for the user to see the error themselves */ -const getDefaultElementPosition = ({ height, width }: { height: number; width: number }) => [ - { +const getDefaultElementPosition = (dimensions: { height?: number; width?: number } | null) => { + const height = dimensions?.height || DEFAULT_SCREENSHOT_CLIP_HEIGHT; + const width = dimensions?.width || DEFAULT_SCREENSHOT_CLIP_WIDTH; + + const defaultObject = { position: { boundingClientRect: { top: 0, left: 0, height, width }, scroll: { x: 0, y: 0 }, }, attributes: {}, - }, -]; + }; + return [defaultObject]; +}; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts index 76613c2d631d6..e113a5d228cd7 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts @@ -45,4 +45,5 @@ export interface ScreenshotResults { timeRange: TimeRange | null; screenshots: Screenshot[]; error?: Error; + elementsPositionAndAttributes?: ElementsPositionAndAttribute[]; // NOTE: for testing } diff --git a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts index 4b80e129c04da..dfaa87021c31c 100644 --- a/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts +++ b/x-pack/legacy/plugins/reporting/server/browsers/chromium/driver/chromium_driver.ts @@ -190,19 +190,14 @@ export class HeadlessChromiumDriver { } public async screenshot(elementPosition: ElementPosition): Promise { - let clip; - if (elementPosition) { - const { boundingClientRect, scroll = { x: 0, y: 0 } } = elementPosition; - clip = { + const { boundingClientRect, scroll } = elementPosition; + const screenshot = await this.page.screenshot({ + clip: { x: boundingClientRect.left + scroll.x, y: boundingClientRect.top + scroll.y, height: boundingClientRect.height, width: boundingClientRect.width, - }; - } - - const screenshot = await this.page.screenshot({ - clip, + }, }); return screenshot.toString('base64'); diff --git a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts index 6e95bed2ecf92..1be10f6a2056f 100644 --- a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts +++ b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_browserdriverfactory.ts @@ -34,7 +34,7 @@ const getMockElementsPositionAndAttributes = ( ): ElementsPositionAndAttribute[] => [ { position: { - boundingClientRect: { top: 0, left: 0, width: 10, height: 11 }, + boundingClientRect: { top: 0, left: 0, width: 800, height: 600 }, scroll: { x: 0, y: 0 }, }, attributes: { title, description }, @@ -78,7 +78,7 @@ mockBrowserEvaluate.mockImplementation(() => { }); const mockScreenshot = jest.fn(); mockScreenshot.mockImplementation((item: ElementsPositionAndAttribute) => { - return Promise.resolve(`allyourBase64 of ${Object.keys(item)}`); + return Promise.resolve(`allyourBase64`); }); const getCreatePage = (driver: HeadlessChromiumDriver) => jest.fn().mockImplementation(() => Rx.of({ driver, exit$: Rx.never() })); @@ -94,31 +94,23 @@ export const createMockBrowserDriverFactory = async ( logger: Logger, opts: Partial = {} ): Promise => { - const captureConfig = { + const captureConfig: CaptureConfig = { timeouts: { openUrl: 30000, waitForElements: 30000, renderComplete: 30000 }, browser: { type: 'chromium', chromium: { inspect: false, disableSandbox: false, - userDataDir: '/usr/data/dir', - viewport: { width: 12, height: 12 }, proxy: { enabled: false, server: undefined, bypass: undefined }, }, autoDownload: false, - inspect: true, - userDataDir: '/usr/data/dir', - viewport: { width: 12, height: 12 }, - disableSandbox: false, - proxy: { enabled: false, server: undefined, bypass: undefined }, - maxScreenshotDimension: undefined, }, networkPolicy: { enabled: true, rules: [] }, viewport: { width: 800, height: 600 }, loadDelay: 2000, - zoom: 1, + zoom: 2, maxAttempts: 1, - } as CaptureConfig; + }; const binaryPath = '/usr/local/share/common/secure/'; const mockBrowserDriverFactory = await createDriverFactory(binaryPath, logger, captureConfig); diff --git a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts index be60b56dcc0c1..81090e7616501 100644 --- a/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts +++ b/x-pack/legacy/plugins/reporting/test_helpers/create_mock_layoutinstance.ts @@ -12,7 +12,7 @@ import { CaptureConfig } from '../server/types'; export const createMockLayoutInstance = (captureConfig: CaptureConfig) => { const mockLayout = createLayout(captureConfig, { id: LayoutTypes.PRESERVE_LAYOUT, - dimensions: { height: 12, width: 12 }, + dimensions: { height: 100, width: 100 }, }) as LayoutInstance; mockLayout.selectors = { renderComplete: 'renderedSelector', From 31ed266d733d408052dbd5ad396ff28d62ea822a Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Thu, 16 Apr 2020 00:53:22 -0600 Subject: [PATCH 41/80] [SIEM] [Cases] Insert timeline and reporters/tags in table bug fixes (#63642) --- .../insert_timeline_popover/index.test.tsx | 3 +- .../insert_timeline_popover/index.tsx | 3 +- .../timeline/properties/helpers.tsx | 7 +++ .../case/use_get_reporters.test.tsx | 13 +++++ .../containers/case/use_get_tags.test.tsx | 24 +++++++-- .../public/containers/case/use_get_tags.tsx | 13 +++-- .../pages/case/components/all_cases/index.tsx | 31 +++++++++--- .../all_cases/table_filters.test.tsx | 50 +++++++++++++++++-- .../components/all_cases/table_filters.tsx | 29 +++++++++-- 9 files changed, 149 insertions(+), 24 deletions(-) diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.test.tsx index adac26a8ac92b..e63bce388ae80 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.test.tsx @@ -26,6 +26,7 @@ const mockLocationWithState = { state: { insertTimeline: { timelineId: 'timeline-id', + timelineSavedObjectId: '34578-3497-5893-47589-34759', timelineTitle: 'Timeline title', }, }, @@ -49,7 +50,7 @@ describe('Insert timeline popover ', () => { payload: { id: 'timeline-id', show: false }, type: 'x-pack/siem/local/timeline/SHOW_TIMELINE', }); - expect(onTimelineChange).toBeCalledWith('Timeline title', 'timeline-id'); + expect(onTimelineChange).toBeCalledWith('Timeline title', '34578-3497-5893-47589-34759'); }); it('should do nothing when router state', () => { jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.tsx index cf1a4ebec9bb6..573e010868bab 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/insert_timeline_popover/index.tsx @@ -23,6 +23,7 @@ interface InsertTimelinePopoverProps { interface RouterState { insertTimeline: { timelineId: string; + timelineSavedObjectId: string; timelineTitle: string; }; } @@ -46,7 +47,7 @@ export const InsertTimelinePopoverComponent: React.FC = ({ ); onTimelineChange( routerState.insertTimeline.timelineTitle, - routerState.insertTimeline.timelineId + routerState.insertTimeline.timelineSavedObjectId ); setRouterState(null); } diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/properties/helpers.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/properties/helpers.tsx index 0a2ab5c9d186a..6f7e1f782d3f6 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/properties/helpers.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/properties/helpers.tsx @@ -21,6 +21,7 @@ import React, { useCallback } from 'react'; import uuid from 'uuid'; import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; +import { useSelector } from 'react-redux'; import { Note } from '../../../lib/note'; import { Notes } from '../../notes'; @@ -29,6 +30,8 @@ import { NOTES_PANEL_WIDTH } from './notes_size'; import { ButtonContainer, DescriptionContainer, LabelText, NameField, StyledStar } from './styles'; import * as i18n from './translations'; import { SiemPageName } from '../../../pages/home/types'; +import { timelineSelectors } from '../../../store/timeline'; +import { State } from '../../../store'; export const historyToolTip = 'The chronological history of actions related to this timeline'; export const streamLiveToolTip = 'Update the Timeline as new data arrives'; @@ -121,6 +124,9 @@ interface NewCaseProps { export const NewCase = React.memo(({ onClosePopover, timelineId, timelineTitle }) => { const history = useHistory(); + const { savedObjectId } = useSelector((state: State) => + timelineSelectors.selectTimeline(state, timelineId) + ); const handleClick = useCallback(() => { onClosePopover(); history.push({ @@ -128,6 +134,7 @@ export const NewCase = React.memo(({ onClosePopover, timelineId, t state: { insertTimeline: { timelineId, + timelineSavedObjectId: savedObjectId, timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, }, }, diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_reporters.test.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_reporters.test.tsx index 3629fbc60e4d3..27b963eb6cb54 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_reporters.test.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_reporters.test.tsx @@ -61,6 +61,19 @@ describe('useGetReporters', () => { }); }); + it('refetch reporters', async () => { + const spyOnGetReporters = jest.spyOn(api, 'getReporters'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetReporters() + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.fetchReporters(); + expect(spyOnGetReporters).toHaveBeenCalledTimes(2); + }); + }); + it('unhappy path', async () => { const spyOnGetReporters = jest.spyOn(api, 'getReporters'); spyOnGetReporters.mockImplementation(() => { diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.test.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.test.tsx index 3df83d1c8a596..2d70c4390e4dd 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.test.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.test.tsx @@ -5,7 +5,7 @@ */ import { renderHook, act } from '@testing-library/react-hooks'; -import { useGetTags, TagsState } from './use_get_tags'; +import { useGetTags, UseGetTags } from './use_get_tags'; import { tags } from './mock'; import * as api from './api'; @@ -20,12 +20,13 @@ describe('useGetTags', () => { it('init', async () => { await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useGetTags()); + const { result, waitForNextUpdate } = renderHook(() => useGetTags()); await waitForNextUpdate(); expect(result.current).toEqual({ tags: [], isLoading: true, isError: false, + fetchTags: result.current.fetchTags, }); }); }); @@ -33,7 +34,7 @@ describe('useGetTags', () => { it('calls getTags api', async () => { const spyOnGetTags = jest.spyOn(api, 'getTags'); await act(async () => { - const { waitForNextUpdate } = renderHook(() => useGetTags()); + const { waitForNextUpdate } = renderHook(() => useGetTags()); await waitForNextUpdate(); await waitForNextUpdate(); expect(spyOnGetTags).toBeCalledWith(abortCtrl.signal); @@ -42,17 +43,29 @@ describe('useGetTags', () => { it('fetch tags', async () => { await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useGetTags()); + const { result, waitForNextUpdate } = renderHook(() => useGetTags()); await waitForNextUpdate(); await waitForNextUpdate(); expect(result.current).toEqual({ tags, isLoading: false, isError: false, + fetchTags: result.current.fetchTags, }); }); }); + it('refetch tags', async () => { + const spyOnGetTags = jest.spyOn(api, 'getTags'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => useGetTags()); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.fetchTags(); + expect(spyOnGetTags).toHaveBeenCalledTimes(2); + }); + }); + it('unhappy path', async () => { const spyOnGetTags = jest.spyOn(api, 'getTags'); spyOnGetTags.mockImplementation(() => { @@ -60,7 +73,7 @@ describe('useGetTags', () => { }); await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useGetTags()); + const { result, waitForNextUpdate } = renderHook(() => useGetTags()); await waitForNextUpdate(); await waitForNextUpdate(); @@ -68,6 +81,7 @@ describe('useGetTags', () => { tags: [], isLoading: false, isError: true, + fetchTags: result.current.fetchTags, }); }); }); diff --git a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx index 7c58316ac3fe9..99bb65fa160f7 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/use_get_tags.tsx @@ -20,6 +20,10 @@ type Action = | { type: 'FETCH_SUCCESS'; payload: string[] } | { type: 'FETCH_FAILURE' }; +export interface UseGetTags extends TagsState { + fetchTags: () => void; +} + const dataFetchReducer = (state: TagsState, action: Action): TagsState => { switch (action.type) { case 'FETCH_INIT': @@ -47,7 +51,7 @@ const dataFetchReducer = (state: TagsState, action: Action): TagsState => { }; const initialData: string[] = []; -export const useGetTags = (): TagsState => { +export const useGetTags = (): UseGetTags => { const [state, dispatch] = useReducer(dataFetchReducer, { isLoading: true, isError: false, @@ -55,7 +59,7 @@ export const useGetTags = (): TagsState => { }); const [, dispatchToaster] = useStateToaster(); - useEffect(() => { + const callFetch = () => { let didCancel = false; const abortCtrl = new AbortController(); @@ -82,6 +86,9 @@ export const useGetTags = (): TagsState => { abortCtrl.abort(); didCancel = true; }; + }; + useEffect(() => { + callFetch(); }, []); - return state; + return { ...state, fetchTags: callFetch }; }; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx index c50b7d8c17abc..a6eca717a82a3 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { EuiBasicTable, EuiButton, @@ -129,13 +129,25 @@ export const AllCases = React.memo(({ userCanCrud }) => { id: '', }); const [deleteBulk, setDeleteBulk] = useState([]); - - const refreshCases = useCallback(() => { - refetchCases(); - fetchCasesStatus(); - setSelectedCases([]); - setDeleteBulk([]); - }, []); + const filterRefetch = useRef<() => void>(); + const setFilterRefetch = useCallback( + (refetchFilter: () => void) => { + filterRefetch.current = refetchFilter; + }, + [filterRefetch.current] + ); + const refreshCases = useCallback( + (dataRefresh = true) => { + if (dataRefresh) refetchCases(); + fetchCasesStatus(); + setSelectedCases([]); + setDeleteBulk([]); + if (filterRefetch.current != null) { + filterRefetch.current(); + } + }, + [filterOptions, queryParams, filterRefetch.current] + ); useEffect(() => { if (isDeleted) { @@ -247,6 +259,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { }; } setQueryParams(newQueryParams); + refreshCases(false); }, [queryParams] ); @@ -259,6 +272,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { setQueryParams({ sortField: SortFieldCase.createdAt }); } setFilters(newFilterOptions); + refreshCases(false); }, [filterOptions, queryParams] ); @@ -347,6 +361,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { tags: filterOptions.tags, status: filterOptions.status, }} + setFilterRefetch={setFilterRefetch} /> {isCasesLoading && isDataEmpty ? (
diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.test.tsx index 615d052347203..21dcc9732440d 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.test.tsx @@ -19,17 +19,20 @@ jest.mock('../../../../containers/case/use_get_tags'); const onFilterChanged = jest.fn(); const fetchReporters = jest.fn(); +const fetchTags = jest.fn(); +const setFilterRefetch = jest.fn(); const props = { countClosedCases: 1234, countOpenCases: 99, onFilterChanged, initial: DEFAULT_FILTER_OPTIONS, + setFilterRefetch, }; describe('CasesTableFilters ', () => { beforeEach(() => { jest.resetAllMocks(); - (useGetTags as jest.Mock).mockReturnValue({ tags: ['coke', 'pepsi'] }); + (useGetTags as jest.Mock).mockReturnValue({ tags: ['coke', 'pepsi'], fetchTags }); (useGetReporters as jest.Mock).mockReturnValue({ reporters: ['casetester'], respReporters: [{ username: 'casetester' }], @@ -57,7 +60,7 @@ describe('CasesTableFilters ', () => { .text() ).toEqual('Closed cases (1234)'); }); - it('should call onFilterChange when tags change', () => { + it('should call onFilterChange when selected tags change', () => { const wrapper = mount( @@ -74,7 +77,7 @@ describe('CasesTableFilters ', () => { expect(onFilterChanged).toBeCalledWith({ tags: ['coke'] }); }); - it('should call onFilterChange when reporters change', () => { + it('should call onFilterChange when selected reporters change', () => { const wrapper = mount( @@ -118,4 +121,45 @@ describe('CasesTableFilters ', () => { expect(onFilterChanged).toBeCalledWith({ status: 'closed' }); }); + it('should call on load setFilterRefetch', () => { + mount( + + + + ); + expect(setFilterRefetch).toHaveBeenCalled(); + }); + it('should remove tag from selected tags when tag no longer exists', () => { + const ourProps = { + ...props, + initial: { + ...DEFAULT_FILTER_OPTIONS, + tags: ['pepsi', 'rc'], + }, + }; + mount( + + + + ); + expect(onFilterChanged).toHaveBeenCalledWith({ tags: ['pepsi'] }); + }); + it('should remove reporter from selected reporters when reporter no longer exists', () => { + const ourProps = { + ...props, + initial: { + ...DEFAULT_FILTER_OPTIONS, + reporters: [ + { username: 'casetester', full_name: null, email: null }, + { username: 'batman', full_name: null, email: null }, + ], + }, + }; + mount( + + + + ); + expect(onFilterChanged).toHaveBeenCalledWith({ reporters: [{ username: 'casetester' }] }); + }); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx index da477a56c0a22..901fb133753e8 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { isEqual } from 'lodash/fp'; import { EuiFieldSearch, @@ -25,6 +25,7 @@ interface CasesTableFiltersProps { countOpenCases: number | null; onFilterChanged: (filterOptions: Partial) => void; initial: FilterOptions; + setFilterRefetch: (val: () => void) => void; } /** @@ -41,6 +42,7 @@ const CasesTableFiltersComponent = ({ countOpenCases, onFilterChanged, initial = defaultInitial, + setFilterRefetch, }: CasesTableFiltersProps) => { const [selectedReporters, setSelectedReporters] = useState( initial.reporters.map(r => r.full_name ?? r.username ?? '') @@ -48,8 +50,29 @@ const CasesTableFiltersComponent = ({ const [search, setSearch] = useState(initial.search); const [selectedTags, setSelectedTags] = useState(initial.tags); const [showOpenCases, setShowOpenCases] = useState(initial.status === 'open'); - const { tags } = useGetTags(); - const { reporters, respReporters } = useGetReporters(); + const { tags, fetchTags } = useGetTags(); + const { reporters, respReporters, fetchReporters } = useGetReporters(); + const refetch = useCallback(() => { + fetchTags(); + fetchReporters(); + }, [fetchReporters, fetchTags]); + useEffect(() => { + if (setFilterRefetch != null) { + setFilterRefetch(refetch); + } + }, [refetch, setFilterRefetch]); + useEffect(() => { + if (selectedReporters.length) { + const newReporters = selectedReporters.filter(r => reporters.includes(r)); + handleSelectedReporters(newReporters); + } + }, [reporters]); + useEffect(() => { + if (selectedTags.length) { + const newTags = selectedTags.filter(t => tags.includes(t)); + handleSelectedTags(newTags); + } + }, [tags]); const handleSelectedReporters = useCallback( newReporters => { From ce9c6e258a5f4b32f9db2de8638beac5e1f5dd4c Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Thu, 16 Apr 2020 10:32:28 +0300 Subject: [PATCH 42/80] Index pattern management UI -> TypeScript and New Platform Ready (indexed_fields_table) (#63364) * MIgrated indexed_fields_table to typescript. * Updated docs * Fixed comments * Fixed types --- ...a-public.indexpatternfield.indexpattern.md | 11 + ...n-plugins-data-public.indexpatternfield.md | 1 + .../indexed_fields_table.test.tsx.snap} | 12 +- .../table.test.tsx.snap} | 13 +- .../components/table/{index.js => index.ts} | 0 .../components/table/table.js | 231 -------------- .../table.test.js => table.test.tsx} | 72 +++-- .../components/table/table.tsx | 281 ++++++++++++++++++ .../{index.js => index.ts} | 0 ....test.js => indexed_fields_table.test.tsx} | 46 ++- ...elds_table.js => indexed_fields_table.tsx} | 49 +-- ...ormat.test.js => get_field_format.test.ts} | 17 +- ...et_field_format.js => get_field_format.ts} | 3 +- .../lib/{index.js => index.ts} | 0 .../indexed_fields_table/types.ts | 25 ++ .../public/index_patterns/fields/field.ts | 1 + src/plugins/data/public/public.api.md | 2 + 17 files changed, 457 insertions(+), 307 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/{__jest__/__snapshots__/indexed_fields_table.test.js.snap => __snapshots__/indexed_fields_table.test.tsx.snap} (90%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/{__jest__/__snapshots__/table.test.js.snap => __snapshots__/table.test.tsx.snap} (92%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/{index.js => index.ts} (100%) delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.js rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/{__jest__/table.test.js => table.test.tsx} (66%) create mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.tsx rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/{index.js => index.ts} (100%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/{__jest__/indexed_fields_table.test.js => indexed_fields_table.test.tsx} (70%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/{indexed_fields_table.js => indexed_fields_table.tsx} (68%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/{__jest__/get_field_format.test.js => get_field_format.test.ts} (74%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/{get_field_format.js => get_field_format.ts} (84%) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/{index.js => index.ts} (100%) create mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/types.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md new file mode 100644 index 0000000000000..d1a1ee0905c6e --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPatternField](./kibana-plugin-plugins-data-public.indexpatternfield.md) > [indexPattern](./kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md) + +## IndexPatternField.indexPattern property + +Signature: + +```typescript +indexPattern?: IndexPattern; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md index 121ae80734dfd..df0de6ce0e541 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternfield.md @@ -27,6 +27,7 @@ export declare class Field implements IFieldType | [esTypes](./kibana-plugin-plugins-data-public.indexpatternfield.estypes.md) | | string[] | | | [filterable](./kibana-plugin-plugins-data-public.indexpatternfield.filterable.md) | | boolean | | | [format](./kibana-plugin-plugins-data-public.indexpatternfield.format.md) | | any | | +| [indexPattern](./kibana-plugin-plugins-data-public.indexpatternfield.indexpattern.md) | | IndexPattern | | | [lang](./kibana-plugin-plugins-data-public.indexpatternfield.lang.md) | | string | | | [name](./kibana-plugin-plugins-data-public.indexpatternfield.name.md) | | string | | | [script](./kibana-plugin-plugins-data-public.indexpatternfield.script.md) | | string | | diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__jest__/__snapshots__/indexed_fields_table.test.js.snap b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__snapshots__/indexed_fields_table.test.tsx.snap similarity index 90% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__jest__/__snapshots__/indexed_fields_table.test.js.snap rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__snapshots__/indexed_fields_table.test.tsx.snap index b38036a0c2bf0..db2a032b1e4d9 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__jest__/__snapshots__/indexed_fields_table.test.js.snap +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__snapshots__/indexed_fields_table.test.tsx.snap @@ -16,9 +16,10 @@ exports[`IndexedFieldsTable should filter based on the query bar 1`] = ` "excluded": false, "format": undefined, "indexPattern": undefined, - "info": undefined, + "info": Array [], "name": "Elastic", "searchable": true, + "type": "name", }, ] } @@ -42,7 +43,7 @@ exports[`IndexedFieldsTable should filter based on the type filter 1`] = ` "excluded": false, "format": undefined, "indexPattern": undefined, - "info": undefined, + "info": Array [], "name": "timestamp", "type": "date", }, @@ -68,16 +69,17 @@ exports[`IndexedFieldsTable should render normally 1`] = ` "excluded": false, "format": undefined, "indexPattern": undefined, - "info": undefined, + "info": Array [], "name": "Elastic", "searchable": true, + "type": "name", }, Object { "displayName": "timestamp", "excluded": false, "format": undefined, "indexPattern": undefined, - "info": undefined, + "info": Array [], "name": "timestamp", "type": "date", }, @@ -86,7 +88,7 @@ exports[`IndexedFieldsTable should render normally 1`] = ` "excluded": false, "format": undefined, "indexPattern": undefined, - "info": undefined, + "info": Array [], "name": "conflictingField", "type": "conflict", }, diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__jest__/__snapshots__/table.test.js.snap b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__snapshots__/table.test.tsx.snap similarity index 92% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__jest__/__snapshots__/table.test.js.snap rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__snapshots__/table.test.tsx.snap index f3aa2c5da4b67..2d51b1722cfb2 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__jest__/__snapshots__/table.test.js.snap +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__snapshots__/table.test.tsx.snap @@ -98,19 +98,26 @@ exports[`Table should render normally 1`] = ` Array [ Object { "displayName": "Elastic", - "info": Object {}, + "excluded": false, + "format": "", + "info": Array [], "name": "Elastic", "searchable": true, + "type": "name", }, Object { "displayName": "timestamp", - "info": Object {}, + "excluded": false, + "format": "YYYY-MM-DD", + "info": Array [], "name": "timestamp", "type": "date", }, Object { "displayName": "conflictingField", - "info": Object {}, + "excluded": false, + "format": "", + "info": Array [], "name": "conflictingField", "type": "conflict", }, diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/index.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/index.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.js deleted file mode 100644 index 29e160cf1c182..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.js +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; - -import { EuiIcon, EuiInMemoryTable, EuiIconTip } from '@elastic/eui'; - -import { i18n } from '@kbn/i18n'; - -export class Table extends PureComponent { - static propTypes = { - indexPattern: PropTypes.object.isRequired, - items: PropTypes.array.isRequired, - editField: PropTypes.func.isRequired, - }; - - renderBooleanTemplate(value, label) { - return value ? : ; - } - - renderFieldName(name, field) { - const { indexPattern } = this.props; - - const infoLabel = i18n.translate( - 'kbn.management.editIndexPattern.fields.table.additionalInfoAriaLabel', - { defaultMessage: 'Additional field information' } - ); - const timeLabel = i18n.translate( - 'kbn.management.editIndexPattern.fields.table.primaryTimeAriaLabel', - { defaultMessage: 'Primary time field' } - ); - const timeContent = i18n.translate( - 'kbn.management.editIndexPattern.fields.table.primaryTimeTooltip', - { defaultMessage: 'This field represents the time that events occurred.' } - ); - - return ( - - {name} - {field.info && field.info.length ? ( - -   - ( -
{info}
- ))} - /> -
- ) : null} - {indexPattern.timeFieldName === name ? ( - -   - - - ) : null} -
- ); - } - - renderFieldType(type, isConflict) { - const label = i18n.translate('kbn.management.editIndexPattern.fields.table.multiTypeAria', { - defaultMessage: 'Multiple type field', - }); - const content = i18n.translate( - 'kbn.management.editIndexPattern.fields.table.multiTypeTooltip', - { - defaultMessage: - 'The type of this field changes across indices. It is unavailable for many analysis functions.', - } - ); - - return ( - - {type} - {isConflict ? ( - -   - - - ) : ( - '' - )} - - ); - } - - render() { - const { items, editField } = this.props; - - const pagination = { - initialPageSize: 10, - pageSizeOptions: [5, 10, 25, 50], - }; - - const columns = [ - { - field: 'displayName', - name: i18n.translate('kbn.management.editIndexPattern.fields.table.nameHeader', { - defaultMessage: 'Name', - }), - dataType: 'string', - sortable: true, - render: (value, field) => { - return this.renderFieldName(value, field); - }, - width: '38%', - 'data-test-subj': 'indexedFieldName', - }, - { - field: 'type', - name: i18n.translate('kbn.management.editIndexPattern.fields.table.typeHeader', { - defaultMessage: 'Type', - }), - dataType: 'string', - sortable: true, - render: value => { - return this.renderFieldType(value, value === 'conflict'); - }, - 'data-test-subj': 'indexedFieldType', - }, - { - field: 'format', - name: i18n.translate('kbn.management.editIndexPattern.fields.table.formatHeader', { - defaultMessage: 'Format', - }), - dataType: 'string', - sortable: true, - }, - { - field: 'searchable', - name: i18n.translate('kbn.management.editIndexPattern.fields.table.searchableHeader', { - defaultMessage: 'Searchable', - }), - description: i18n.translate( - 'kbn.management.editIndexPattern.fields.table.searchableDescription', - { defaultMessage: 'These fields can be used in the filter bar' } - ), - dataType: 'boolean', - sortable: true, - render: value => - this.renderBooleanTemplate( - value, - i18n.translate('kbn.management.editIndexPattern.fields.table.isSearchableAria', { - defaultMessage: 'Is searchable', - }) - ), - }, - { - field: 'aggregatable', - name: i18n.translate('kbn.management.editIndexPattern.fields.table.aggregatableLabel', { - defaultMessage: 'Aggregatable', - }), - description: i18n.translate( - 'kbn.management.editIndexPattern.fields.table.aggregatableDescription', - { defaultMessage: 'These fields can be used in visualization aggregations' } - ), - dataType: 'boolean', - sortable: true, - render: value => - this.renderBooleanTemplate( - value, - i18n.translate('kbn.management.editIndexPattern.fields.table.isAggregatableAria', { - defaultMessage: 'Is aggregatable', - }) - ), - }, - { - field: 'excluded', - name: i18n.translate('kbn.management.editIndexPattern.fields.table.excludedLabel', { - defaultMessage: 'Excluded', - }), - description: i18n.translate( - 'kbn.management.editIndexPattern.fields.table.excludedDescription', - { defaultMessage: 'Fields that are excluded from _source when it is fetched' } - ), - dataType: 'boolean', - sortable: true, - render: value => - this.renderBooleanTemplate( - value, - i18n.translate('kbn.management.editIndexPattern.fields.table.isExcludedAria', { - defaultMessage: 'Is excluded', - }) - ), - }, - { - name: '', - actions: [ - { - name: i18n.translate('kbn.management.editIndexPattern.fields.table.editLabel', { - defaultMessage: 'Edit', - }), - description: i18n.translate( - 'kbn.management.editIndexPattern.fields.table.editDescription', - { defaultMessage: 'Edit' } - ), - icon: 'pencil', - onClick: editField, - type: 'icon', - 'data-test-subj': 'editFieldFormat', - }, - ], - width: '40px', - }, - ]; - - return ( - - ); - } -} diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__jest__/table.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.test.tsx similarity index 66% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__jest__/table.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.test.tsx index 4fd9ef7485bdf..d0479a9a9e032 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/__jest__/table.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.test.tsx @@ -19,31 +19,53 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { shallowWithI18nProvider } from 'test_utils/enzyme_helpers'; - -import { Table } from '../table'; +import { IIndexPattern } from '../../../../../../../../../../../plugins/data/public'; +import { IndexedFieldItem } from '../../types'; +import { Table } from './table'; const indexPattern = { timeFieldName: 'timestamp', -}; - -const items = [ - { name: 'Elastic', displayName: 'Elastic', searchable: true, info: {} }, - { name: 'timestamp', displayName: 'timestamp', type: 'date', info: {} }, - { name: 'conflictingField', displayName: 'conflictingField', type: 'conflict', info: {} }, +} as IIndexPattern; + +const items: IndexedFieldItem[] = [ + { + name: 'Elastic', + displayName: 'Elastic', + searchable: true, + info: [], + type: 'name', + excluded: false, + format: '', + }, + { + name: 'timestamp', + displayName: 'timestamp', + type: 'date', + info: [], + excluded: false, + format: 'YYYY-MM-DD', + }, + { + name: 'conflictingField', + displayName: 'conflictingField', + type: 'conflict', + info: [], + excluded: false, + format: '', + }, ]; describe('Table', () => { - it('should render normally', async () => { - const component = shallowWithI18nProvider( + test('should render normally', () => { + const component = shallow( {}} /> ); expect(component).toMatchSnapshot(); }); - it('should render normal field name', async () => { - const component = shallowWithI18nProvider( + test('should render normal field name', () => { + const component = shallow(
{}} /> ); @@ -51,8 +73,8 @@ describe('Table', () => { expect(tableCell).toMatchSnapshot(); }); - it('should render timestamp field name', async () => { - const component = shallowWithI18nProvider( + test('should render timestamp field name', () => { + const component = shallow(
{}} /> ); @@ -60,8 +82,8 @@ describe('Table', () => { expect(tableCell).toMatchSnapshot(); }); - it('should render the boolean template (true)', async () => { - const component = shallowWithI18nProvider( + test('should render the boolean template (true)', () => { + const component = shallow(
{}} /> ); @@ -69,8 +91,8 @@ describe('Table', () => { expect(tableCell).toMatchSnapshot(); }); - it('should render the boolean template (false)', async () => { - const component = shallowWithI18nProvider( + test('should render the boolean template (false)', () => { + const component = shallow(
{}} /> ); @@ -78,8 +100,8 @@ describe('Table', () => { expect(tableCell).toMatchSnapshot(); }); - it('should render normal type', async () => { - const component = shallowWithI18nProvider( + test('should render normal type', () => { + const component = shallow(
{}} /> ); @@ -87,8 +109,8 @@ describe('Table', () => { expect(tableCell).toMatchSnapshot(); }); - it('should render conflicting type', async () => { - const component = shallowWithI18nProvider( + test('should render conflicting type', () => { + const component = shallow(
{}} /> ); @@ -96,10 +118,10 @@ describe('Table', () => { expect(tableCell).toMatchSnapshot(); }); - it('should allow edits', () => { + test('should allow edits', () => { const editField = jest.fn(); - const component = shallowWithI18nProvider( + const component = shallow(
); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.tsx b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.tsx new file mode 100644 index 0000000000000..aa8e8b8e13a07 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/components/table/table.tsx @@ -0,0 +1,281 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { PureComponent } from 'react'; + +import { EuiIcon, EuiInMemoryTable, EuiIconTip, EuiBasicTableColumn } from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { IIndexPattern } from '../../../../../../../../../../../plugins/data/public'; +import { IndexedFieldItem } from '../../types'; + +// localized labels +const additionalInfoAriaLabel = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.additionalInfoAriaLabel', + { defaultMessage: 'Additional field information' } +); + +const primaryTimeAriaLabel = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.primaryTimeAriaLabel', + { defaultMessage: 'Primary time field' } +); + +const primaryTimeTooltip = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.primaryTimeTooltip', + { defaultMessage: 'This field represents the time that events occurred.' } +); + +const multiTypeAriaLabel = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.multiTypeAria', + { + defaultMessage: 'Multiple type field', + } +); + +const multiTypeTooltip = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.multiTypeTooltip', + { + defaultMessage: + 'The type of this field changes across indices. It is unavailable for many analysis functions.', + } +); + +const nameHeader = i18n.translate('kbn.management.editIndexPattern.fields.table.nameHeader', { + defaultMessage: 'Name', +}); + +const typeHeader = i18n.translate('kbn.management.editIndexPattern.fields.table.typeHeader', { + defaultMessage: 'Type', +}); + +const formatHeader = i18n.translate('kbn.management.editIndexPattern.fields.table.formatHeader', { + defaultMessage: 'Format', +}); + +const searchableHeader = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.searchableHeader', + { + defaultMessage: 'Searchable', + } +); + +const searchableDescription = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.searchableDescription', + { defaultMessage: 'These fields can be used in the filter bar' } +); + +const isSearchableAriaLabel = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.isSearchableAria', + { + defaultMessage: 'Is searchable', + } +); + +const aggregatableLabel = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.aggregatableLabel', + { + defaultMessage: 'Aggregatable', + } +); + +const aggregatableDescription = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.aggregatableDescription', + { defaultMessage: 'These fields can be used in visualization aggregations' } +); + +const isAggregatableAriaLabel = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.isAggregatableAria', + { + defaultMessage: 'Is aggregatable', + } +); + +const excludedLabel = i18n.translate('kbn.management.editIndexPattern.fields.table.excludedLabel', { + defaultMessage: 'Excluded', +}); + +const excludedDescription = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.excludedDescription', + { defaultMessage: 'Fields that are excluded from _source when it is fetched' } +); + +const isExcludedAriaLabel = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.isExcludedAria', + { + defaultMessage: 'Is excluded', + } +); + +const editLabel = i18n.translate('kbn.management.editIndexPattern.fields.table.editLabel', { + defaultMessage: 'Edit', +}); + +const editDescription = i18n.translate( + 'kbn.management.editIndexPattern.fields.table.editDescription', + { defaultMessage: 'Edit' } +); + +interface IndexedFieldProps { + indexPattern: IIndexPattern; + items: IndexedFieldItem[]; + editField: (field: IndexedFieldItem) => void; +} + +export class Table extends PureComponent { + renderBooleanTemplate(value: string, arialLabel: string) { + return value ? : ; + } + + renderFieldName(name: string, field: IndexedFieldItem) { + const { indexPattern } = this.props; + + return ( + + {name} + {field.info && field.info.length ? ( + +   + ( +
{info}
+ ))} + /> +
+ ) : null} + {indexPattern.timeFieldName === name ? ( + +   + + + ) : null} +
+ ); + } + + renderFieldType(type: string, isConflict: boolean) { + return ( + + {type} + {isConflict ? ( + +   + + + ) : ( + '' + )} + + ); + } + + render() { + const { items, editField } = this.props; + + const pagination = { + initialPageSize: 10, + pageSizeOptions: [5, 10, 25, 50], + }; + + const columns: Array> = [ + { + field: 'displayName', + name: nameHeader, + dataType: 'string', + sortable: true, + render: (value: string, field: IndexedFieldItem) => { + return this.renderFieldName(value, field); + }, + width: '38%', + 'data-test-subj': 'indexedFieldName', + }, + { + field: 'type', + name: typeHeader, + dataType: 'string', + sortable: true, + render: (value: string) => { + return this.renderFieldType(value, value === 'conflict'); + }, + 'data-test-subj': 'indexedFieldType', + }, + { + field: 'format', + name: formatHeader, + dataType: 'string', + sortable: true, + }, + { + field: 'searchable', + name: searchableHeader, + description: searchableDescription, + dataType: 'boolean', + sortable: true, + render: (value: string) => this.renderBooleanTemplate(value, isSearchableAriaLabel), + }, + { + field: 'aggregatable', + name: aggregatableLabel, + description: aggregatableDescription, + dataType: 'boolean', + sortable: true, + render: (value: string) => this.renderBooleanTemplate(value, isAggregatableAriaLabel), + }, + { + field: 'excluded', + name: excludedLabel, + description: excludedDescription, + dataType: 'boolean', + sortable: true, + render: (value: string) => this.renderBooleanTemplate(value, isExcludedAriaLabel), + }, + { + name: '', + actions: [ + { + name: editLabel, + description: editDescription, + icon: 'pencil', + onClick: editField, + type: 'icon', + 'data-test-subj': 'editFieldFormat', + }, + ], + width: '40px', + }, + ]; + + return ( + + ); + } +} diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/index.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/index.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__jest__/indexed_fields_table.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx similarity index 70% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__jest__/indexed_fields_table.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx index 26e271ea477da..f8b78a92e098e 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/__jest__/indexed_fields_table.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx @@ -19,8 +19,8 @@ import React from 'react'; import { shallow } from 'enzyme'; - -import { IndexedFieldsTable } from '../indexed_fields_table'; +import { IndexPatternField, IIndexPattern } from '../../../../../../../../../plugins/data/public'; +import { IndexedFieldsTable } from './indexed_fields_table'; jest.mock('@elastic/eui', () => ({ EuiFlexGroup: 'eui-flex-group', @@ -29,7 +29,7 @@ jest.mock('@elastic/eui', () => ({ EuiInMemoryTable: 'eui-in-memory-table', })); -jest.mock('../components/table', () => ({ +jest.mock('./components/table', () => ({ // Note: this seems to fix React complaining about non lowercase attributes Table: () => { return 'table'; @@ -37,27 +37,37 @@ jest.mock('../components/table', () => ({ })); const helpers = { - redirectToRoute: () => {}, + redirectToRoute: (obj: any) => {}, + getFieldInfo: () => [], }; const fields = [ - { name: 'Elastic', displayName: 'Elastic', searchable: true }, + { + name: 'Elastic', + displayName: 'Elastic', + searchable: true, + type: 'name', + }, { name: 'timestamp', displayName: 'timestamp', type: 'date' }, { name: 'conflictingField', displayName: 'conflictingField', type: 'conflict' }, -]; +] as IndexPatternField[]; -const indexPattern = { +const indexPattern = ({ getNonScriptedFields: () => fields, -}; +} as unknown) as IIndexPattern; describe('IndexedFieldsTable', () => { - it('should render normally', async () => { + test('should render normally', async () => { const component = shallow( {}} + fieldWildcardMatcher={() => { + return () => false; + }} + indexedFieldTypeFilter="" + fieldFilter="" /> ); @@ -67,13 +77,17 @@ describe('IndexedFieldsTable', () => { expect(component).toMatchSnapshot(); }); - it('should filter based on the query bar', async () => { + test('should filter based on the query bar', async () => { const component = shallow( {}} + fieldWildcardMatcher={() => { + return () => false; + }} + indexedFieldTypeFilter="" + fieldFilter="" /> ); @@ -84,13 +98,17 @@ describe('IndexedFieldsTable', () => { expect(component).toMatchSnapshot(); }); - it('should filter based on the type filter', async () => { + test('should filter based on the type filter', async () => { const component = shallow( {}} + fieldWildcardMatcher={() => { + return () => false; + }} + indexedFieldTypeFilter="" + fieldFilter="" /> ); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx similarity index 68% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx index 074e5784f3dae..7c2bb565615d7 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx @@ -18,26 +18,33 @@ */ import React, { Component } from 'react'; -import PropTypes from 'prop-types'; import { createSelector } from 'reselect'; - +import { IndexPatternField, IIndexPattern } from '../../../../../../../../../plugins/data/public'; import { Table } from './components/table'; import { getFieldFormat } from './lib'; +import { IndexedFieldItem } from './types'; -export class IndexedFieldsTable extends Component { - static propTypes = { - fields: PropTypes.array.isRequired, - indexPattern: PropTypes.object.isRequired, - fieldFilter: PropTypes.string, - indexedFieldTypeFilter: PropTypes.string, - helpers: PropTypes.shape({ - redirectToRoute: PropTypes.func.isRequired, - getFieldInfo: PropTypes.func, - }), - fieldWildcardMatcher: PropTypes.func.isRequired, +interface IndexedFieldsTableProps { + fields: IndexPatternField[]; + indexPattern: IIndexPattern; + fieldFilter?: string; + indexedFieldTypeFilter?: string; + helpers: { + redirectToRoute: (obj: any) => void; + getFieldInfo: (indexPattern: IIndexPattern, field: string) => string[]; }; + fieldWildcardMatcher: (filters: any[]) => (val: any) => boolean; +} + +interface IndexedFieldsTableState { + fields: IndexedFieldItem[]; +} - constructor(props) { +export class IndexedFieldsTable extends Component< + IndexedFieldsTableProps, + IndexedFieldsTableState +> { + constructor(props: IndexedFieldsTableProps) { super(props); this.state = { @@ -45,7 +52,7 @@ export class IndexedFieldsTable extends Component { }; } - UNSAFE_componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps(nextProps: IndexedFieldsTableProps) { if (nextProps.fields !== this.props.fields) { this.setState({ fields: this.mapFields(nextProps.fields), @@ -53,10 +60,11 @@ export class IndexedFieldsTable extends Component { } } - mapFields(fields) { + mapFields(fields: IndexPatternField[]): IndexedFieldItem[] { const { indexPattern, fieldWildcardMatcher, helpers } = this.props; const sourceFilters = - indexPattern.sourceFilters && indexPattern.sourceFilters.map(f => f.value); + indexPattern.sourceFilters && + indexPattern.sourceFilters.map((f: Record) => f.value); const fieldWildcardMatch = fieldWildcardMatcher(sourceFilters || []); return ( @@ -76,9 +84,10 @@ export class IndexedFieldsTable extends Component { } getFilteredFields = createSelector( - state => state.fields, - (state, props) => props.fieldFilter, - (state, props) => props.indexedFieldTypeFilter, + (state: IndexedFieldsTableState) => state.fields, + (state: IndexedFieldsTableState, props: IndexedFieldsTableProps) => props.fieldFilter, + (state: IndexedFieldsTableState, props: IndexedFieldsTableProps) => + props.indexedFieldTypeFilter, (fields, fieldFilter, indexedFieldTypeFilter) => { if (fieldFilter) { const normalizedFieldFilter = fieldFilter.toLowerCase(); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/__jest__/get_field_format.test.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.test.ts similarity index 74% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/__jest__/get_field_format.test.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.test.ts index 7090f70199919..fc7477c074ac2 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/__jest__/get_field_format.test.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.test.ts @@ -17,9 +17,10 @@ * under the License. */ -import { getFieldFormat } from '../get_field_format'; +import { IIndexPattern } from '../../../../../../../../../../plugins/data/public'; +import { getFieldFormat } from './get_field_format'; -const indexPattern = { +const indexPattern = ({ fieldFormatMap: { Elastic: { type: { @@ -27,26 +28,26 @@ const indexPattern = { }, }, }, -}; +} as unknown) as IIndexPattern; describe('getFieldFormat', () => { - it('should handle no arguments', () => { + test('should handle no arguments', () => { expect(getFieldFormat()).toEqual(''); }); - it('should handle no field name', () => { + test('should handle no field name', () => { expect(getFieldFormat(indexPattern)).toEqual(''); }); - it('should handle empty name', () => { + test('should handle empty name', () => { expect(getFieldFormat(indexPattern, '')).toEqual(''); }); - it('should handle undefined field name', () => { + test('should handle undefined field name', () => { expect(getFieldFormat(indexPattern, 'none')).toEqual(undefined); }); - it('should retrieve field format', () => { + test('should retrieve field format', () => { expect(getFieldFormat(indexPattern, 'Elastic')).toEqual('string'); }); }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.ts similarity index 84% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.ts index 9402694bb1371..1d6f267430f07 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/get_field_format.ts @@ -18,8 +18,9 @@ */ import { get } from 'lodash'; +import { IIndexPattern } from '../../../../../../../../../../plugins/data/public'; -export function getFieldFormat(indexPattern, fieldName) { +export function getFieldFormat(indexPattern?: IIndexPattern, fieldName?: string): string { return indexPattern && fieldName ? get(indexPattern, ['fieldFormatMap', fieldName, 'type', 'title']) : ''; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/index.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/index.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/index.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/lib/index.ts diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/types.ts b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/types.ts new file mode 100644 index 0000000000000..f27f4608bf5d5 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/indexed_fields_table/types.ts @@ -0,0 +1,25 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IFieldType } from '../../../../../../../../../plugins/data/public'; + +export interface IndexedFieldItem extends IFieldType { + info: string[]; + excluded: boolean; +} diff --git a/src/plugins/data/public/index_patterns/fields/field.ts b/src/plugins/data/public/index_patterns/fields/field.ts index 6370dcdf2db6f..0fb92393d56f7 100644 --- a/src/plugins/data/public/index_patterns/fields/field.ts +++ b/src/plugins/data/public/index_patterns/fields/field.ts @@ -44,6 +44,7 @@ export class Field implements IFieldType { scripted?: boolean; subType?: IFieldSubType; displayName?: string; + indexPattern?: IndexPattern; format: any; $$spec: FieldSpec; diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 62967a7071d82..6e06d063e7ebe 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -943,6 +943,8 @@ export class IndexPatternField implements IFieldType { // (undocumented) format: any; // (undocumented) + indexPattern?: IndexPattern; + // (undocumented) lang?: string; // (undocumented) name: string; From ee1cebdbe1411815953e7b9db4913a5c96a26bb4 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Thu, 16 Apr 2020 10:36:09 +0300 Subject: [PATCH 43/80] MIgrated index_header to react (#63490) --- .../create_edit_field/create_edit_field.html | 6 - .../create_edit_field/create_edit_field.js | 3 + .../edit_index_pattern.html | 7 +- .../edit_index_pattern/edit_index_pattern.js | 33 ++++- .../index_header/{index.js => index.ts} | 2 +- .../index_header/index_header.html | 59 -------- .../index_header/index_header.js | 40 ------ .../index_header/index_header.tsx | 134 ++++++++++++++++++ 8 files changed, 171 insertions(+), 113 deletions(-) rename src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/{index.js => index.ts} (94%) delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.html delete mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.js create mode 100644 src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.html b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.html index fee8525a6af41..2decaf423183e 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.html +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.html @@ -1,11 +1,5 @@
-
- -
-
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js index 3569e9caf4e27..95d6cb6878e53 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js @@ -34,6 +34,8 @@ import { FieldEditor } from 'ui/field_editor'; import { I18nContext } from 'ui/i18n'; import { i18n } from '@kbn/i18n'; +import { IndexHeader } from '../index_header'; + const REACT_FIELD_EDITOR_ID = 'reactFieldEditor'; const renderFieldEditor = ( $scope, @@ -49,6 +51,7 @@ const renderFieldEditor = ( render( + - +

diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.js index c65054f583ef2..69184a513f53a 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/edit_index_pattern.js @@ -18,7 +18,7 @@ */ import _ from 'lodash'; -import './index_header'; +import { IndexHeader } from './index_header'; import './create_edit_field'; import { docTitle } from 'ui/doc_title'; import { KbnUrlProvider } from 'ui/url'; @@ -44,6 +44,7 @@ import { createEditIndexPatternPageStateContainer } from './edit_index_pattern_s const REACT_SOURCE_FILTERS_DOM_ELEMENT_ID = 'reactSourceFiltersTable'; const REACT_INDEXED_FIELDS_DOM_ELEMENT_ID = 'reactIndexedFieldsTable'; const REACT_SCRIPTED_FIELDS_DOM_ELEMENT_ID = 'reactScriptedFieldsTable'; +const REACT_INDEX_HEADER_DOM_ELEMENT_ID = 'reactIndexHeader'; const TAB_INDEXED_FIELDS = 'indexedFields'; const TAB_SCRIPTED_FIELDS = 'scriptedFields'; @@ -160,6 +161,33 @@ function destroyIndexedFieldsTable() { node && unmountComponentAtNode(node); } +function destroyIndexHeader() { + const node = document.getElementById(REACT_INDEX_HEADER_DOM_ELEMENT_ID); + node && unmountComponentAtNode(node); +} + +function renderIndexHeader($scope, config) { + $scope.$$postDigest(() => { + const node = document.getElementById(REACT_INDEX_HEADER_DOM_ELEMENT_ID); + if (!node) { + return; + } + + render( + + + , + node + ); + }); +} + function handleTabChange($scope, newTab) { destroyIndexedFieldsTable(); destroySourceFiltersTable(); @@ -391,6 +419,9 @@ uiModules destroyIndexedFieldsTable(); destroyScriptedFieldsTable(); destroySourceFiltersTable(); + destroyIndexHeader(); destroyState(); }); + + renderIndexHeader($scope, config); }); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index.ts similarity index 94% rename from src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index.js rename to src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index.ts index 7c288286bd61e..44c05a55b36f9 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index.ts @@ -17,4 +17,4 @@ * under the License. */ -import './index_header'; +export { IndexHeader } from './index_header'; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.html b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.html deleted file mode 100644 index d6b91d96f13d3..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.html +++ /dev/null @@ -1,59 +0,0 @@ -

-
- -

- - {{indexPattern.title}} -

-
- -
- - - - - -
-
diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.js deleted file mode 100644 index 87bce06c1146c..0000000000000 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { uiModules } from 'ui/modules'; -import template from './index_header.html'; -uiModules.get('apps/management').directive('kbnManagementIndexPatternsHeader', function(config) { - return { - restrict: 'E', - template, - replace: true, - scope: { - indexPattern: '=', - setDefault: '&', - refreshFields: '&', - delete: '&', - }, - link: function($scope, $el, attrs) { - $scope.delete = attrs.delete ? $scope.delete : null; - $scope.setDefault = attrs.setDefault ? $scope.setDefault : null; - $scope.refreshFields = attrs.refreshFields ? $scope.refreshFields : null; - config.bindToScope($scope, 'defaultIndex'); - }, - }; -}); diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx new file mode 100644 index 0000000000000..866d10ecb0e19 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/index_header/index_header.tsx @@ -0,0 +1,134 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiFlexGroup, + EuiToolTip, + EuiFlexItem, + EuiIcon, + EuiTitle, + EuiButtonIcon, +} from '@elastic/eui'; +import { IIndexPattern } from '../../../../../../../../../plugins/data/public'; + +interface IndexHeaderProps { + defaultIndex: string; + indexPattern: IIndexPattern; + setDefault?: () => void; + refreshFields?: () => void; + deleteIndexPattern?: () => void; +} + +const setDefaultAriaLabel = i18n.translate('kbn.management.editIndexPattern.setDefaultAria', { + defaultMessage: 'Set as default index.', +}); + +const setDefaultTooltip = i18n.translate('kbn.management.editIndexPattern.setDefaultTooltip', { + defaultMessage: 'Set as default index.', +}); + +const refreshAriaLabel = i18n.translate('kbn.management.editIndexPattern.refreshAria', { + defaultMessage: 'Reload field list.', +}); + +const refreshTooltip = i18n.translate('kbn.management.editIndexPattern.refreshTooltip', { + defaultMessage: 'Refresh field list.', +}); + +const removeAriaLabel = i18n.translate('kbn.management.editIndexPattern.removeAria', { + defaultMessage: 'Remove index pattern.', +}); + +const removeTooltip = i18n.translate('kbn.management.editIndexPattern.removeTooltip', { + defaultMessage: 'Remove index pattern.', +}); + +export function IndexHeader({ + defaultIndex, + indexPattern, + setDefault, + refreshFields, + deleteIndexPattern, +}: IndexHeaderProps) { + return ( + + + + {defaultIndex === indexPattern.id && ( + + + + )} + + +

{indexPattern.title}

+
+
+
+
+ + + {setDefault && ( + + + + + + )} + + {refreshFields && ( + + + + + + )} + + {deleteIndexPattern && ( + + + + + + )} + + +
+ ); +} From 3ade2d358d2d819736981432b413a84b10c22b7e Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Thu, 16 Apr 2020 00:42:25 -0700 Subject: [PATCH 44/80] Closes #63109 for Service Map by resetting edges styles for the selected node (#63655) --- .../apm/public/components/app/ServiceMap/Cytoscape.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx index e4b656ae8160d..53c86f92ee557 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx @@ -211,7 +211,9 @@ export function Cytoscape({ resetConnectedEdgeStyle(event.target); }; const unselectHandler: cytoscape.EventHandler = event => { - resetConnectedEdgeStyle(); + resetConnectedEdgeStyle( + serviceName ? event.cy.getElementById(serviceName) : undefined + ); }; const debugHandler: cytoscape.EventHandler = event => { const debugEnabled = sessionStorage.getItem('apm_debug') === 'true'; From bb9f8845ae69bf402f9870f0697577c5e8325ef8 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Thu, 16 Apr 2020 08:45:38 +0100 Subject: [PATCH 45/80] [alerting] Adds an alertServices mock and uses it in siem, monitoring and uptime (#63489) Work on #61313 has revealed that we don't have amock for AlertServices, which creates coupling between us and any solution depending on us, which makes it harder to make changes in our own code. This PR adds mocks and uses them in SIEM, Monitoring and Uptime, so that we can make future changes without having to change outside solutions. --- .../rules_notification_alert_type.test.ts | 43 ++-- .../signals/get_filter.test.ts | 28 +-- .../signals/get_input_output_index.test.ts | 50 ++-- .../signals/search_after_bulk_create.test.ts | 36 ++- .../signals/signal_rule_alert_type.test.ts | 93 ++----- .../signals/single_bulk_create.test.ts | 22 +- .../signals/single_search_after.test.ts | 14 +- x-pack/plugins/alerting/server/mocks.ts | 39 +++ .../metric_threshold_executor.test.ts | 237 ++++++++++-------- .../server/alerts/cluster_state.test.ts | 23 +- .../server/alerts/license_expiration.test.ts | 22 +- .../lib/alerts/__tests__/status_check.test.ts | 59 ++--- 12 files changed, 305 insertions(+), 361 deletions(-) diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/notifications/rules_notification_alert_type.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/notifications/rules_notification_alert_type.test.ts index 50ac10347e062..f537b22bac1eb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/notifications/rules_notification_alert_type.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/notifications/rules_notification_alert_type.test.ts @@ -4,42 +4,27 @@ * you may not use this file except in compliance with the Elastic License. */ -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { loggerMock } from 'src/core/server/logging/logger.mock'; import { getResult } from '../routes/__mocks__/request_responses'; import { rulesNotificationAlertType } from './rules_notification_alert_type'; import { buildSignalsSearchQuery } from './build_signals_query'; -import { AlertInstance } from '../../../../../../../plugins/alerting/server'; +import { alertsMock, AlertServicesMock } from '../../../../../../../plugins/alerting/server/mocks'; import { NotificationExecutorOptions } from './types'; jest.mock('./build_signals_query'); describe('rules_notification_alert_type', () => { let payload: NotificationExecutorOptions; let alert: ReturnType; - let alertInstanceMock: Record; - let alertInstanceFactoryMock: () => AlertInstance; - let savedObjectsClient: ReturnType; let logger: ReturnType; - let callClusterMock: jest.Mock; + let alertServices: AlertServicesMock; beforeEach(() => { - alertInstanceMock = { - scheduleActions: jest.fn(), - replaceState: jest.fn(), - }; - alertInstanceMock.replaceState.mockReturnValue(alertInstanceMock); - alertInstanceFactoryMock = jest.fn().mockReturnValue(alertInstanceMock); - callClusterMock = jest.fn(); - savedObjectsClient = savedObjectsClientMock.create(); + alertServices = alertsMock.createAlertServices(); logger = loggerMock.create(); payload = { alertId: '1111', - services: { - savedObjectsClient, - alertInstanceFactory: alertInstanceFactoryMock, - callCluster: callClusterMock, - }, + services: alertServices, params: { ruleAlertId: '2222' }, state: {}, spaceId: '', @@ -58,7 +43,7 @@ describe('rules_notification_alert_type', () => { describe('executor', () => { it('throws an error if rule alert was not found', async () => { - savedObjectsClient.get.mockResolvedValue({ + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', attributes: {}, type: 'type', @@ -72,13 +57,13 @@ describe('rules_notification_alert_type', () => { it('should call buildSignalsSearchQuery with proper params', async () => { const ruleAlert = getResult(); - savedObjectsClient.get.mockResolvedValue({ + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', references: [], attributes: ruleAlert, }); - callClusterMock.mockResolvedValue({ + alertServices.callCluster.mockResolvedValue({ count: 0, }); @@ -96,36 +81,38 @@ describe('rules_notification_alert_type', () => { it('should not call alertInstanceFactory if signalsCount was 0', async () => { const ruleAlert = getResult(); - savedObjectsClient.get.mockResolvedValue({ + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', references: [], attributes: ruleAlert, }); - callClusterMock.mockResolvedValue({ + alertServices.callCluster.mockResolvedValue({ count: 0, }); await alert.executor(payload); - expect(alertInstanceFactoryMock).not.toHaveBeenCalled(); + expect(alertServices.alertInstanceFactory).not.toHaveBeenCalled(); }); it('should call scheduleActions if signalsCount was greater than 0', async () => { const ruleAlert = getResult(); - savedObjectsClient.get.mockResolvedValue({ + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', references: [], attributes: ruleAlert, }); - callClusterMock.mockResolvedValue({ + alertServices.callCluster.mockResolvedValue({ count: 10, }); await alert.executor(payload); - expect(alertInstanceFactoryMock).toHaveBeenCalled(); + expect(alertServices.alertInstanceFactory).toHaveBeenCalled(); + + const [{ value: alertInstanceMock }] = alertServices.alertInstanceFactory.mock.results; expect(alertInstanceMock.replaceState).toHaveBeenCalledWith( expect.objectContaining({ signals_count: 10 }) ); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_filter.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_filter.test.ts index 86d1278031695..510667b211d25 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_filter.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_filter.test.ts @@ -5,42 +5,28 @@ */ import { getQueryFilter, getFilter } from './get_filter'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { PartialFilter } from '../types'; -import { AlertServices } from '../../../../../../../plugins/alerting/server'; +import { alertsMock, AlertServicesMock } from '../../../../../../../plugins/alerting/server/mocks'; describe('get_filter', () => { - let savedObjectsClient = savedObjectsClientMock.create(); - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ - attributes: { - query: { query: 'host.name: linux', language: 'kuery' }, - filters: [], - }, - })); - let servicesMock: AlertServices = { - savedObjectsClient, - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - }; + let servicesMock: AlertServicesMock; beforeAll(() => { jest.resetAllMocks(); }); beforeEach(() => { - savedObjectsClient = savedObjectsClientMock.create(); - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ + servicesMock = alertsMock.createAlertServices(); + servicesMock.savedObjectsClient.get.mockImplementation(async (type: string, id: string) => ({ + id, + type, + references: [], attributes: { query: { query: 'host.name: linux', language: 'kuery' }, language: 'kuery', filters: [], }, })); - servicesMock = { - savedObjectsClient, - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - }; }); afterEach(() => { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_input_output_index.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_input_output_index.test.ts index 18286dc7754e0..ccd882228d4de 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_input_output_index.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/get_input_output_index.test.ts @@ -4,22 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { getInputIndex } from './get_input_output_index'; import { defaultIndexPattern } from '../../../../default_index_pattern'; -import { AlertServices } from '../../../../../../../plugins/alerting/server'; +import { alertsMock, AlertServicesMock } from '../../../../../../../plugins/alerting/server/mocks'; describe('get_input_output_index', () => { - let savedObjectsClient = savedObjectsClientMock.create(); - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ - attributes: {}, - })); - let servicesMock: AlertServices = { - savedObjectsClient, - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - }; + let servicesMock: AlertServicesMock; beforeAll(() => { jest.resetAllMocks(); @@ -30,20 +21,21 @@ describe('get_input_output_index', () => { }); beforeEach(() => { - savedObjectsClient = savedObjectsClientMock.create(); - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ + servicesMock = alertsMock.createAlertServices(); + servicesMock.savedObjectsClient.get.mockImplementation(async (type: string, id: string) => ({ + id, + type, + references: [], attributes: {}, })); - servicesMock = { - savedObjectsClient, - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - }; }); describe('getInputOutputIndex', () => { test('Returns inputIndex if inputIndex is passed in', async () => { - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ + servicesMock.savedObjectsClient.get.mockImplementation(async (type: string, id: string) => ({ + id, + type, + references: [], attributes: {}, })); const inputIndex = await getInputIndex(servicesMock, '8.0.0', ['test-input-index-1']); @@ -51,7 +43,10 @@ describe('get_input_output_index', () => { }); test('Returns a saved object inputIndex if passed in inputIndex is undefined', async () => { - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ + servicesMock.savedObjectsClient.get.mockImplementation(async (type: string, id: string) => ({ + id, + type, + references: [], attributes: { [DEFAULT_INDEX_KEY]: ['configured-index-1', 'configured-index-2'], }, @@ -61,7 +56,10 @@ describe('get_input_output_index', () => { }); test('Returns a saved object inputIndex if passed in inputIndex is null', async () => { - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ + servicesMock.savedObjectsClient.get.mockImplementation(async (type: string, id: string) => ({ + id, + type, + references: [], attributes: { [DEFAULT_INDEX_KEY]: ['configured-index-1', 'configured-index-2'], }, @@ -71,7 +69,10 @@ describe('get_input_output_index', () => { }); test('Returns a saved object inputIndex default from constants if inputIndex passed in is null and the key is also null', async () => { - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ + servicesMock.savedObjectsClient.get.mockImplementation(async (type: string, id: string) => ({ + id, + type, + references: [], attributes: { [DEFAULT_INDEX_KEY]: null, }, @@ -81,7 +82,10 @@ describe('get_input_output_index', () => { }); test('Returns a saved object inputIndex default from constants if inputIndex passed in is undefined and the key is also null', async () => { - savedObjectsClient.get = jest.fn().mockImplementation(() => ({ + servicesMock.savedObjectsClient.get.mockImplementation(async (type: string, id: string) => ({ + id, + type, + references: [], attributes: { [DEFAULT_INDEX_KEY]: null, }, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts index 81600b0b8dd9b..9e2f36fe2653a 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts @@ -16,20 +16,16 @@ import { } from './__mocks__/es_results'; import { searchAfterAndBulkCreate } from './search_after_bulk_create'; import { DEFAULT_SIGNALS_INDEX } from '../../../../common/constants'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; +import { alertsMock, AlertServicesMock } from '../../../../../../../plugins/alerting/server/mocks'; import uuid from 'uuid'; -export const mockService = { - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - savedObjectsClient: savedObjectsClientMock.create(), -}; - describe('searchAfterAndBulkCreate', () => { + let mockService: AlertServicesMock; let inputIndexPattern: string[] = []; beforeEach(() => { jest.clearAllMocks(); inputIndexPattern = ['auditbeat-*']; + mockService = alertsMock.createAlertServices(); }); test('if successful with empty search results', async () => { @@ -65,7 +61,7 @@ describe('searchAfterAndBulkCreate', () => { const sampleParams = sampleRuleAlertParams(30); const someGuids = Array.from({ length: 13 }).map(x => uuid.v4()); mockService.callCluster - .mockReturnValueOnce({ + .mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -79,8 +75,8 @@ describe('searchAfterAndBulkCreate', () => { }, ], }) - .mockReturnValueOnce(repeatedSearchResultsWithSortId(3, 1, someGuids.slice(0, 3))) - .mockReturnValueOnce({ + .mockResolvedValueOnce(repeatedSearchResultsWithSortId(3, 1, someGuids.slice(0, 3))) + .mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -94,8 +90,8 @@ describe('searchAfterAndBulkCreate', () => { }, ], }) - .mockReturnValueOnce(repeatedSearchResultsWithSortId(3, 1, someGuids.slice(3, 6))) - .mockReturnValueOnce({ + .mockResolvedValueOnce(repeatedSearchResultsWithSortId(3, 1, someGuids.slice(3, 6))) + .mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -139,7 +135,7 @@ describe('searchAfterAndBulkCreate', () => { test('if unsuccessful first bulk create', async () => { const someGuids = Array.from({ length: 4 }).map(x => uuid.v4()); const sampleParams = sampleRuleAlertParams(10); - mockService.callCluster.mockReturnValue(sampleBulkCreateDuplicateResult); + mockService.callCluster.mockResolvedValue(sampleBulkCreateDuplicateResult); const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(4, 1, someGuids), ruleParams: sampleParams, @@ -169,7 +165,7 @@ describe('searchAfterAndBulkCreate', () => { test('if unsuccessful iteration of searchAfterAndBulkCreate due to empty sort ids', async () => { const sampleParams = sampleRuleAlertParams(); - mockService.callCluster.mockReturnValueOnce({ + mockService.callCluster.mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -212,7 +208,7 @@ describe('searchAfterAndBulkCreate', () => { test('if unsuccessful iteration of searchAfterAndBulkCreate due to empty sort ids and 0 total hits', async () => { const sampleParams = sampleRuleAlertParams(); - mockService.callCluster.mockReturnValueOnce({ + mockService.callCluster.mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -256,7 +252,7 @@ describe('searchAfterAndBulkCreate', () => { const sampleParams = sampleRuleAlertParams(10); const someGuids = Array.from({ length: 4 }).map(x => uuid.v4()); mockService.callCluster - .mockReturnValueOnce({ + .mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -270,7 +266,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], }) - .mockReturnValueOnce(sampleDocSearchResultsNoSortId()); + .mockResolvedValueOnce(sampleDocSearchResultsNoSortId()); const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(4, 1, someGuids), ruleParams: sampleParams, @@ -301,7 +297,7 @@ describe('searchAfterAndBulkCreate', () => { const sampleParams = sampleRuleAlertParams(10); const someGuids = Array.from({ length: 4 }).map(x => uuid.v4()); mockService.callCluster - .mockReturnValueOnce({ + .mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -315,7 +311,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], }) - .mockReturnValueOnce(sampleEmptyDocSearchResults()); + .mockResolvedValueOnce(sampleEmptyDocSearchResults()); const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(4, 1, someGuids), ruleParams: sampleParams, @@ -346,7 +342,7 @@ describe('searchAfterAndBulkCreate', () => { const sampleParams = sampleRuleAlertParams(10); const someGuids = Array.from({ length: 4 }).map(x => uuid.v4()); mockService.callCluster - .mockReturnValueOnce({ + .mockResolvedValueOnce({ took: 100, errors: false, items: [ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts index 03fb5832fdf42..31b407da111ea 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.test.ts @@ -5,11 +5,10 @@ */ import moment from 'moment'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { loggerMock } from 'src/core/server/logging/logger.mock'; import { getResult, getMlResult } from '../routes/__mocks__/request_responses'; import { signalRulesAlertType } from './signal_rule_alert_type'; -import { AlertInstance } from '../../../../../../../plugins/alerting/server'; +import { alertsMock, AlertServicesMock } from '../../../../../../../plugins/alerting/server/mocks'; import { ruleStatusServiceFactory } from './rule_status_service'; import { getGapBetweenRuns } from './utils'; import { RuleExecutorOptions } from './types'; @@ -28,18 +27,9 @@ jest.mock('../notifications/schedule_notification_actions'); jest.mock('./find_ml_signals'); jest.mock('./bulk_create_ml_signals'); -const getPayload = ( - ruleAlert: RuleAlertType, - alertInstanceFactoryMock: () => AlertInstance, - savedObjectsClient: ReturnType, - callClusterMock: jest.Mock -) => ({ +const getPayload = (ruleAlert: RuleAlertType, services: AlertServicesMock) => ({ alertId: ruleAlert.id, - services: { - savedObjectsClient, - alertInstanceFactory: alertInstanceFactoryMock, - callCluster: callClusterMock, - }, + services, params: { ...ruleAlert.params, actions: [], @@ -78,24 +68,14 @@ describe('rules_notification_alert_type', () => { modulesProvider: jest.fn(), resultsServiceProvider: jest.fn(), }; - let payload: RuleExecutorOptions; + let payload: jest.Mocked; let alert: ReturnType; - let alertInstanceMock: Record; - let alertInstanceFactoryMock: () => AlertInstance; - let savedObjectsClient: ReturnType; let logger: ReturnType; - let callClusterMock: jest.Mock; + let alertServices: AlertServicesMock; let ruleStatusService: Record; beforeEach(() => { - alertInstanceMock = { - scheduleActions: jest.fn(), - replaceState: jest.fn(), - }; - alertInstanceMock.replaceState.mockReturnValue(alertInstanceMock); - alertInstanceFactoryMock = jest.fn().mockReturnValue(alertInstanceMock); - callClusterMock = jest.fn(); - savedObjectsClient = savedObjectsClientMock.create(); + alertServices = alertsMock.createAlertServices(); logger = loggerMock.create(); ruleStatusService = { success: jest.fn(), @@ -111,20 +91,20 @@ describe('rules_notification_alert_type', () => { searchAfterTimes: [], createdSignalsCount: 10, }); - callClusterMock.mockResolvedValue({ + alertServices.callCluster.mockResolvedValue({ hits: { total: { value: 10 }, }, }); const ruleAlert = getResult(); - savedObjectsClient.get.mockResolvedValue({ + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', references: [], attributes: ruleAlert, }); - payload = getPayload(ruleAlert, alertInstanceFactoryMock, savedObjectsClient, callClusterMock); + payload = getPayload(ruleAlert, alertServices); alert = signalRulesAlertType({ logger, @@ -164,7 +144,7 @@ describe('rules_notification_alert_type', () => { }, ]; - savedObjectsClient.get.mockResolvedValue({ + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', references: [], @@ -195,7 +175,7 @@ describe('rules_notification_alert_type', () => { }, ]; - savedObjectsClient.get.mockResolvedValue({ + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', references: [], @@ -214,12 +194,7 @@ describe('rules_notification_alert_type', () => { describe('ML rule', () => { it('should throw an error if ML plugin was not available', async () => { const ruleAlert = getMlResult(); - payload = getPayload( - ruleAlert, - alertInstanceFactoryMock, - savedObjectsClient, - callClusterMock - ); + payload = getPayload(ruleAlert, alertServices); alert = signalRulesAlertType({ logger, version, @@ -235,12 +210,7 @@ describe('rules_notification_alert_type', () => { it('should throw an error if machineLearningJobId or anomalyThreshold was not null', async () => { const ruleAlert = getMlResult(); ruleAlert.params.anomalyThreshold = undefined; - payload = getPayload( - ruleAlert, - alertInstanceFactoryMock, - savedObjectsClient, - callClusterMock - ); + payload = getPayload(ruleAlert, alertServices); await alert.executor(payload); expect(logger.error).toHaveBeenCalled(); expect(logger.error.mock.calls[0][0]).toContain( @@ -250,12 +220,7 @@ describe('rules_notification_alert_type', () => { it('should throw an error if Machine learning job summary was null', async () => { const ruleAlert = getMlResult(); - payload = getPayload( - ruleAlert, - alertInstanceFactoryMock, - savedObjectsClient, - callClusterMock - ); + payload = getPayload(ruleAlert, alertServices); jobsSummaryMock.mockResolvedValue([]); await alert.executor(payload); expect(logger.warn).toHaveBeenCalled(); @@ -268,12 +233,7 @@ describe('rules_notification_alert_type', () => { it('should log an error if Machine learning job was not started', async () => { const ruleAlert = getMlResult(); - payload = getPayload( - ruleAlert, - alertInstanceFactoryMock, - savedObjectsClient, - callClusterMock - ); + payload = getPayload(ruleAlert, alertServices); jobsSummaryMock.mockResolvedValue([ { id: 'some_job_id', @@ -297,12 +257,7 @@ describe('rules_notification_alert_type', () => { it('should not call ruleStatusService.success if no anomalies were found', async () => { const ruleAlert = getMlResult(); - payload = getPayload( - ruleAlert, - alertInstanceFactoryMock, - savedObjectsClient, - callClusterMock - ); + payload = getPayload(ruleAlert, alertServices); jobsSummaryMock.mockResolvedValue([]); (findMlSignals as jest.Mock).mockResolvedValue({ hits: { @@ -320,12 +275,7 @@ describe('rules_notification_alert_type', () => { it('should call ruleStatusService.success if signals were created', async () => { const ruleAlert = getMlResult(); - payload = getPayload( - ruleAlert, - alertInstanceFactoryMock, - savedObjectsClient, - callClusterMock - ); + payload = getPayload(ruleAlert, alertServices); jobsSummaryMock.mockResolvedValue([ { id: 'some_job_id', @@ -360,13 +310,8 @@ describe('rules_notification_alert_type', () => { id: '99403909-ca9b-49ba-9d7a-7e5320e68d05', }, ]; - payload = getPayload( - ruleAlert, - alertInstanceFactoryMock, - savedObjectsClient, - callClusterMock - ); - savedObjectsClient.get.mockResolvedValue({ + payload = getPayload(ruleAlert, alertServices); + alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', type: 'type', references: [], diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts index 45365b446cbf0..3401d7417ec62 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts @@ -16,17 +16,13 @@ import { sampleBulkCreateErrorResult, sampleDocWithAncestors, } from './__mocks__/es_results'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { DEFAULT_SIGNALS_INDEX } from '../../../../common/constants'; import { singleBulkCreate, filterDuplicateRules } from './single_bulk_create'; - -export const mockService = { - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - savedObjectsClient: savedObjectsClientMock.create(), -}; +import { alertsMock, AlertServicesMock } from '../../../../../../../plugins/alerting/server/mocks'; describe('singleBulkCreate', () => { + const mockService: AlertServicesMock = alertsMock.createAlertServices(); + beforeEach(() => { jest.clearAllMocks(); }); @@ -135,7 +131,7 @@ describe('singleBulkCreate', () => { test('create successful bulk create', async () => { const sampleParams = sampleRuleAlertParams(); - mockService.callCluster.mockReturnValueOnce({ + mockService.callCluster.mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -169,7 +165,7 @@ describe('singleBulkCreate', () => { test('create successful bulk create with docs with no versioning', async () => { const sampleParams = sampleRuleAlertParams(); - mockService.callCluster.mockReturnValueOnce({ + mockService.callCluster.mockResolvedValueOnce({ took: 100, errors: false, items: [ @@ -203,7 +199,7 @@ describe('singleBulkCreate', () => { test('create unsuccessful bulk create due to empty search results', async () => { const sampleParams = sampleRuleAlertParams(); - mockService.callCluster.mockReturnValue(false); + mockService.callCluster.mockResolvedValue(false); const { success, createdItemsCount } = await singleBulkCreate({ someResult: sampleEmptyDocSearchResults(), ruleParams: sampleParams, @@ -230,7 +226,7 @@ describe('singleBulkCreate', () => { test('create successful bulk create when bulk create has duplicate errors', async () => { const sampleParams = sampleRuleAlertParams(); const sampleSearchResult = sampleDocSearchResultsNoSortId; - mockService.callCluster.mockReturnValue(sampleBulkCreateDuplicateResult); + mockService.callCluster.mockResolvedValue(sampleBulkCreateDuplicateResult); const { success, createdItemsCount } = await singleBulkCreate({ someResult: sampleSearchResult(), ruleParams: sampleParams, @@ -259,7 +255,7 @@ describe('singleBulkCreate', () => { test('create successful bulk create when bulk create has multiple error statuses', async () => { const sampleParams = sampleRuleAlertParams(); const sampleSearchResult = sampleDocSearchResultsNoSortId; - mockService.callCluster.mockReturnValue(sampleBulkCreateErrorResult); + mockService.callCluster.mockResolvedValue(sampleBulkCreateErrorResult); const { success, createdItemsCount } = await singleBulkCreate({ someResult: sampleSearchResult(), ruleParams: sampleParams, @@ -354,7 +350,7 @@ describe('singleBulkCreate', () => { test('create successful and returns proper createdItemsCount', async () => { const sampleParams = sampleRuleAlertParams(); - mockService.callCluster.mockReturnValue(sampleBulkCreateDuplicateResult); + mockService.callCluster.mockResolvedValue(sampleBulkCreateDuplicateResult); const { success, createdItemsCount } = await singleBulkCreate({ someResult: sampleDocSearchResultsNoSortId(), ruleParams: sampleParams, diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_search_after.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_search_after.test.ts index 9b726c38d3d96..dbeab70595e4f 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_search_after.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/signals/single_search_after.test.ts @@ -4,28 +4,24 @@ * you may not use this file except in compliance with the Elastic License. */ -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { sampleDocSearchResultsNoSortId, mockLogger, sampleDocSearchResultsWithSortId, } from './__mocks__/es_results'; import { singleSearchAfter } from './single_search_after'; - -export const mockService = { - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - savedObjectsClient: savedObjectsClientMock.create(), -}; +import { alertsMock, AlertServicesMock } from '../../../../../../../plugins/alerting/server/mocks'; describe('singleSearchAfter', () => { + const mockService: AlertServicesMock = alertsMock.createAlertServices(); + beforeEach(() => { jest.clearAllMocks(); }); test('if singleSearchAfter works without a given sort id', async () => { let searchAfterSortId; - mockService.callCluster.mockReturnValue(sampleDocSearchResultsNoSortId); + mockService.callCluster.mockResolvedValue(sampleDocSearchResultsNoSortId); await expect( singleSearchAfter({ searchAfterSortId, @@ -41,7 +37,7 @@ describe('singleSearchAfter', () => { }); test('if singleSearchAfter works with a given sort id', async () => { const searchAfterSortId = '1234567891111'; - mockService.callCluster.mockReturnValue(sampleDocSearchResultsWithSortId); + mockService.callCluster.mockResolvedValue(sampleDocSearchResultsWithSortId); const { searchResult } = await singleSearchAfter({ searchAfterSortId, index: [], diff --git a/x-pack/plugins/alerting/server/mocks.ts b/x-pack/plugins/alerting/server/mocks.ts index 55ad722dcf881..a9e224142a632 100644 --- a/x-pack/plugins/alerting/server/mocks.ts +++ b/x-pack/plugins/alerting/server/mocks.ts @@ -6,6 +6,8 @@ import { alertsClientMock } from './alerts_client.mock'; import { PluginSetupContract, PluginStartContract } from './plugin'; +import { savedObjectsClientMock } from '../../../../src/core/server/mocks'; +import { AlertInstance } from './alert_instance'; export { alertsClientMock }; @@ -24,7 +26,44 @@ const createStartMock = () => { return mock; }; +export type AlertInstanceMock = jest.Mocked; +const createAlertInstanceFactoryMock = () => { + const mock = { + hasScheduledActions: jest.fn(), + isThrottled: jest.fn(), + getScheduledActionOptions: jest.fn(), + unscheduleActions: jest.fn(), + getState: jest.fn(), + scheduleActions: jest.fn(), + replaceState: jest.fn(), + updateLastScheduledActions: jest.fn(), + toJSON: jest.fn(), + toRaw: jest.fn(), + }; + + // support chaining + mock.replaceState.mockReturnValue(mock); + mock.unscheduleActions.mockReturnValue(mock); + mock.scheduleActions.mockReturnValue(mock); + + return (mock as unknown) as AlertInstanceMock; +}; + +const createAlertServicesMock = () => { + const alertInstanceFactoryMock = createAlertInstanceFactoryMock(); + return { + alertInstanceFactory: jest + .fn, [string]>() + .mockReturnValue(alertInstanceFactoryMock), + callCluster: jest.fn(), + savedObjectsClient: savedObjectsClientMock.create(), + }; +}; +export type AlertServicesMock = ReturnType; + export const alertsMock = { + createAlertInstanceFactory: createAlertInstanceFactoryMock, createSetup: createSetupMock, createStart: createStartMock, + createAlertServices: createAlertServicesMock, }; diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts index 38cd0cec145f9..000d0823311b3 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts @@ -8,62 +8,77 @@ import { createMetricThresholdExecutor, FIRED_ACTIONS } from './metric_threshold import { Comparator, AlertStates } from './types'; import * as mocks from './test_mocks'; import { AlertExecutorOptions } from '../../../../../alerting/server'; +import { + alertsMock, + AlertServicesMock, + AlertInstanceMock, +} from '../../../../../alerting/server/mocks'; const executor = createMetricThresholdExecutor('test') as (opts: { params: AlertExecutorOptions['params']; services: { callCluster: AlertExecutorOptions['params']['callCluster'] }; }) => Promise; -const alertInstances = new Map(); -const services = { - callCluster(_: string, { body, index }: any) { - if (index === 'alternatebeat-*') return mocks.changedSourceIdResponse; - const metric = body.query.bool.filter[1]?.exists.field; - if (body.aggs.groupings) { - if (body.aggs.groupings.composite.after) { - return mocks.compositeEndResponse; - } - if (metric === 'test.metric.2') { - return mocks.alternateCompositeResponse; - } - return mocks.basicCompositeResponse; +const services: AlertServicesMock = alertsMock.createAlertServices(); +services.callCluster.mockImplementation((_: string, { body, index }: any) => { + if (index === 'alternatebeat-*') return mocks.changedSourceIdResponse; + const metric = body.query.bool.filter[1]?.exists.field; + if (body.aggs.groupings) { + if (body.aggs.groupings.composite.after) { + return mocks.compositeEndResponse; } if (metric === 'test.metric.2') { - return mocks.alternateMetricResponse; + return mocks.alternateCompositeResponse; } - return mocks.basicMetricResponse; - }, - alertInstanceFactory(instanceID: string) { - let state: any; - const actionQueue: any[] = []; - const instance = { - actionQueue: [], - get state() { - return state; - }, - get mostRecentAction() { - return actionQueue.pop(); - }, - }; - alertInstances.set(instanceID, instance); + return mocks.basicCompositeResponse; + } + if (metric === 'test.metric.2') { + return mocks.alternateMetricResponse; + } + return mocks.basicMetricResponse; +}); +services.savedObjectsClient.get.mockImplementation(async (type: string, sourceId: string) => { + if (sourceId === 'alternate') return { - instanceID, - scheduleActions(id: string, action: any) { - actionQueue.push({ id, action }); - }, - replaceState(newState: any) { - state = newState; - }, + id: 'alternate', + attributes: { metricAlias: 'alternatebeat-*' }, + type, + references: [], }; - }, - savedObjectsClient: { - get(_: string, sourceId: string) { - if (sourceId === 'alternate') - return { id: 'alternate', attributes: { metricAlias: 'alternatebeat-*' } }; - return { id: 'default', attributes: { metricAlias: 'metricbeat-*' } }; - }, - }, -}; + return { id: 'default', attributes: { metricAlias: 'metricbeat-*' }, type, references: [] }; +}); + +interface AlertTestInstance { + instance: AlertInstanceMock; + actionQueue: any[]; + state: any; +} +const alertInstances = new Map(); +services.alertInstanceFactory.mockImplementation((instanceID: string) => { + const alertInstance: AlertTestInstance = { + instance: alertsMock.createAlertInstanceFactory(), + actionQueue: [], + state: {}, + }; + alertInstances.set(instanceID, alertInstance); + alertInstance.instance.replaceState.mockImplementation((newState: any) => { + alertInstance.state = newState; + return alertInstance.instance; + }); + alertInstance.instance.scheduleActions.mockImplementation((id: string, action: any) => { + alertInstance.actionQueue.push({ id, action }); + return alertInstance.instance; + }); + return alertInstance.instance; +}); + +function mostRecentAction(id: string) { + return alertInstances.get(id)!.actionQueue.pop(); +} + +function getState(id: string) { + return alertInstances.get(id)!.state; +} const baseCriterion = { aggType: 'avg', @@ -90,65 +105,65 @@ describe('The metric threshold alert type', () => { }); test('alerts as expected with the > comparator', async () => { await execute(Comparator.GT, [0.75]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.GT, [1.5]); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); test('alerts as expected with the < comparator', async () => { await execute(Comparator.LT, [1.5]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.LT, [0.75]); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); test('alerts as expected with the >= comparator', async () => { await execute(Comparator.GT_OR_EQ, [0.75]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.GT_OR_EQ, [1.0]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.GT_OR_EQ, [1.5]); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); test('alerts as expected with the <= comparator', async () => { await execute(Comparator.LT_OR_EQ, [1.5]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.LT_OR_EQ, [1.0]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.LT_OR_EQ, [0.75]); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); test('alerts as expected with the between comparator', async () => { await execute(Comparator.BETWEEN, [0, 1.5]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.BETWEEN, [0, 0.75]); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); test('reports expected values to the action context', async () => { await execute(Comparator.GT, [0.75]); - const mostRecentAction = alertInstances.get(instanceID).mostRecentAction; - expect(mostRecentAction.action.group).toBe('*'); - expect(mostRecentAction.action.valueOf.condition0).toBe(1); - expect(mostRecentAction.action.thresholdOf.condition0).toStrictEqual([0.75]); - expect(mostRecentAction.action.metricOf.condition0).toBe('test.metric.1'); + const { action } = mostRecentAction(instanceID); + expect(action.group).toBe('*'); + expect(action.valueOf.condition0).toBe(1); + expect(action.thresholdOf.condition0).toStrictEqual([0.75]); + expect(action.metricOf.condition0).toBe('test.metric.1'); }); test('fetches the index pattern dynamically', async () => { await execute(Comparator.LT, [17], 'alternate'); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.LT, [1.5], 'alternate'); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); }); @@ -171,29 +186,29 @@ describe('The metric threshold alert type', () => { const instanceIdB = 'test-b'; test('sends an alert when all groups pass the threshold', async () => { await execute(Comparator.GT, [0.75]); - expect(alertInstances.get(instanceIdA).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceIdA).state.alertState).toBe(AlertStates.ALERT); - expect(alertInstances.get(instanceIdB).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceIdB).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceIdA).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceIdA).alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceIdB).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceIdB).alertState).toBe(AlertStates.ALERT); }); test('sends an alert when only some groups pass the threshold', async () => { await execute(Comparator.LT, [1.5]); - expect(alertInstances.get(instanceIdA).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceIdA).state.alertState).toBe(AlertStates.ALERT); - expect(alertInstances.get(instanceIdB).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceIdB).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceIdA).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceIdA).alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceIdB)).toBe(undefined); + expect(getState(instanceIdB).alertState).toBe(AlertStates.OK); }); test('sends no alert when no groups pass the threshold', async () => { await execute(Comparator.GT, [5]); - expect(alertInstances.get(instanceIdA).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceIdA).state.alertState).toBe(AlertStates.OK); - expect(alertInstances.get(instanceIdB).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceIdB).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceIdA)).toBe(undefined); + expect(getState(instanceIdA).alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceIdB)).toBe(undefined); + expect(getState(instanceIdB).alertState).toBe(AlertStates.OK); }); test('reports group values to the action context', async () => { await execute(Comparator.GT, [0.75]); - expect(alertInstances.get(instanceIdA).mostRecentAction.action.group).toBe('a'); - expect(alertInstances.get(instanceIdB).mostRecentAction.action.group).toBe('b'); + expect(mostRecentAction(instanceIdA).action.group).toBe('a'); + expect(mostRecentAction(instanceIdB).action.group).toBe('b'); }); }); @@ -226,34 +241,34 @@ describe('The metric threshold alert type', () => { test('sends an alert when all criteria cross the threshold', async () => { const instanceID = 'test-*'; await execute(Comparator.GT_OR_EQ, [1.0], [3.0]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); }); test('sends no alert when some, but not all, criteria cross the threshold', async () => { const instanceID = 'test-*'; await execute(Comparator.LT_OR_EQ, [1.0], [3.0]); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); test('alerts only on groups that meet all criteria when querying with a groupBy parameter', async () => { const instanceIdA = 'test-a'; const instanceIdB = 'test-b'; await execute(Comparator.GT_OR_EQ, [1.0], [3.0], 'something'); - expect(alertInstances.get(instanceIdA).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceIdA).state.alertState).toBe(AlertStates.ALERT); - expect(alertInstances.get(instanceIdB).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceIdB).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceIdA).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceIdA).alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceIdB)).toBe(undefined); + expect(getState(instanceIdB).alertState).toBe(AlertStates.OK); }); test('sends all criteria to the action context', async () => { const instanceID = 'test-*'; await execute(Comparator.GT_OR_EQ, [1.0], [3.0]); - const mostRecentAction = alertInstances.get(instanceID).mostRecentAction; - expect(mostRecentAction.action.valueOf.condition0).toBe(1); - expect(mostRecentAction.action.valueOf.condition1).toBe(3.5); - expect(mostRecentAction.action.thresholdOf.condition0).toStrictEqual([1.0]); - expect(mostRecentAction.action.thresholdOf.condition1).toStrictEqual([3.0]); - expect(mostRecentAction.action.metricOf.condition0).toBe('test.metric.1'); - expect(mostRecentAction.action.metricOf.condition1).toBe('test.metric.2'); + const { action } = mostRecentAction(instanceID); + expect(action.valueOf.condition0).toBe(1); + expect(action.valueOf.condition1).toBe(3.5); + expect(action.thresholdOf.condition0).toStrictEqual([1.0]); + expect(action.thresholdOf.condition1).toStrictEqual([3.0]); + expect(action.metricOf.condition0).toBe('test.metric.1'); + expect(action.metricOf.condition1).toBe('test.metric.2'); }); }); describe('querying with the count aggregator', () => { @@ -275,11 +290,11 @@ describe('The metric threshold alert type', () => { }); test('alerts based on the doc_count value instead of the aggregatedValue', async () => { await execute(Comparator.GT, [2]); - expect(alertInstances.get(instanceID).mostRecentAction.id).toBe(FIRED_ACTIONS.id); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.ALERT); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); await execute(Comparator.LT, [1.5]); - expect(alertInstances.get(instanceID).mostRecentAction).toBe(undefined); - expect(alertInstances.get(instanceID).state.alertState).toBe(AlertStates.OK); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/cluster_state.test.ts b/x-pack/plugins/monitoring/server/alerts/cluster_state.test.ts index 6a9ca88437347..bcc1a8abe5cb0 100644 --- a/x-pack/plugins/monitoring/server/alerts/cluster_state.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/cluster_state.test.ts @@ -4,14 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ import { Logger } from 'src/core/server'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { getClusterState } from './cluster_state'; -import { AlertServices } from '../../../alerting/server'; import { ALERT_TYPE_CLUSTER_STATE } from '../../common/constants'; import { AlertCommonParams, AlertCommonState, AlertClusterStatePerClusterState } from './types'; import { getPreparedAlert } from '../lib/alerts/get_prepared_alert'; import { executeActions } from '../lib/alerts/cluster_state.lib'; import { AlertClusterStateState } from './enums'; +import { alertsMock, AlertServicesMock } from '../../../alerting/server/mocks'; jest.mock('../lib/alerts/cluster_state.lib', () => ({ executeActions: jest.fn(), @@ -26,18 +25,8 @@ jest.mock('../lib/alerts/get_prepared_alert', () => ({ }), })); -interface MockServices { - callCluster: jest.Mock; - alertInstanceFactory: jest.Mock; - savedObjectsClient: jest.Mock; -} - describe('getClusterState', () => { - const services: MockServices | AlertServices = { - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - savedObjectsClient: savedObjectsClientMock.create(), - }; + const services: AlertServicesMock = alertsMock.createAlertServices(); const params: AlertCommonParams = { dateFormat: 'YYYY', @@ -107,7 +96,7 @@ describe('getClusterState', () => { it('should alert if green -> yellow', async () => { const result = await setupAlert(AlertClusterStateState.Green, AlertClusterStateState.Yellow); expect(executeActions).toHaveBeenCalledWith( - undefined, + services.alertInstanceFactory(ALERT_TYPE_CLUSTER_STATE), cluster, AlertClusterStateState.Yellow, emailAddress @@ -121,7 +110,7 @@ describe('getClusterState', () => { it('should alert if yellow -> green', async () => { const result = await setupAlert(AlertClusterStateState.Yellow, AlertClusterStateState.Green); expect(executeActions).toHaveBeenCalledWith( - undefined, + services.alertInstanceFactory(ALERT_TYPE_CLUSTER_STATE), cluster, AlertClusterStateState.Green, emailAddress, @@ -135,7 +124,7 @@ describe('getClusterState', () => { it('should alert if green -> red', async () => { const result = await setupAlert(AlertClusterStateState.Green, AlertClusterStateState.Red); expect(executeActions).toHaveBeenCalledWith( - undefined, + services.alertInstanceFactory(ALERT_TYPE_CLUSTER_STATE), cluster, AlertClusterStateState.Red, emailAddress @@ -149,7 +138,7 @@ describe('getClusterState', () => { it('should alert if red -> green', async () => { const result = await setupAlert(AlertClusterStateState.Red, AlertClusterStateState.Green); expect(executeActions).toHaveBeenCalledWith( - undefined, + services.alertInstanceFactory(ALERT_TYPE_CLUSTER_STATE), cluster, AlertClusterStateState.Green, emailAddress, diff --git a/x-pack/plugins/monitoring/server/alerts/license_expiration.test.ts b/x-pack/plugins/monitoring/server/alerts/license_expiration.test.ts index 92047e300bc1f..f9d2ec3e1d48e 100644 --- a/x-pack/plugins/monitoring/server/alerts/license_expiration.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/license_expiration.test.ts @@ -8,8 +8,6 @@ import moment from 'moment-timezone'; import { getLicenseExpiration } from './license_expiration'; import { ALERT_TYPE_LICENSE_EXPIRATION } from '../../common/constants'; import { Logger } from 'src/core/server'; -import { AlertServices } from '../../../alerting/server'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { AlertCommonParams, AlertCommonState, @@ -18,6 +16,7 @@ import { } from './types'; import { executeActions } from '../lib/alerts/license_expiration.lib'; import { PreparedAlert, getPreparedAlert } from '../lib/alerts/get_prepared_alert'; +import { alertsMock, AlertServicesMock } from '../../../alerting/server/mocks'; jest.mock('../lib/alerts/license_expiration.lib', () => ({ executeActions: jest.fn(), @@ -32,18 +31,8 @@ jest.mock('../lib/alerts/get_prepared_alert', () => ({ }), })); -interface MockServices { - callCluster: jest.Mock; - alertInstanceFactory: jest.Mock; - savedObjectsClient: jest.Mock; -} - describe('getLicenseExpiration', () => { - const services: MockServices | AlertServices = { - callCluster: jest.fn(), - alertInstanceFactory: jest.fn(), - savedObjectsClient: savedObjectsClientMock.create(), - }; + const services: AlertServicesMock = alertsMock.createAlertServices(); const params: AlertCommonParams = { dateFormat: 'YYYY', @@ -106,6 +95,7 @@ describe('getLicenseExpiration', () => { } afterEach(() => { + jest.clearAllMocks(); (executeActions as jest.Mock).mockClear(); (getPreparedAlert as jest.Mock).mockClear(); }); @@ -135,7 +125,7 @@ describe('getLicenseExpiration', () => { const newState = result[clusterUuid] as AlertLicensePerClusterState; expect(newState.expiredCheckDateMS > 0).toBe(true); expect(executeActions).toHaveBeenCalledWith( - undefined, + services.alertInstanceFactory(ALERT_TYPE_LICENSE_EXPIRATION), cluster, moment.utc(expiryDateMS), dateFormat, @@ -157,7 +147,7 @@ describe('getLicenseExpiration', () => { const newState = result[clusterUuid] as AlertLicensePerClusterState; expect(newState.expiredCheckDateMS).toBe(0); expect(executeActions).toHaveBeenCalledWith( - undefined, + services.alertInstanceFactory(ALERT_TYPE_LICENSE_EXPIRATION), cluster, moment.utc(expiryDateMS), dateFormat, @@ -196,7 +186,7 @@ describe('getLicenseExpiration', () => { const newState = result[clusterUuid] as AlertLicensePerClusterState; expect(newState.expiredCheckDateMS > 0).toBe(true); expect(executeActions).toHaveBeenCalledWith( - undefined, + services.alertInstanceFactory(ALERT_TYPE_LICENSE_EXPIRATION), cluster, moment.utc(expiryDateMS), dateFormat, diff --git a/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts b/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts index 08a3bc75fa8bd..2eb17d588d297 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts @@ -17,6 +17,7 @@ import { IRouter } from 'kibana/server'; import { UMServerLibs } from '../../lib'; import { UptimeCoreSetup } from '../../adapters'; import { defaultDynamicSettings } from '../../../../../../legacy/plugins/uptime/common/runtime_types'; +import { alertsMock, AlertServicesMock } from '../../../../../alerting/server/mocks'; /** * The alert takes some dependencies as parameters; these are things like @@ -44,16 +45,21 @@ const bootstrapDependencies = (customRequests?: any) => { */ const mockOptions = ( params = { numTimes: 5, locations: [], timerange: { from: 'now-15m', to: 'now' } }, - services = { callCluster: 'mockESFunction', savedObjectsClient: mockSavedObjectsClient }, + services = alertsMock.createAlertServices(), state = {} -): any => ({ - params, - services, - state, -}); - -const mockSavedObjectsClient = { get: jest.fn() }; -mockSavedObjectsClient.get.mockReturnValue(defaultDynamicSettings); +): any => { + services.savedObjectsClient.get.mockResolvedValue({ + id: '', + type: '', + references: [], + attributes: defaultDynamicSettings, + }); + return { + params, + services, + state, + }; +}; describe('status check alert', () => { let toISOStringSpy: jest.SpyInstance; @@ -80,8 +86,10 @@ describe('status check alert', () => { expect(mockGetter.mock.calls[0]).toMatchInlineSnapshot(` Array [ Object { - "callES": "mockESFunction", - "dynamicSettings": undefined, + "callES": [MockFunction], + "dynamicSettings": Object { + "heartbeatIndices": "heartbeat-8*", + }, "locations": Array [], "numTimes": 5, "timerange": Object { @@ -112,27 +120,19 @@ describe('status check alert', () => { ]); const { server, libs } = bootstrapDependencies({ getMonitorStatus: mockGetter }); const alert = statusCheckAlertFactory(server, libs); - const mockInstanceFactory = jest.fn(); - const mockReplaceState = jest.fn(); - const mockScheduleActions = jest.fn(); - mockInstanceFactory.mockReturnValue({ - replaceState: mockReplaceState, - scheduleActions: mockScheduleActions, - }); const options = mockOptions(); - options.services = { - ...options.services, - alertInstanceFactory: mockInstanceFactory, - }; + const alertServices: AlertServicesMock = options.services; // @ts-ignore the executor can return `void`, but ours never does const state: Record = await alert.executor(options); expect(mockGetter).toHaveBeenCalledTimes(1); - expect(mockInstanceFactory).toHaveBeenCalledTimes(1); + expect(alertServices.alertInstanceFactory).toHaveBeenCalledTimes(1); expect(mockGetter.mock.calls[0]).toMatchInlineSnapshot(` Array [ Object { - "callES": "mockESFunction", - "dynamicSettings": undefined, + "callES": [MockFunction], + "dynamicSettings": Object { + "heartbeatIndices": "heartbeat-8*", + }, "locations": Array [], "numTimes": 5, "timerange": Object { @@ -142,8 +142,9 @@ describe('status check alert', () => { }, ] `); - expect(mockReplaceState).toHaveBeenCalledTimes(1); - expect(mockReplaceState.mock.calls[0]).toMatchInlineSnapshot(` + const [{ value: alertInstanceMock }] = alertServices.alertInstanceFactory.mock.results; + expect(alertInstanceMock.replaceState).toHaveBeenCalledTimes(1); + expect(alertInstanceMock.replaceState.mock.calls[0]).toMatchInlineSnapshot(` Array [ Object { "currentTriggerStarted": "foo date string", @@ -170,8 +171,8 @@ describe('status check alert', () => { }, ] `); - expect(mockScheduleActions).toHaveBeenCalledTimes(1); - expect(mockScheduleActions.mock.calls[0]).toMatchInlineSnapshot(` + expect(alertInstanceMock.scheduleActions).toHaveBeenCalledTimes(1); + expect(alertInstanceMock.scheduleActions.mock.calls[0]).toMatchInlineSnapshot(` Array [ "xpack.uptime.alerts.actionGroups.monitorStatus", Object { From 02cba104696bf9ee3c06a29dfc523c727fbeca59 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Thu, 16 Apr 2020 09:51:03 +0200 Subject: [PATCH 46/80] Fix discover preserve url (#63580) --- x-pack/test/functional/apps/discover/preserve_url.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/x-pack/test/functional/apps/discover/preserve_url.ts b/x-pack/test/functional/apps/discover/preserve_url.ts index 85142336a0a6b..9b9b2e2c60840 100644 --- a/x-pack/test/functional/apps/discover/preserve_url.ts +++ b/x-pack/test/functional/apps/discover/preserve_url.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const PageObjects = getPageObjects(['common', 'discover', 'spaceSelector', 'header']); - const appsMenu = getService('appsMenu'); const globalNav = getService('globalNav'); describe('preserve url', function() { @@ -26,8 +25,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.saveSearch('A Search'); await PageObjects.common.navigateToApp('home'); - await appsMenu.clickLink('Discover'); - await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.header.clickDiscover(); const activeTitle = await globalNav.getLastBreadcrumb(); expect(activeTitle).to.be('A Search'); }); @@ -42,7 +40,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.spaceSelector.expectHomePage('another-space'); // other space - await appsMenu.clickLink('Discover'); + await PageObjects.header.clickDiscover(); await PageObjects.discover.saveSearch('A Search in another space'); await PageObjects.spaceSelector.openSpacesNav(); @@ -50,7 +48,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.spaceSelector.expectHomePage('default'); // default space - await appsMenu.clickLink('Discover'); + await PageObjects.header.clickDiscover(); await PageObjects.discover.waitUntilSearchingHasFinished(); const activeTitleDefaultSpace = await globalNav.getLastBreadcrumb(); expect(activeTitleDefaultSpace).to.be('A Search'); @@ -60,7 +58,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.spaceSelector.expectHomePage('another-space'); // other space - await appsMenu.clickLink('Discover'); + await PageObjects.header.clickDiscover(); await PageObjects.discover.waitUntilSearchingHasFinished(); const activeTitleOtherSpace = await globalNav.getLastBreadcrumb(); expect(activeTitleOtherSpace).to.be('A Search in another space'); From 7b74aa9d69acffa1dc08b97aa57b4cb407fc7aa5 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Thu, 16 Apr 2020 10:17:15 +0100 Subject: [PATCH 47/80] [SIEM] move away from Joi for importing/exporting timeline (#62125) * move away from joi * update schema for filterQuery * fix types * update schemas * remove boom * remove redundant params * reuse utils from case * update schemas for query params and body * fix types * update validation schema * fix unit test * update description for test cases * remove import from case * lifting common libs * fix dependency * lifting validation builder function * add unit test * fix for code review * reve comments * rename common utils * fix types --- .../routes/rules/import_rules_route.ts | 2 +- .../routes/rules/utils.test.ts | 45 +---- .../detection_engine/routes/rules/utils.ts | 9 - .../rules/create_rules_stream_from_ndjson.ts | 45 +---- .../detection_engine/rules/get_export_all.ts | 3 +- .../rules/get_export_by_object_ids.ts | 3 +- .../create_timelines_stream_from_ndjson.ts | 40 +++-- .../routes/__mocks__/request_responses.ts | 9 +- .../routes/export_timelines_route.test.ts | 23 ++- .../timeline/routes/export_timelines_route.ts | 22 +-- .../routes/import_timelines_route.test.ts | 5 +- .../timeline/routes/import_timelines_route.ts | 46 ++--- .../routes/schemas/export_timelines_schema.ts | 18 +- .../routes/schemas/import_timelines_schema.ts | 84 ++++------ .../lib/timeline/routes/schemas/schemas.ts | 158 +----------------- .../timeline/routes/utils/export_timelines.ts | 25 +-- .../plugins/siem/server/lib/timeline/types.ts | 19 +-- .../build_validation/route_validation.test.ts | 39 +++++ .../build_validation/route_validation.ts | 39 +++++ .../create_stream_from_ndjson.test.ts | 69 ++++++++ .../read_stream/create_stream_from_ndjson.ts | 73 ++++++++ 21 files changed, 378 insertions(+), 398 deletions(-) create mode 100644 x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.test.ts create mode 100644 x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.ts create mode 100644 x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.test.ts create mode 100644 x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.ts diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 29ae5056a3ae8..57ccc7a7806ac 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -26,13 +26,13 @@ import { buildSiemResponse, validateLicenseForRuleType, } from '../utils'; -import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; import { ImportRuleAlertRest } from '../../types'; import { patchRules } from '../../rules/patch_rules'; import { importRulesQuerySchema, importRulesPayloadSchema } from '../schemas/import_rules_schema'; import { ImportRulesSchema, importRulesSchema } from '../schemas/response/import_rules_schema'; import { getTupleDuplicateErrorsAndUniqueRules } from './utils'; import { validate } from './validate'; +import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; type PromiseFromStreams = ImportRuleAlertRest | Error; diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.test.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.test.ts index 31a0f37fe81c9..8b1b0cab3b2f2 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.test.ts @@ -12,7 +12,6 @@ import { transformTags, getIdBulkError, transformOrBulkError, - transformDataToNdjson, transformAlertsToRules, transformOrImportError, getDuplicates, @@ -22,14 +21,13 @@ import { getResult } from '../__mocks__/request_responses'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; import { ImportRuleAlertRest, RuleAlertParamsRest, RuleTypeParams } from '../../types'; import { BulkError, ImportSuccessError } from '../utils'; -import { sampleRule } from '../../signals/__mocks__/es_results'; import { getSimpleRule, getOutputRuleAlertForRest } from '../__mocks__/utils'; -import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; import { createPromiseFromStreams } from '../../../../../../../../../src/legacy/utils/streams'; import { PartialAlert } from '../../../../../../../../plugins/alerting/server'; import { SanitizedAlert } from '../../../../../../../../plugins/alerting/server/types'; import { RuleAlertType } from '../../rules/types'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; type PromiseFromStreams = ImportRuleAlertRest | Error; @@ -396,47 +394,6 @@ describe('utils', () => { }); }); - describe('transformDataToNdjson', () => { - test('if rules are empty it returns an empty string', () => { - const ruleNdjson = transformDataToNdjson([]); - expect(ruleNdjson).toEqual(''); - }); - - test('single rule will transform with new line ending character for ndjson', () => { - const rule = sampleRule(); - const ruleNdjson = transformDataToNdjson([rule]); - expect(ruleNdjson.endsWith('\n')).toBe(true); - }); - - test('multiple rules will transform with two new line ending characters for ndjson', () => { - const result1 = sampleRule(); - const result2 = sampleRule(); - result2.id = 'some other id'; - result2.rule_id = 'some other id'; - result2.name = 'Some other rule'; - - const ruleNdjson = transformDataToNdjson([result1, result2]); - // this is how we count characters in JavaScript :-) - const count = ruleNdjson.split('\n').length - 1; - expect(count).toBe(2); - }); - - test('you can parse two rules back out without errors', () => { - const result1 = sampleRule(); - const result2 = sampleRule(); - result2.id = 'some other id'; - result2.rule_id = 'some other id'; - result2.name = 'Some other rule'; - - const ruleNdjson = transformDataToNdjson([result1, result2]); - const ruleStrings = ruleNdjson.split('\n'); - const reParsed1 = JSON.parse(ruleStrings[0]); - const reParsed2 = JSON.parse(ruleStrings[1]); - expect(reParsed1).toEqual(result1); - expect(reParsed2).toEqual(result2); - }); - }); - describe('transformAlertsToRules', () => { test('given an empty array returns an empty array', () => { expect(transformAlertsToRules([])).toEqual([]); diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts index 4d13fa1b6ae50..790603fa8cfc1 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/routes/rules/utils.ts @@ -152,15 +152,6 @@ export const transformAlertToRule = ( }); }; -export const transformDataToNdjson = (data: unknown[]): string => { - if (data.length !== 0) { - const dataString = data.map(rule => JSON.stringify(rule)).join('\n'); - return `${dataString}\n`; - } else { - return ''; - } -}; - export const transformAlertsToRules = ( alerts: RuleAlertType[] ): Array> => { diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts index 3e22999528101..27008d17d2192 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts @@ -4,39 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ import { Transform } from 'stream'; -import { has, isString } from 'lodash/fp'; import { ImportRuleAlertRest } from '../types'; import { createSplitStream, createMapStream, - createFilterStream, createConcatStream, } from '../../../../../../../../src/legacy/utils/streams'; import { importRulesSchema } from '../routes/schemas/import_rules_schema'; import { BadRequestError } from '../errors/bad_request_error'; - -export interface RulesObjectsExportResultDetails { - /** number of successfully exported objects */ - exportedCount: number; -} - -export const parseNdjsonStrings = (): Transform => { - return createMapStream((ndJsonStr: string) => { - if (isString(ndJsonStr) && ndJsonStr.trim() !== '') { - try { - return JSON.parse(ndJsonStr); - } catch (err) { - return err; - } - } - }); -}; - -export const filterExportedCounts = (): Transform => { - return createFilterStream( - obj => obj != null && !has('exported_count', obj) - ); -}; +import { + parseNdjsonStrings, + filterExportedCounts, + createLimitStream, +} from '../../../utils/read_stream/create_stream_from_ndjson'; export const validateRules = (): Transform => { return createMapStream((obj: ImportRuleAlertRest) => { @@ -53,21 +33,6 @@ export const validateRules = (): Transform => { }); }; -// Adaptation from: saved_objects/import/create_limit_stream.ts -export const createLimitStream = (limit: number): Transform => { - let counter = 0; - return new Transform({ - objectMode: true, - async transform(obj, _, done) { - if (counter >= limit) { - return done(new Error(`Can't import more than ${limit} rules`)); - } - counter++; - done(undefined, obj); - }, - }); -}; - // TODO: Capture both the line number and the rule_id if you have that information for the error message // eventually and then pass it down so we can give error messages on the line number diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.ts index 6a27abb66ce85..40c07f28ea848 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_all.ts @@ -7,7 +7,8 @@ import { AlertsClient } from '../../../../../../../plugins/alerting/server'; import { getNonPackagedRules } from './get_existing_prepackaged_rules'; import { getExportDetailsNdjson } from './get_export_details_ndjson'; -import { transformAlertsToRules, transformDataToNdjson } from '../routes/rules/utils'; +import { transformAlertsToRules } from '../routes/rules/utils'; +import { transformDataToNdjson } from '../../../utils/read_stream/create_stream_from_ndjson'; export const getExportAll = async ( alertsClient: AlertsClient diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.ts b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.ts index 6f642231ebbaf..048f09e95b062 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.ts +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/rules/get_export_by_object_ids.ts @@ -8,8 +8,9 @@ import { AlertsClient } from '../../../../../../../plugins/alerting/server'; import { getExportDetailsNdjson } from './get_export_details_ndjson'; import { isAlertType } from '../rules/types'; import { readRules } from './read_rules'; -import { transformDataToNdjson, transformAlertToRule } from '../routes/rules/utils'; +import { transformAlertToRule } from '../routes/rules/utils'; import { OutputRuleAlertRest } from '../types'; +import { transformDataToNdjson } from '../../../utils/read_stream/create_stream_from_ndjson'; interface ExportSuccesRule { statusCode: 200; diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts index 5373570a4f8cc..16654b2863ee5 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts @@ -3,8 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - +import * as rt from 'io-ts'; import { Transform } from 'stream'; +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { failure } from 'io-ts/lib/PathReporter'; +import { identity } from 'fp-ts/lib/function'; import { createConcatStream, createSplitStream, @@ -14,26 +18,28 @@ import { parseNdjsonStrings, filterExportedCounts, createLimitStream, -} from '../detection_engine/rules/create_rules_stream_from_ndjson'; -import { importTimelinesSchema } from './routes/schemas/import_timelines_schema'; -import { BadRequestError } from '../detection_engine/errors/bad_request_error'; +} from '../../utils/read_stream/create_stream_from_ndjson'; + import { ImportTimelineResponse } from './routes/utils/import_timelines'; +import { ImportTimelinesSchemaRt } from './routes/schemas/import_timelines_schema'; + +type ErrorFactory = (message: string) => Error; -export const validateTimelines = (): Transform => { - return createMapStream((obj: ImportTimelineResponse) => { - if (!(obj instanceof Error)) { - const validated = importTimelinesSchema.validate(obj); - if (validated.error != null) { - return new BadRequestError(validated.error.message); - } else { - return validated.value; - } - } else { - return obj; - } - }); +export const createPlainError = (message: string) => new Error(message); + +export const throwErrors = (createError: ErrorFactory) => (errors: rt.Errors) => { + throw createError(failure(errors).join('\n')); }; +export const decodeOrThrow = ( + runtimeType: rt.Type, + createError: ErrorFactory = createPlainError +) => (inputValue: I) => + pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); + +export const validateTimelines = (): Transform => + createMapStream((obj: ImportTimelineResponse) => decodeOrThrow(ImportTimelinesSchemaRt)(obj)); + export const createTimelinesStreamFromNdJson = (ruleLimit: number) => { return [ createSplitStream('\n'), diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts index 0e73e4bdd6c97..a83c443773302 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts @@ -6,11 +6,16 @@ import { TIMELINE_EXPORT_URL, TIMELINE_IMPORT_URL } from '../../../../../common/constants'; import { requestMock } from '../../../detection_engine/routes/__mocks__'; - +import stream from 'stream'; +const readable = new stream.Readable(); export const getExportTimelinesRequest = () => requestMock.create({ method: 'get', path: TIMELINE_EXPORT_URL, + query: { + file_name: 'mock_export_timeline.ndjson', + exclude_export_details: 'false', + }, body: { ids: ['f0e58720-57b6-11ea-b88d-3f1a31716be8', '890b8ae0-57df-11ea-a7c9-3976b7f1cb37'], }, @@ -22,7 +27,7 @@ export const getImportTimelinesRequest = (filename?: string) => path: TIMELINE_IMPORT_URL, query: { overwrite: false }, body: { - file: { hapi: { filename: filename ?? 'filename.ndjson' } }, + file: { ...readable, hapi: { filename: filename ?? 'filename.ndjson' } }, }, }); diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.test.ts index fe434b5399212..4eadede40f5d9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.test.ts @@ -83,7 +83,7 @@ describe('export timelines', () => { }); describe('request validation', () => { - test('disallows singular id query param', async () => { + test('return validation error for request body', async () => { const request = requestMock.create({ method: 'get', path: TIMELINE_EXPORT_URL, @@ -91,7 +91,26 @@ describe('export timelines', () => { }); const result = server.validate(request); - expect(result.badRequest).toHaveBeenCalledWith('"id" is not allowed'); + expect(result.badRequest.mock.calls[0][0]).toEqual( + 'Invalid value undefined supplied to : { ids: Array }/ids: Array' + ); + }); + + test('return validation error for request params', async () => { + const request = requestMock.create({ + method: 'get', + path: TIMELINE_EXPORT_URL, + body: { id: 'someId' }, + }); + const result = server.validate(request); + + expect(result.badRequest.mock.calls[1][0]).toEqual( + [ + 'Invalid value undefined supplied to : { file_name: string, exclude_export_details: ("true" | "false") }/file_name: string', + 'Invalid value undefined supplied to : { file_name: string, exclude_export_details: ("true" | "false") }/exclude_export_details: ("true" | "false")/0: "true"', + 'Invalid value undefined supplied to : { file_name: string, exclude_export_details: ("true" | "false") }/exclude_export_details: ("true" | "false")/1: "false"', + ].join('\n') + ); }); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts index b8e7be13fff34..fa849c1c325a9 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts @@ -7,31 +7,24 @@ import { set as _set } from 'lodash/fp'; import { IRouter } from '../../../../../../../../src/core/server'; import { LegacyServices } from '../../../types'; -import { ExportTimelineRequestParams } from '../types'; -import { - transformError, - buildRouteValidation, - buildSiemResponse, -} from '../../detection_engine/routes/utils'; +import { transformError, buildSiemResponse } from '../../detection_engine/routes/utils'; import { TIMELINE_EXPORT_URL } from '../../../../common/constants'; +import { getExportTimelineByObjectIds } from './utils/export_timelines'; import { - exportTimelinesSchema, exportTimelinesQuerySchema, + exportTimelinesRequestBodySchema, } from './schemas/export_timelines_schema'; - -import { getExportTimelineByObjectIds } from './utils/export_timelines'; +import { buildRouteValidation } from '../../../utils/build_validation/route_validation'; export const exportTimelinesRoute = (router: IRouter, config: LegacyServices['config']) => { router.post( { path: TIMELINE_EXPORT_URL, validate: { - query: buildRouteValidation( - exportTimelinesQuerySchema - ), - body: buildRouteValidation(exportTimelinesSchema), + query: buildRouteValidation(exportTimelinesQuerySchema), + body: buildRouteValidation(exportTimelinesRequestBodySchema), }, options: { tags: ['access:siem'], @@ -42,6 +35,7 @@ export const exportTimelinesRoute = (router: IRouter, config: LegacyServices['co const siemResponse = buildSiemResponse(response); const savedObjectsClient = context.core.savedObjects.client; const exportSizeLimit = config().get('savedObjects.maxImportExportSize'); + if (request.body?.ids != null && request.body.ids.length > exportSizeLimit) { return siemResponse.error({ statusCode: 400, @@ -51,7 +45,7 @@ export const exportTimelinesRoute = (router: IRouter, config: LegacyServices['co const responseBody = await getExportTimelineByObjectIds({ client: savedObjectsClient, - request, + ids: request.body.ids, }); return response.ok({ diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts index e89aef4c70ecb..352f8f0a355fc 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts @@ -334,7 +334,10 @@ describe('import timelines', () => { const result = server.validate(request); expect(result.badRequest).toHaveBeenCalledWith( - 'child "file" fails because ["file" is required]' + [ + 'Invalid value undefined supplied to : { file: (ReadableRt & { hapi: { filename: string } }) }/file: (ReadableRt & { hapi: { filename: string } })/0: ReadableRt', + 'Invalid value undefined supplied to : { file: (ReadableRt & { hapi: { filename: string } }) }/file: (ReadableRt & { hapi: { filename: string } })/1: { hapi: { filename: string } }', + ].join('\n') ); }); }); diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts index 2b41b4e7843a7..ad7ee28d8ad51 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts @@ -6,8 +6,8 @@ import { extname } from 'path'; import { chunk, omit, set } from 'lodash/fp'; + import { - buildRouteValidation, buildSiemResponse, createBulkErrorObject, BulkError, @@ -23,7 +23,6 @@ import { isBulkError, isImportRegular, ImportTimelineResponse, - ImportTimelinesRequestParams, ImportTimelinesSchema, PromiseFromStreams, } from './utils/import_timelines'; @@ -31,14 +30,14 @@ import { import { IRouter } from '../../../../../../../../src/core/server'; import { TIMELINE_IMPORT_URL } from '../../../../common/constants'; import { SetupPlugins } from '../../../plugin'; -import { importTimelinesPayloadSchema } from './schemas/import_timelines_schema'; +import { ImportTimelinesPayloadSchemaRt } from './schemas/import_timelines_schema'; import { importRulesSchema } from '../../detection_engine/routes/schemas/response/import_rules_schema'; import { LegacyServices } from '../../../types'; import { Timeline } from '../saved_object'; import { validate } from '../../detection_engine/routes/rules/validate'; import { FrameworkRequest } from '../../framework'; - +import { buildRouteValidation } from '../../../utils/build_validation/route_validation'; const CHUNK_PARSED_OBJECT_SIZE = 10; const timelineLib = new Timeline(); @@ -52,9 +51,7 @@ export const importTimelinesRoute = ( { path: `${TIMELINE_IMPORT_URL}`, validate: { - body: buildRouteValidation( - importTimelinesPayloadSchema - ), + body: buildRouteValidation(ImportTimelinesPayloadSchemaRt), }, options: { tags: ['access:siem'], @@ -65,28 +62,30 @@ export const importTimelinesRoute = ( }, }, async (context, request, response) => { - const siemResponse = buildSiemResponse(response); - const savedObjectsClient = context.core.savedObjects.client; - if (!savedObjectsClient) { - return siemResponse.error({ statusCode: 404 }); - } - const { filename } = request.body.file.hapi; + try { + const siemResponse = buildSiemResponse(response); + const savedObjectsClient = context.core.savedObjects.client; + if (!savedObjectsClient) { + return siemResponse.error({ statusCode: 404 }); + } - const fileExtension = extname(filename).toLowerCase(); + const { file } = request.body; + const { filename } = file.hapi; - if (fileExtension !== '.ndjson') { - return siemResponse.error({ - statusCode: 400, - body: `Invalid file extension ${fileExtension}`, - }); - } + const fileExtension = extname(filename).toLowerCase(); - const objectLimit = config().get('savedObjects.maxImportExportSize'); + if (fileExtension !== '.ndjson') { + return siemResponse.error({ + statusCode: 400, + body: `Invalid file extension ${fileExtension}`, + }); + } + + const objectLimit = config().get('savedObjects.maxImportExportSize'); - try { const readStream = createTimelinesStreamFromNdJson(objectLimit); const parsedObjects = await createPromiseFromStreams([ - request.body.file, + file, ...readStream, ]); const [duplicateIdErrors, uniqueParsedObjects] = getTupleDuplicateErrorsAndUniqueTimeline( @@ -215,6 +214,7 @@ export const importTimelinesRoute = ( } } catch (err) { const error = transformError(err); + const siemResponse = buildSiemResponse(response); return siemResponse.error({ body: error.message, diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/export_timelines_schema.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/export_timelines_schema.ts index 04edbbd7046c9..6f8265903b2a7 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/export_timelines_schema.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/export_timelines_schema.ts @@ -4,17 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import Joi from 'joi'; +import * as rt from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ -import { ids, exclude_export_details, file_name } from './schemas'; -/* eslint-disable @typescript-eslint/camelcase */ - -export const exportTimelinesSchema = Joi.object({ - ids, -}).min(1); +export const exportTimelinesQuerySchema = rt.type({ + file_name: rt.string, + exclude_export_details: rt.union([rt.literal('true'), rt.literal('false')]), +}); -export const exportTimelinesQuerySchema = Joi.object({ - file_name: file_name.default('export.ndjson'), - exclude_export_details: exclude_export_details.default(false), +export const exportTimelinesRequestBodySchema = rt.type({ + ids: rt.array(rt.string), }); diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts index 61ffa9681c53a..056fdaf0d2515 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts @@ -3,55 +3,41 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import Joi from 'joi'; -import { - columns, - created, - createdBy, - dataProviders, - dateRange, - description, - eventNotes, - eventType, - favorite, - filters, - globalNotes, - kqlMode, - kqlQuery, - savedObjectId, - savedQueryId, - sort, - title, - updated, - updatedBy, - version, - pinnedEventIds, -} from './schemas'; +import * as rt from 'io-ts'; -export const importTimelinesPayloadSchema = Joi.object({ - file: Joi.object().required(), -}); +import { Readable } from 'stream'; +import { either } from 'fp-ts/lib/Either'; +import { eventNotes, globalNotes, pinnedEventIds } from './schemas'; +import { SavedTimelineRuntimeType } from '../../types'; + +export const ImportTimelinesSchemaRt = rt.intersection([ + SavedTimelineRuntimeType, + rt.type({ + savedObjectId: rt.string, + version: rt.string, + }), + rt.type({ + globalNotes, + eventNotes, + pinnedEventIds, + }), +]); -export const importTimelinesSchema = Joi.object({ - columns, - created, - createdBy, - dataProviders, - dateRange, - description, - eventNotes, - eventType, - filters, - favorite, - globalNotes, - kqlMode, - kqlQuery, - savedObjectId, - savedQueryId, - sort, - title, - updated, - updatedBy, - version, - pinnedEventIds, +const ReadableRt = new rt.Type( + 'ReadableRt', + (u): u is Readable => u instanceof Readable, + (u, c) => + either.chain(rt.object.validate(u, c), s => { + const d = s as Readable; + return d.readable ? rt.success(d) : rt.failure(u, c); + }), + a => a +); +export const ImportTimelinesPayloadSchemaRt = rt.type({ + file: rt.intersection([ + ReadableRt, + rt.type({ + hapi: rt.type({ filename: rt.string }), + }), + ]), }); diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts index fc87a775a9e68..71627363ef0f8 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts @@ -3,156 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import Joi from 'joi'; +import * as runtimeTypes from 'io-ts'; +import { unionWithNullType } from '../../../framework'; +import { SavedNoteRuntimeType } from '../../../note/types'; -const allowEmptyString = Joi.string().allow([null, '']); -const columnHeaderType = allowEmptyString; -export const created = Joi.number().allow(null); -export const createdBy = allowEmptyString; - -export const description = allowEmptyString; -export const end = Joi.number(); -export const eventId = allowEmptyString; -export const eventType = allowEmptyString; - -export const filters = Joi.array() - .items( - Joi.object({ - meta: Joi.object({ - alias: allowEmptyString, - controlledBy: allowEmptyString, - disabled: Joi.boolean().allow(null), - field: allowEmptyString, - formattedValue: allowEmptyString, - index: allowEmptyString, - key: allowEmptyString, - negate: Joi.boolean().allow(null), - params: allowEmptyString, - type: allowEmptyString, - value: allowEmptyString, - }), - exists: allowEmptyString, - match_all: allowEmptyString, - missing: allowEmptyString, - query: allowEmptyString, - range: allowEmptyString, - script: allowEmptyString, - }) - ) - .allow(null); - -const name = allowEmptyString; - -export const noteId = allowEmptyString; -export const note = allowEmptyString; - -export const start = Joi.number(); -export const savedQueryId = allowEmptyString; -export const savedObjectId = allowEmptyString; - -export const timelineId = allowEmptyString; -export const title = allowEmptyString; - -export const updated = Joi.number().allow(null); -export const updatedBy = allowEmptyString; -export const version = allowEmptyString; - -export const columns = Joi.array().items( - Joi.object({ - aggregatable: Joi.boolean().allow(null), - category: allowEmptyString, - columnHeaderType, - description, - example: allowEmptyString, - indexes: allowEmptyString, - id: allowEmptyString, - name, - placeholder: allowEmptyString, - searchable: Joi.boolean().allow(null), - type: allowEmptyString, - }).required() -); -export const dataProviders = Joi.array() - .items( - Joi.object({ - id: allowEmptyString, - name: allowEmptyString, - enabled: Joi.boolean().allow(null), - excluded: Joi.boolean().allow(null), - kqlQuery: allowEmptyString, - queryMatch: Joi.object({ - field: allowEmptyString, - displayField: allowEmptyString, - value: allowEmptyString, - displayValue: allowEmptyString, - operator: allowEmptyString, - }), - and: Joi.array() - .items( - Joi.object({ - id: allowEmptyString, - name, - enabled: Joi.boolean().allow(null), - excluded: Joi.boolean().allow(null), - kqlQuery: allowEmptyString, - queryMatch: Joi.object({ - field: allowEmptyString, - displayField: allowEmptyString, - value: allowEmptyString, - displayValue: allowEmptyString, - operator: allowEmptyString, - }).allow(null), - }) - ) - .allow(null), - }) - ) - .allow(null); -export const dateRange = Joi.object({ - start, - end, -}); -export const favorite = Joi.array().items( - Joi.object({ - keySearch: allowEmptyString, - fullName: allowEmptyString, - userName: allowEmptyString, - favoriteDate: Joi.number(), - }).allow(null) -); -const noteItem = Joi.object({ - noteId, - version, - eventId, - note, - timelineId, - created, - createdBy, - updated, - updatedBy, -}); -export const eventNotes = Joi.array().items(noteItem); -export const globalNotes = Joi.array().items(noteItem); -export const kqlMode = allowEmptyString; -export const kqlQuery = Joi.object({ - filterQuery: Joi.object({ - kuery: Joi.object({ - kind: allowEmptyString, - expression: allowEmptyString, - }).allow(null), - serializedQuery: allowEmptyString, - }).allow(null), -}); -export const pinnedEventIds = Joi.array() - .items(allowEmptyString) - .allow(null); -export const sort = Joi.object({ - columnId: allowEmptyString, - sortDirection: allowEmptyString, -}); -/* eslint-disable @typescript-eslint/camelcase */ - -export const ids = Joi.array().items(allowEmptyString); - -export const exclude_export_details = Joi.boolean(); -export const file_name = allowEmptyString; +export const eventNotes = runtimeTypes.array(unionWithNullType(SavedNoteRuntimeType)); +export const globalNotes = runtimeTypes.array(unionWithNullType(SavedNoteRuntimeType)); +export const pinnedEventIds = runtimeTypes.array(unionWithNullType(runtimeTypes.string)); diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts index 8a28100fbae82..52ee2a891c9bb 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts @@ -26,12 +26,11 @@ import { import { ExportedTimelines, ExportTimelineSavedObjectsClient, - ExportTimelineRequest, ExportedNotes, TimelineSavedObject, } from '../../types'; +import { transformDataToNdjson } from '../../../../utils/read_stream/create_stream_from_ndjson'; -import { transformDataToNdjson } from '../../../detection_engine/routes/rules/utils'; export type TimelineSavedObjectsClient = Pick< SavedObjectsClient, | 'get' @@ -142,23 +141,17 @@ const getTimelines = async ( const getTimelinesFromObjects = async ( savedObjectsClient: ExportTimelineSavedObjectsClient, - request: ExportTimelineRequest + ids: string[] ): Promise => { - const timelines: TimelineSavedObject[] = await getTimelines(savedObjectsClient, request.body.ids); + const timelines: TimelineSavedObject[] = await getTimelines(savedObjectsClient, ids); // To Do for feature freeze // if (timelines.length !== request.body.ids.length) { // //figure out which is missing to tell user // } const [notes, pinnedEventIds] = await Promise.all([ - Promise.all( - request.body.ids.map(timelineId => getNotesByTimelineId(savedObjectsClient, timelineId)) - ), - Promise.all( - request.body.ids.map(timelineId => - getPinnedEventsByTimelineId(savedObjectsClient, timelineId) - ) - ), + Promise.all(ids.map(timelineId => getNotesByTimelineId(savedObjectsClient, timelineId))), + Promise.all(ids.map(timelineId => getPinnedEventsByTimelineId(savedObjectsClient, timelineId))), ]); const myNotes = notes.reduce( @@ -171,7 +164,7 @@ const getTimelinesFromObjects = async ( [] ); - const myResponse = request.body.ids.reduce((acc, timelineId) => { + const myResponse = ids.reduce((acc, timelineId) => { const myTimeline = timelines.find(t => t.savedObjectId === timelineId); if (myTimeline != null) { const timelineNotes = myNotes.filter(n => n.timelineId === timelineId); @@ -193,11 +186,11 @@ const getTimelinesFromObjects = async ( export const getExportTimelineByObjectIds = async ({ client, - request, + ids, }: { client: ExportTimelineSavedObjectsClient; - request: ExportTimelineRequest; + ids: string[]; }) => { - const timeline = await getTimelinesFromObjects(client, request); + const timeline = await getTimelinesFromObjects(client, ids); return transformDataToNdjson(timeline); }; diff --git a/x-pack/legacy/plugins/siem/server/lib/timeline/types.ts b/x-pack/legacy/plugins/siem/server/lib/timeline/types.ts index 35bf86c17db7e..523221192eca4 100644 --- a/x-pack/legacy/plugins/siem/server/lib/timeline/types.ts +++ b/x-pack/legacy/plugins/siem/server/lib/timeline/types.ts @@ -14,7 +14,7 @@ import { PinnedEventToReturnSavedObjectRuntimeType, PinnedEventSavedObject, } from '../pinned_event/types'; -import { SavedObjectsClient, KibanaRequest } from '../../../../../../../src/core/server'; +import { SavedObjectsClient } from '../../../../../../../src/core/server'; /* * ColumnHeader Types @@ -204,20 +204,9 @@ export const AllTimelineSavedObjectRuntimeType = runtimeTypes.type({ export interface AllTimelineSavedObject extends runtimeTypes.TypeOf {} -export interface ExportTimelineRequestParams { - body: { ids: string[] }; - query: { - file_name: string; - exclude_export_details: boolean; - }; -} - -export type ExportTimelineRequest = KibanaRequest< - unknown, - ExportTimelineRequestParams['query'], - ExportTimelineRequestParams['body'], - 'post' ->; +/** + * Import/export timelines + */ export type ExportTimelineSavedObjectsClient = Pick< SavedObjectsClient, diff --git a/x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.test.ts b/x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.test.ts new file mode 100644 index 0000000000000..888cd5dfe5390 --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { buildRouteValidation } from './route_validation'; +import * as rt from 'io-ts'; +import { RouteValidationResultFactory } from '../../../../../../../src/core/server/http'; + +describe('buildRouteValidation', () => { + const schema = rt.type({ + ids: rt.array(rt.string), + }); + const validationResult: RouteValidationResultFactory = { + ok: jest.fn().mockImplementation(validatedInput => validatedInput), + badRequest: jest.fn().mockImplementation(e => e), + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('return validation error', () => { + const input = { id: 'someId' }; + const result = buildRouteValidation(schema)(input, validationResult); + + expect(result).toEqual( + 'Invalid value undefined supplied to : { ids: Array }/ids: Array' + ); + }); + + test('return validated input', () => { + const input = { ids: ['someId'] }; + const result = buildRouteValidation(schema)(input, validationResult); + + expect(result).toEqual(input); + }); +}); diff --git a/x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.ts b/x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.ts new file mode 100644 index 0000000000000..1281c23cbc89a --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/utils/build_validation/route_validation.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { fold } from 'fp-ts/lib/Either'; +import { pipe } from 'fp-ts/lib/pipeable'; +import * as rt from 'io-ts'; +import { failure } from 'io-ts/lib/PathReporter'; +import { + RouteValidationFunction, + RouteValidationResultFactory, + RouteValidationError, +} from '../../../../../../../src/core/server'; + +type RequestValidationResult = + | { + value: T; + error?: undefined; + } + | { + value?: undefined; + error: RouteValidationError; + }; + +export const buildRouteValidation = >( + schema: T +): RouteValidationFunction => ( + inputValue: unknown, + validationResult: RouteValidationResultFactory +) => + pipe( + schema.decode(inputValue), + fold>( + (errors: rt.Errors) => validationResult.badRequest(failure(errors).join('\n')), + (validatedInput: A) => validationResult.ok(validatedInput) + ) + ); diff --git a/x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.test.ts b/x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.test.ts new file mode 100644 index 0000000000000..2b5b34edca140 --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.test.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { transformDataToNdjson } from './create_stream_from_ndjson'; +import { ImportRuleAlertRest } from '../../lib/detection_engine/types'; +import { sampleRule } from '../../lib/detection_engine/signals/__mocks__/es_results'; + +export const getOutputSample = (): Partial => ({ + rule_id: 'rule-1', + output_index: '.siem-signals', + risk_score: 50, + description: 'some description', + from: 'now-5m', + to: 'now', + index: ['index-1'], + name: 'some-name', + severity: 'low', + interval: '5m', + type: 'query', +}); + +export const getSampleAsNdjson = (sample: Partial): string => { + return `${JSON.stringify(sample)}\n`; +}; + +describe('create_rules_stream_from_ndjson', () => { + describe('transformDataToNdjson', () => { + test('if rules are empty it returns an empty string', () => { + const ruleNdjson = transformDataToNdjson([]); + expect(ruleNdjson).toEqual(''); + }); + + test('single rule will transform with new line ending character for ndjson', () => { + const rule = sampleRule(); + const ruleNdjson = transformDataToNdjson([rule]); + expect(ruleNdjson.endsWith('\n')).toBe(true); + }); + + test('multiple rules will transform with two new line ending characters for ndjson', () => { + const result1 = sampleRule(); + const result2 = sampleRule(); + result2.id = 'some other id'; + result2.rule_id = 'some other id'; + result2.name = 'Some other rule'; + + const ruleNdjson = transformDataToNdjson([result1, result2]); + // this is how we count characters in JavaScript :-) + const count = ruleNdjson.split('\n').length - 1; + expect(count).toBe(2); + }); + + test('you can parse two rules back out without errors', () => { + const result1 = sampleRule(); + const result2 = sampleRule(); + result2.id = 'some other id'; + result2.rule_id = 'some other id'; + result2.name = 'Some other rule'; + + const ruleNdjson = transformDataToNdjson([result1, result2]); + const ruleStrings = ruleNdjson.split('\n'); + const reParsed1 = JSON.parse(ruleStrings[0]); + const reParsed2 = JSON.parse(ruleStrings[1]); + expect(reParsed1).toEqual(result1); + expect(reParsed2).toEqual(result2); + }); + }); +}); diff --git a/x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.ts b/x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.ts new file mode 100644 index 0000000000000..0b7966926b5dd --- /dev/null +++ b/x-pack/legacy/plugins/siem/server/utils/read_stream/create_stream_from_ndjson.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { Transform } from 'stream'; +import { has, isString } from 'lodash/fp'; +import { ImportRuleAlertRest } from '../../lib/detection_engine/types'; +import { createMapStream, createFilterStream } from '../../../../../../../src/legacy/utils/streams'; +import { importRulesSchema } from '../../lib/detection_engine/routes/schemas/import_rules_schema'; +import { BadRequestError } from '../../lib/detection_engine/errors/bad_request_error'; + +export interface RulesObjectsExportResultDetails { + /** number of successfully exported objects */ + exportedCount: number; +} + +export const parseNdjsonStrings = (): Transform => { + return createMapStream((ndJsonStr: string) => { + if (isString(ndJsonStr) && ndJsonStr.trim() !== '') { + try { + return JSON.parse(ndJsonStr); + } catch (err) { + return err; + } + } + }); +}; + +export const filterExportedCounts = (): Transform => { + return createFilterStream( + obj => obj != null && !has('exported_count', obj) + ); +}; + +export const validateRules = (): Transform => { + return createMapStream((obj: ImportRuleAlertRest) => { + if (!(obj instanceof Error)) { + const validated = importRulesSchema.validate(obj); + if (validated.error != null) { + return new BadRequestError(validated.error.message); + } else { + return validated.value; + } + } else { + return obj; + } + }); +}; + +// Adaptation from: saved_objects/import/create_limit_stream.ts +export const createLimitStream = (limit: number): Transform => { + let counter = 0; + return new Transform({ + objectMode: true, + async transform(obj, _, done) { + if (counter >= limit) { + return done(new Error(`Can't import more than ${limit} rules`)); + } + counter++; + done(undefined, obj); + }, + }); +}; + +export const transformDataToNdjson = (data: unknown[]): string => { + if (data.length !== 0) { + const dataString = data.map(rule => JSON.stringify(rule)).join('\n'); + return `${dataString}\n`; + } else { + return ''; + } +}; From f18aea5dce135ef8bf4961467cee35c3b825aed9 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Thu, 16 Apr 2020 11:53:51 +0200 Subject: [PATCH 48/80] add platform team definition of done (#59993) * add platform team definition of done * add link to ToC * add suggestions from Josh * add tooling * add testing note --- src/core/CONVENTIONS.md | 48 +++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/src/core/CONVENTIONS.md b/src/core/CONVENTIONS.md index 0f592d108c561..a82cc27839a1d 100644 --- a/src/core/CONVENTIONS.md +++ b/src/core/CONVENTIONS.md @@ -1,6 +1,6 @@ -# Kibana Conventions - -- [Kibana Conventions](#kibana-conventions) +- [Organisational Conventions](#organisational-conventions) + - [Definition of done](#definition-of-done) +- [Technical Conventions](#technical-conventions) - [Plugin Structure](#plugin-structure) - [The PluginInitializer](#the-plugininitializer) - [The Plugin class](#the-plugin-class) @@ -8,8 +8,34 @@ - [Services](#services) - [Usage Collection](#usage-collection) - [Saved Objects Types](#saved-objects-types) - -## Plugin Structure + - [Naming conventions](#naming-conventions) + +## Organisational Conventions +### Definition of done +Definition of done for a feature: +- has a dedicated Github issue describing problem space +- an umbrella task closed/updated with follow-ups +- all code review comments are resolved +- has been verified manually by at least one reviewer +- can be used by first & third party plugins +- there is no contradiction between client and server API +- works for OSS version + - works with and without a `server.basePath` configured + - cannot crash the Kibana server when it fails +- works for the commercial version with a license + - for a logged-in user + - for anonymous user + - compatible with Spaces +- has unit & integration tests for public contracts +- has functional tests for user scenarios +- uses standard tooling: + - code - `TypeScript` + - UI - `React` + - tests - `jest` & `FTR` +- has documentation for the public contract, provides a usage example + +## Technical Conventions +### Plugin Structure All Kibana plugins built at Elastic should follow the same structure. @@ -60,7 +86,7 @@ my_plugin/ - More should be fleshed out here... - Usage collectors for Telemetry should be defined in a separate `server/collectors/` directory. -### The PluginInitializer +#### The PluginInitializer ```ts // my_plugin/public/index.ts @@ -75,7 +101,7 @@ export { } ``` -### The Plugin class +#### The Plugin class ```ts // my_plugin/public/plugin.ts @@ -130,7 +156,7 @@ Difference between `setup` and `start`: The bulk of your plugin logic will most likely live inside _handlers_ registered during `setup`. -### Applications +#### Applications It's important that UI code is not included in the main bundle for your plugin. Our webpack configuration supports dynamic async imports to split out imports into a separate bundle. Every app's rendering logic and UI code should @@ -175,7 +201,7 @@ export class MyPlugin implements Plugin { } ``` -### Services +#### Services Service structure should mirror the plugin lifecycle to make reasoning about how the service is executed more clear. @@ -226,7 +252,7 @@ export class Plugin { } ``` -### Usage Collection +#### Usage Collection For creating and registering a Usage Collector. Collectors should be defined in a separate directory `server/collectors/`. You can read more about usage collectors on `src/plugins/usage_collection/README.md`. @@ -263,7 +289,7 @@ export function registerMyPluginUsageCollector(usageCollection?: UsageCollection } ``` -### Saved Objects Types +#### Saved Objects Types Saved object type definitions should be defined in their own `server/saved_objects` directory. From 188ebe8e2c769ae67f2aee5ca5efa12deec742be Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Thu, 16 Apr 2020 12:55:22 +0300 Subject: [PATCH 49/80] [i18n] Update CODEOWNERS (#63354) Co-authored-by: Elastic Machine --- .github/CODEOWNERS | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4a061d7415990..086d4ccf81b10 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -130,7 +130,6 @@ /packages/kbn-config-schema/ @elastic/kibana-platform /src/legacy/server/config/ @elastic/kibana-platform /src/legacy/server/http/ @elastic/kibana-platform -/src/legacy/server/i18n/ @elastic/kibana-platform /src/legacy/server/logging/ @elastic/kibana-platform /src/legacy/server/saved_objects/ @elastic/kibana-platform /src/legacy/server/status/ @elastic/kibana-platform @@ -149,7 +148,10 @@ /x-pack/test/api_integration/apis/security/ @elastic/kibana-security # Kibana Localization -/src/dev/i18n/ @elastic/kibana-localization +/src/dev/i18n/ @elastic/kibana-localization +/src/legacy/server/i18n/ @elastic/kibana-localization +/src/core/public/i18n/ @elastic/kibana-localization +/packages/kbn-i18n/ @elastic/kibana-localization # Pulse /packages/kbn-analytics/ @elastic/pulse From d20cbcb903b6ab69453da1afb7853673f56b1f3a Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 16 Apr 2020 12:37:54 +0200 Subject: [PATCH 50/80] [Uptime] Update-paths-labeller-with-uptime (#63679) Co-authored-by: Elastic Machine --- .github/paths-labeller.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/paths-labeller.yml b/.github/paths-labeller.yml index 3d35cd74e0718..544dd577313df 100644 --- a/.github/paths-labeller.yml +++ b/.github/paths-labeller.yml @@ -8,3 +8,6 @@ - "Feature:ExpressionLanguage": - "src/plugins/expressions/**/*.*" - "src/plugins/bfetch/**/*.*" + - "Team:uptime": + - "x-pack/plugins/uptime/**/*.*" + - "x-pack/legacy/plugins/uptime/**/*.*" From 5ffdeb62e0ffc5a203d4207f27494d13106b868a Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Thu, 16 Apr 2020 13:46:23 +0200 Subject: [PATCH 51/80] Migrate vis_type_metric to kibana/new platform (#63096) * Move vis_type_metric to Kibana Platform * Adapt i18n * Cleanup tests * Modify CODEOWNERS * Cleanup SCSS --- .github/CODEOWNERS | 1 + .i18nrc.json | 2 +- .../core_plugins/vis_type_metric/index.ts | 44 ------------------- .../core_plugins/vis_type_metric/package.json | 4 -- src/plugins/vis_type_metric/config.ts | 26 +++++++++++ src/plugins/vis_type_metric/kibana.json | 8 ++++ .../__snapshots__/metric_vis_fn.test.ts.snap | 0 .../vis_type_metric/public/_metric_vis.scss | 0 .../metric_vis_component.test.tsx.snap | 0 .../components/metric_vis_component.test.tsx | 2 +- .../components/metric_vis_component.tsx | 8 ++-- .../public/components/metric_vis_options.tsx | 2 +- .../components/metric_vis_value.test.tsx | 0 .../public/components/metric_vis_value.tsx | 0 .../vis_type_metric/public/index.scss | 4 +- .../vis_type_metric/public/index.ts | 4 +- .../public/metric_vis_fn.test.ts | 5 +-- .../vis_type_metric/public/metric_vis_fn.ts | 4 +- .../public/metric_vis_type.test.ts | 2 - .../vis_type_metric/public/metric_vis_type.ts | 6 +-- .../vis_type_metric/public/plugin.ts | 15 ++++--- .../vis_type_metric/public/services.ts | 4 +- .../vis_type_metric/public/types.ts | 6 +-- .../vis_type_metric/server/index.ts} | 24 +++++----- 24 files changed, 76 insertions(+), 95 deletions(-) delete mode 100644 src/legacy/core_plugins/vis_type_metric/index.ts delete mode 100644 src/legacy/core_plugins/vis_type_metric/package.json create mode 100644 src/plugins/vis_type_metric/config.ts create mode 100644 src/plugins/vis_type_metric/kibana.json rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap (100%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/_metric_vis.scss (100%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap (100%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/components/metric_vis_component.test.tsx (97%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/components/metric_vis_component.tsx (96%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/components/metric_vis_options.tsx (99%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/components/metric_vis_value.test.tsx (100%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/components/metric_vis_value.tsx (100%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/index.scss (66%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/index.ts (92%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/metric_vis_fn.test.ts (90%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/metric_vis_fn.ts (98%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/metric_vis_type.test.ts (97%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/metric_vis_type.ts (93%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/plugin.ts (79%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/services.ts (86%) rename src/{legacy/core_plugins => plugins}/vis_type_metric/public/types.ts (86%) rename src/{legacy/core_plugins/vis_type_metric/public/legacy.ts => plugins/vis_type_metric/server/index.ts} (57%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 086d4ccf81b10..632f28efdc37e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -19,6 +19,7 @@ /src/plugins/dashboard/ @elastic/kibana-app /src/plugins/discover/ @elastic/kibana-app /src/plugins/vis_type_timeseries/ @elastic/kibana-app +/src/plugins/vis_type_metric/ @elastic/kibana-app # Core UI # Exclude tutorials folder for now because they are not owned by Kibana app and most will move out soon diff --git a/.i18nrc.json b/.i18nrc.json index e18f529b92ac3..2edf178e37bd5 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -47,7 +47,7 @@ "uiActions": "src/plugins/ui_actions", "visDefaultEditor": "src/plugins/vis_default_editor", "visTypeMarkdown": "src/legacy/core_plugins/vis_type_markdown", - "visTypeMetric": "src/legacy/core_plugins/vis_type_metric", + "visTypeMetric": "src/plugins/vis_type_metric", "visTypeTable": "src/legacy/core_plugins/vis_type_table", "visTypeTagCloud": "src/legacy/core_plugins/vis_type_tagcloud", "visTypeTimeseries": ["src/legacy/core_plugins/vis_type_timeseries", "src/plugins/vis_type_timeseries"], diff --git a/src/legacy/core_plugins/vis_type_metric/index.ts b/src/legacy/core_plugins/vis_type_metric/index.ts deleted file mode 100644 index 8e6654e40f0fc..0000000000000 --- a/src/legacy/core_plugins/vis_type_metric/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { resolve } from 'path'; -import { Legacy } from 'kibana'; - -import { LegacyPluginApi, LegacyPluginInitializer } from '../../../../src/legacy/types'; - -const metricPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => - new Plugin({ - id: 'metric_vis', - require: ['kibana', 'elasticsearch'], - publicDir: resolve(__dirname, 'public'), - uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - hacks: [resolve(__dirname, 'public/legacy')], - injectDefaultVars: server => ({}), - }, - init: (server: Legacy.Server) => ({}), - config(Joi: any) { - return Joi.object({ - enabled: Joi.boolean().default(true), - }).default(); - }, - } as Legacy.PluginSpecOptions); - -// eslint-disable-next-line import/no-default-export -export default metricPluginInitializer; diff --git a/src/legacy/core_plugins/vis_type_metric/package.json b/src/legacy/core_plugins/vis_type_metric/package.json deleted file mode 100644 index e570261fc30dd..0000000000000 --- a/src/legacy/core_plugins/vis_type_metric/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "metric_vis", - "version": "kibana" -} diff --git a/src/plugins/vis_type_metric/config.ts b/src/plugins/vis_type_metric/config.ts new file mode 100644 index 0000000000000..6749bd83de39f --- /dev/null +++ b/src/plugins/vis_type_metric/config.ts @@ -0,0 +1,26 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; + +export const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: true }), +}); + +export type ConfigSchema = TypeOf; diff --git a/src/plugins/vis_type_metric/kibana.json b/src/plugins/vis_type_metric/kibana.json new file mode 100644 index 0000000000000..24135d257b317 --- /dev/null +++ b/src/plugins/vis_type_metric/kibana.json @@ -0,0 +1,8 @@ +{ + "id": "visTypeMetric", + "version": "8.0.0", + "kibanaVersion": "kibana", + "server": true, + "ui": true, + "requiredPlugins": ["data", "visualizations", "charts","expressions"] +} diff --git a/src/legacy/core_plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap b/src/plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap rename to src/plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap diff --git a/src/legacy/core_plugins/vis_type_metric/public/_metric_vis.scss b/src/plugins/vis_type_metric/public/_metric_vis.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_metric/public/_metric_vis.scss rename to src/plugins/vis_type_metric/public/_metric_vis.scss diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap b/src/plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap rename to src/plugins/vis_type_metric/public/components/__snapshots__/metric_vis_component.test.tsx.snap diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx b/src/plugins/vis_type_metric/public/components/metric_vis_component.test.tsx similarity index 97% rename from src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx rename to src/plugins/vis_type_metric/public/components/metric_vis_component.test.tsx index 2bd423656b0f0..3969b28d75414 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.test.tsx +++ b/src/plugins/vis_type_metric/public/components/metric_vis_component.test.tsx @@ -21,7 +21,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { MetricVisComponent, MetricVisComponentProps } from './metric_vis_component'; -import { ExprVis } from '../../../../../plugins/visualizations/public'; +import { ExprVis } from '../../../visualizations/public'; jest.mock('../services', () => ({ getFormatService: () => ({ diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx b/src/plugins/vis_type_metric/public/components/metric_vis_component.tsx similarity index 96% rename from src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx rename to src/plugins/vis_type_metric/public/components/metric_vis_component.tsx index de2cc66a99c79..eb3986b6388fe 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_component.tsx +++ b/src/plugins/vis_type_metric/public/components/metric_vis_component.tsx @@ -22,12 +22,12 @@ import React, { Component } from 'react'; import { isColorDark } from '@elastic/eui'; import { MetricVisValue } from './metric_vis_value'; import { Input } from '../metric_vis_fn'; -import { FieldFormatsContentType, IFieldFormat } from '../../../../../plugins/data/public'; -import { KibanaDatatable } from '../../../../../plugins/expressions/public'; -import { getHeatmapColors } from '../../../../../plugins/charts/public'; +import { FieldFormatsContentType, IFieldFormat } from '../../../data/public'; +import { KibanaDatatable } from '../../../expressions/public'; +import { getHeatmapColors } from '../../../charts/public'; import { VisParams, MetricVisMetric } from '../types'; import { getFormatService } from '../services'; -import { SchemaConfig, ExprVis } from '../../../../../plugins/visualizations/public'; +import { SchemaConfig, ExprVis } from '../../../visualizations/public'; export interface MetricVisComponentProps { visParams: VisParams; diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_options.tsx b/src/plugins/vis_type_metric/public/components/metric_vis_options.tsx similarity index 99% rename from src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_options.tsx rename to src/plugins/vis_type_metric/public/components/metric_vis_options.tsx index 56af0ee91878f..009d63ded39b4 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_options.tsx +++ b/src/plugins/vis_type_metric/public/components/metric_vis_options.tsx @@ -38,7 +38,7 @@ import { RangeOption, SetColorSchemaOptionsValue, SetColorRangeValue, -} from '../../../../../plugins/charts/public'; +} from '../../../charts/public'; import { MetricVisParam, VisParams } from '../types'; function MetricVisOptions({ diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_value.test.tsx b/src/plugins/vis_type_metric/public/components/metric_vis_value.test.tsx similarity index 100% rename from src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_value.test.tsx rename to src/plugins/vis_type_metric/public/components/metric_vis_value.test.tsx diff --git a/src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_value.tsx b/src/plugins/vis_type_metric/public/components/metric_vis_value.tsx similarity index 100% rename from src/legacy/core_plugins/vis_type_metric/public/components/metric_vis_value.tsx rename to src/plugins/vis_type_metric/public/components/metric_vis_value.tsx diff --git a/src/legacy/core_plugins/vis_type_metric/public/index.scss b/src/plugins/vis_type_metric/public/index.scss similarity index 66% rename from src/legacy/core_plugins/vis_type_metric/public/index.scss rename to src/plugins/vis_type_metric/public/index.scss index e4116b69bf0f1..638f9ac1ef93a 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/index.scss +++ b/src/plugins/vis_type_metric/public/index.scss @@ -1,5 +1,3 @@ -@import 'src/legacy/ui/public/styles/styling_constants'; - // Prefix all styles with "mtr" to avoid conflicts. // Examples // mtrChart @@ -7,4 +5,4 @@ // mtrChart__legend--small // mtrChart__legend-isLoading -@import './metric_vis'; +@import 'metric_vis'; diff --git a/src/legacy/core_plugins/vis_type_metric/public/index.ts b/src/plugins/vis_type_metric/public/index.ts similarity index 92% rename from src/legacy/core_plugins/vis_type_metric/public/index.ts rename to src/plugins/vis_type_metric/public/index.ts index 7499babef58a7..3d3e1879a51d9 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/index.ts +++ b/src/plugins/vis_type_metric/public/index.ts @@ -16,8 +16,8 @@ * specific language governing permissions and limitations * under the License. */ - -import { PluginInitializerContext } from '../../../../core/public'; +import './index.scss'; +import { PluginInitializerContext } from 'kibana/public'; import { MetricVisPlugin as Plugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { diff --git a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_fn.test.ts b/src/plugins/vis_type_metric/public/metric_vis_fn.test.ts similarity index 90% rename from src/legacy/core_plugins/vis_type_metric/public/metric_vis_fn.test.ts rename to src/plugins/vis_type_metric/public/metric_vis_fn.test.ts index 4094cd4eff060..3ed8f8f79a83f 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_fn.test.ts +++ b/src/plugins/vis_type_metric/public/metric_vis_fn.test.ts @@ -18,10 +18,7 @@ */ import { createMetricVisFn } from './metric_vis_fn'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { functionWrapper } from '../../../../plugins/expressions/common/expression_functions/specs/tests/utils'; - -jest.mock('ui/new_platform'); +import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; describe('interpreter/functions#metric', () => { const fn = functionWrapper(createMetricVisFn()); diff --git a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_fn.ts b/src/plugins/vis_type_metric/public/metric_vis_fn.ts similarity index 98% rename from src/legacy/core_plugins/vis_type_metric/public/metric_vis_fn.ts rename to src/plugins/vis_type_metric/public/metric_vis_fn.ts index 52784da1bd73b..3d16fed0fa385 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_fn.ts +++ b/src/plugins/vis_type_metric/public/metric_vis_fn.ts @@ -25,9 +25,9 @@ import { Range, Render, Style, -} from '../../../../plugins/expressions/public'; +} from '../../expressions/public'; import { visType, DimensionsVisParam, VisParams } from './types'; -import { ColorSchemas, vislibColorMaps, ColorModes } from '../../../../plugins/charts/public'; +import { ColorSchemas, vislibColorMaps, ColorModes } from '../../charts/public'; export type Input = KibanaDatatable; diff --git a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts b/src/plugins/vis_type_metric/public/metric_vis_type.test.ts similarity index 97% rename from src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts rename to src/plugins/vis_type_metric/public/metric_vis_type.test.ts index 706693eff1007..636118c692aaa 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.test.ts +++ b/src/plugins/vis_type_metric/public/metric_vis_type.test.ts @@ -20,8 +20,6 @@ import { createMetricVisTypeDefinition } from './metric_vis_type'; import { MetricVisComponent } from './components/metric_vis_component'; -jest.mock('ui/new_platform'); - describe('metric_vis - createMetricVisTypeDefinition', () => { it('has metric vis component set', () => { const def = createMetricVisTypeDefinition(); diff --git a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.ts b/src/plugins/vis_type_metric/public/metric_vis_type.ts similarity index 93% rename from src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.ts rename to src/plugins/vis_type_metric/public/metric_vis_type.ts index ab31c56921412..b7e9213283bee 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/metric_vis_type.ts +++ b/src/plugins/vis_type_metric/public/metric_vis_type.ts @@ -21,9 +21,9 @@ import { i18n } from '@kbn/i18n'; import { MetricVisComponent } from './components/metric_vis_component'; import { MetricVisOptions } from './components/metric_vis_options'; -import { ColorSchemas, colorSchemas, ColorModes } from '../../../../plugins/charts/public'; -import { AggGroupNames } from '../../../../plugins/data/public'; -import { Schemas } from '../../../../plugins/vis_default_editor/public'; +import { ColorSchemas, colorSchemas, ColorModes } from '../../charts/public'; +import { AggGroupNames } from '../../data/public'; +import { Schemas } from '../../vis_default_editor/public'; export const createMetricVisTypeDefinition = () => ({ name: 'metric', diff --git a/src/legacy/core_plugins/vis_type_metric/public/plugin.ts b/src/plugins/vis_type_metric/public/plugin.ts similarity index 79% rename from src/legacy/core_plugins/vis_type_metric/public/plugin.ts rename to src/plugins/vis_type_metric/public/plugin.ts index cb65d5cafbdd2..a3951fa46c21c 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/plugin.ts +++ b/src/plugins/vis_type_metric/public/plugin.ts @@ -17,15 +17,16 @@ * under the License. */ -import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../../core/public'; -import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; +import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'kibana/public'; +import { Plugin as ExpressionsPublicPlugin } from '../../expressions/public'; +import { VisualizationsSetup } from '../../visualizations/public'; import { createMetricVisFn } from './metric_vis_fn'; import { createMetricVisTypeDefinition } from './metric_vis_type'; -import { ChartsPluginSetup } from '../../../../plugins/charts/public'; -import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { ChartsPluginSetup } from '../../charts/public'; +import { DataPublicPluginStart } from '../../data/public'; import { setFormatService } from './services'; +import { ConfigSchema } from '../config'; /** @internal */ export interface MetricVisPluginSetupDependencies { @@ -41,9 +42,9 @@ export interface MetricVisPluginStartDependencies { /** @internal */ export class MetricVisPlugin implements Plugin { - initializerContext: PluginInitializerContext; + initializerContext: PluginInitializerContext; - constructor(initializerContext: PluginInitializerContext) { + constructor(initializerContext: PluginInitializerContext) { this.initializerContext = initializerContext; } diff --git a/src/legacy/core_plugins/vis_type_metric/public/services.ts b/src/plugins/vis_type_metric/public/services.ts similarity index 86% rename from src/legacy/core_plugins/vis_type_metric/public/services.ts rename to src/plugins/vis_type_metric/public/services.ts index b303ccd5aeed2..681afbaf0b268 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/services.ts +++ b/src/plugins/vis_type_metric/public/services.ts @@ -17,8 +17,8 @@ * under the License. */ -import { createGetterSetter } from '../../../../plugins/kibana_utils/public'; -import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { createGetterSetter } from '../../kibana_utils/common'; +import { DataPublicPluginStart } from '../../data/public'; export const [getFormatService, setFormatService] = createGetterSetter< DataPublicPluginStart['fieldFormats'] diff --git a/src/legacy/core_plugins/vis_type_metric/public/types.ts b/src/plugins/vis_type_metric/public/types.ts similarity index 86% rename from src/legacy/core_plugins/vis_type_metric/public/types.ts rename to src/plugins/vis_type_metric/public/types.ts index cdf62cba934d7..e1f2c7721a426 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/types.ts +++ b/src/plugins/vis_type_metric/public/types.ts @@ -17,9 +17,9 @@ * under the License. */ -import { Range } from '../../../../plugins/expressions/public'; -import { SchemaConfig } from '../../../../plugins/visualizations/public'; -import { ColorModes, ColorSchemas, Labels, Style } from '../../../../plugins/charts/public'; +import { Range } from '../../expressions/public'; +import { SchemaConfig } from '../../visualizations/public'; +import { ColorModes, Labels, Style, ColorSchemas } from '../../charts/public'; export const visType = 'metric'; diff --git a/src/legacy/core_plugins/vis_type_metric/public/legacy.ts b/src/plugins/vis_type_metric/server/index.ts similarity index 57% rename from src/legacy/core_plugins/vis_type_metric/public/legacy.ts rename to src/plugins/vis_type_metric/server/index.ts index ba883601e5d65..ce550dc81dd85 100644 --- a/src/legacy/core_plugins/vis_type_metric/public/legacy.ts +++ b/src/plugins/vis_type_metric/server/index.ts @@ -17,18 +17,18 @@ * under the License. */ -import { PluginInitializerContext } from 'kibana/public'; -import { npSetup, npStart } from 'ui/new_platform'; -import { MetricVisPluginSetupDependencies } from './plugin'; -import { plugin } from '.'; +import { PluginConfigDescriptor } from 'kibana/server'; -const plugins: Readonly = { - expressions: npSetup.plugins.expressions, - visualizations: npSetup.plugins.visualizations, - charts: npSetup.plugins.charts, -}; +import { configSchema, ConfigSchema } from '../config'; -const pluginInstance = plugin({} as PluginInitializerContext); +export const config: PluginConfigDescriptor = { + schema: configSchema, + deprecations: ({ renameFromRoot }) => [ + renameFromRoot('metric_vis.enabled', 'vis_type_metric.enabled'), + ], +}; -export const setup = pluginInstance.setup(npSetup.core, plugins); -export const start = pluginInstance.start(npStart.core, { data: npStart.plugins.data }); +export const plugin = () => ({ + setup() {}, + start() {}, +}); From a3f4acfc27653bae18c6a05a7b2979b25d330c28 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 16 Apr 2020 13:48:34 +0200 Subject: [PATCH 52/80] [Uptime] Update duration chart query filters (#63620) * updated duration query * updated snapshot * update fixtures Co-authored-by: Elastic Machine --- .../plugins/uptime/common/types/index.ts | 6 - .../charts/__tests__/duration_charts.test.tsx | 15 -- .../uptime/public/state/api/ml_anomaly.ts | 7 +- .../get_monitor_charts.test.ts.snap | 137 +----------------- .../lib/requests/get_monitor_duration.ts | 36 +---- .../uptime/rest/fixtures/monitor_charts.json | 126 +--------------- .../fixtures/monitor_charts_empty_sets.json | 5 +- .../rest/fixtures/monitor_latest_status.json | 11 +- 8 files changed, 19 insertions(+), 324 deletions(-) diff --git a/x-pack/legacy/plugins/uptime/common/types/index.ts b/x-pack/legacy/plugins/uptime/common/types/index.ts index 1d0003addd761..fcbb92caf26d5 100644 --- a/x-pack/legacy/plugins/uptime/common/types/index.ts +++ b/x-pack/legacy/plugins/uptime/common/types/index.ts @@ -34,10 +34,4 @@ export interface LocationDurationLine { export interface MonitorDurationResult { /** The average values for the monitor duration. */ locationDurationLines: LocationDurationLine[]; - /** The counts of up/down checks for the monitor. */ - status: StatusData[]; - /** The maximum status doc count in this chart. */ - statusMaxCount: number; - /** The maximum duration value in this chart. */ - durationMaxValue: number; } diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/duration_charts.test.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/duration_charts.test.tsx index aac84c69d8d7b..57f9ce9abbca6 100644 --- a/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/duration_charts.test.tsx +++ b/x-pack/legacy/plugins/uptime/public/components/functional/charts/__tests__/duration_charts.test.tsx @@ -43,21 +43,6 @@ describe('MonitorCharts component', () => { ], }, ], - status: [ - { x: 1548697620000, up: 74, down: null, total: 74 }, - { x: 1548697920000, up: 75, down: null, total: 75 }, - { x: 1548698220000, up: 75, down: null, total: 75 }, - { x: 1548698520000, up: 73, down: null, total: 73 }, - { x: 1548698820000, up: 75, down: null, total: 75 }, - { x: 1548699120000, up: 74, down: null, total: 74 }, - { x: 1548699420000, up: 75, down: null, total: 75 }, - { x: 1548699720000, up: 75, down: null, total: 75 }, - { x: 1548700020000, up: 75, down: null, total: 75 }, - { x: 1548700320000, up: 75, down: null, total: 75 }, - { x: 1548700620000, up: 75, down: null, total: 75 }, - ], - statusMaxCount: 75, - durationMaxValue: 6669234, }, }; diff --git a/x-pack/legacy/plugins/uptime/public/state/api/ml_anomaly.ts b/x-pack/legacy/plugins/uptime/public/state/api/ml_anomaly.ts index bcd2582fe18b9..f10745a50f56a 100644 --- a/x-pack/legacy/plugins/uptime/public/state/api/ml_anomaly.ts +++ b/x-pack/legacy/plugins/uptime/public/state/api/ml_anomaly.ts @@ -48,11 +48,8 @@ export const createMLJob = async ({ query: { bool: { filter: [ - { - term: { - 'monitor.id': lowerCaseMonitorId, - }, - }, + { term: { 'monitor.id': lowerCaseMonitorId } }, + { range: { 'monitor.duration.us': { gt: 0 } } }, ], }, }, diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_monitor_charts.test.ts.snap b/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_monitor_charts.test.ts.snap index 7b717949c70c5..97b97f8440758 100644 --- a/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_monitor_charts.test.ts.snap +++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_monitor_charts.test.ts.snap @@ -15,13 +15,6 @@ Array [ "field": "monitor.duration.us", }, }, - "status": Object { - "terms": Object { - "field": "monitor.status", - "shard_size": 2, - "size": 2, - }, - }, }, "terms": Object { "field": "observer.geo.name", @@ -55,8 +48,10 @@ Array [ }, }, Object { - "term": Object { - "monitor.status": "up", + "range": Object { + "monitor.duration.us": Object { + "gt": 0, + }, }, }, ], @@ -71,7 +66,6 @@ Array [ exports[`ElasticsearchMonitorsAdapter inserts empty buckets for missing data 1`] = ` Object { - "durationMaxValue": 0, "locationDurationLines": Array [ Object { "line": Array [ @@ -244,128 +238,5 @@ Object { "name": "us-west-4", }, ], - "status": Array [ - Object { - "down": null, - "total": 4, - "up": null, - "x": 1568411568000, - }, - Object { - "down": null, - "total": 0, - "up": null, - "x": 1568411604000, - }, - Object { - "down": null, - "total": 8, - "up": null, - "x": 1568411640000, - }, - Object { - "down": null, - "total": 8, - "up": null, - "x": 1568411784000, - }, - Object { - "down": null, - "total": 0, - "up": null, - "x": 1568411820000, - }, - Object { - "down": null, - "total": 0, - "up": null, - "x": 1568411856000, - }, - Object { - "down": null, - "total": 0, - "up": null, - "x": 1568411892000, - }, - Object { - "down": null, - "total": 4, - "up": null, - "x": 1568411928000, - }, - Object { - "down": null, - "total": 7, - "up": null, - "x": 1568411964000, - }, - Object { - "down": null, - "total": 5, - "up": null, - "x": 1568412036000, - }, - Object { - "down": null, - "total": 4, - "up": null, - "x": 1568412072000, - }, - Object { - "down": null, - "total": 3, - "up": null, - "x": 1568412108000, - }, - Object { - "down": null, - "total": 4, - "up": null, - "x": 1568412144000, - }, - Object { - "down": null, - "total": 4, - "up": null, - "x": 1568412180000, - }, - Object { - "down": null, - "total": 3, - "up": null, - "x": 1568412216000, - }, - Object { - "down": null, - "total": 1, - "up": null, - "x": 1568412252000, - }, - Object { - "down": null, - "total": 3, - "up": null, - "x": 1568412288000, - }, - Object { - "down": null, - "total": 8, - "up": null, - "x": 1568412324000, - }, - Object { - "down": null, - "total": 8, - "up": null, - "x": 1568412432000, - }, - Object { - "down": null, - "total": 1, - "up": null, - "x": 1568412468000, - }, - ], - "statusMaxCount": 0, } `; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts index 01bfc52489bf3..e9c745b0a8713 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts @@ -20,26 +20,6 @@ export interface GetMonitorChartsParams { dateEnd: string; } -const formatStatusBuckets = (time: any, buckets: any, docCount: any) => { - let up = null; - let down = null; - - buckets.forEach((bucket: any) => { - if (bucket.key === 'up') { - up = bucket.doc_count; - } else if (bucket.key === 'down') { - down = bucket.doc_count; - } - }); - - return { - x: time, - up, - down, - total: docCount, - }; -}; - /** * Fetches data used to populate monitor charts */ @@ -55,7 +35,7 @@ export const getMonitorDurationChart: UMElasticsearchQueryFn< filter: [ { range: { '@timestamp': { gte: dateStart, lte: dateEnd } } }, { term: { 'monitor.id': monitorId } }, - { term: { 'monitor.status': 'up' } }, + { range: { 'monitor.duration.us': { gt: 0 } } }, ], }, }, @@ -73,7 +53,6 @@ export const getMonitorDurationChart: UMElasticsearchQueryFn< missing: 'N/A', }, aggs: { - status: { terms: { field: 'monitor.status', size: 2, shard_size: 2 } }, duration: { stats: { field: 'monitor.duration.us' } }, }, }, @@ -94,15 +73,10 @@ export const getMonitorDurationChart: UMElasticsearchQueryFn< * * The third list is for an area chart expressing a range, and it requires an (x,y,y0) structure, * where y0 is the min value for the point and y is the max. - * - * Additionally, we supply the maximum value for duration and status, so the corresponding charts know - * what the domain size should be. */ + const monitorChartsData: MonitorDurationResult = { locationDurationLines: [], - status: [], - durationMaxValue: 0, - statusMaxCount: 0, }; /** @@ -119,9 +93,9 @@ export const getMonitorDurationChart: UMElasticsearchQueryFn< // a set of all the locations found for this result const resultLocations = new Set(); const linesByLocation: { [key: string]: LocationDurationLine } = {}; + dateHistogramBuckets.forEach(dateHistogramBucket => { const x = dateHistogramBucket.key; - const docCount = dateHistogramBucket?.doc_count ?? 0; // a set of all the locations for the current bucket const bucketLocations = new Set(); @@ -161,10 +135,6 @@ export const getMonitorDurationChart: UMElasticsearchQueryFn< } }); } - - monitorChartsData.status.push( - formatStatusBuckets(x, dateHistogramBucket?.status?.buckets ?? [], docCount) - ); }); return monitorChartsData; diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts.json index 8edcff158b0ae..e96b3b3b562b9 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts.json @@ -85,129 +85,5 @@ } ] } - ], - "status": [ - { - "x": 1568172664000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172694000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172724000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172754000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172784000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172814000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172844000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172874000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172904000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172934000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172964000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568172994000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173024000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173054000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173084000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173114000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173144000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173174000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173204000, - "up": null, - "down": null, - "total": 1 - }, - { - "x": 1568173234000, - "up": null, - "down": null, - "total": 1 - } - ], - "durationMaxValue": 0, - "statusMaxCount": 0 + ] } \ No newline at end of file diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts_empty_sets.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts_empty_sets.json index 674338101bc5b..5157eace006cf 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts_empty_sets.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_charts_empty_sets.json @@ -1,6 +1,3 @@ { - "locationDurationLines": [], - "status": [], - "durationMaxValue": 0, - "statusMaxCount": 0 + "locationDurationLines": [] } \ No newline at end of file diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json index 6a832ad8536f7..9a33be807670e 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json @@ -1,11 +1,16 @@ { "observer": { - "geo": { "name": "mpls", "location": "37.926868, -78.024902" }, + "geo": { + "name": "mpls", + "location": "37.926868, -78.024902" + }, "hostname": "avc-x1x" }, "@timestamp": "2019-09-11T03:40:34.371Z", "monitor": { - "duration": { "us": 24627 }, + "duration": { + "us": 24627 + }, "ip": "127.0.0.1", "name": "", "check_group": "d76f0762-d445-11e9-88e3-3e80641b9c71", @@ -23,4 +28,4 @@ }, "docId": "h5toHm0B0I9WX_CznN_V", "timestamp": "2019-09-11T03:40:34.371Z" -} +} \ No newline at end of file From 11b6f7fc7d4c797fdd1f85f6df95ba67344e98a2 Mon Sep 17 00:00:00 2001 From: Aaron Caldwell Date: Thu, 16 Apr 2020 05:49:53 -0600 Subject: [PATCH 53/80] [Maps] Update remaining client dependencies to NP (#63297) * Routes dependencies updated (except for routes itself) * Replace all chrome deps except map controller * Replace npSetup and npStart with normal plugin init logic. Some clean up * Bind kibana services in map controller * Use kibana services in map controller * Convert remaining deps that aren't critical to legacy operation * Remove last angular bindings to gis map saved object loader * Consolidate kibana services in NP * Some fixes. Remove console logs * Fix type errors * Fix jest test path refs * Accomodate legacy 'hacks' and init services for vis type alias * Review feedback. Remove/update unused declarations * getFileUpload actually just needed Component tacked on the end * Handle visibility of toolbars for full screen mode using new core chrome. Should fix test * Import source types in getInitialLayers to ensure registry --- .../maps/public/actions/map_actions.test.js | 2 +- .../maps/public/angular/get_initial_layers.js | 19 ++++- .../public/angular/get_initial_layers.test.js | 9 +-- .../maps/public/angular/get_initial_query.js | 7 +- .../angular/get_initial_refresh_config.js | 7 +- .../angular/get_initial_time_filters.js | 7 +- .../plugins/maps/public/angular/map.html | 6 +- .../maps/public/angular/map_controller.js | 71 +++++++++++++------ .../services/gis_map_saved_object_loader.js | 29 ++++---- .../maps/public/components/map_listing.js | 8 +-- .../connected_components/gis_map/index.js | 7 +- .../connected_components/gis_map/view.js | 3 +- .../filter_editor/filter_editor.js | 13 ++-- .../layer_panel/join_editor/resources/join.js | 3 +- .../join_editor/resources/join_expression.js | 3 +- .../join_editor/resources/where_expression.js | 12 ++-- .../connected_components/layer_panel/view.js | 9 ++- .../feature_geometry_filter_form.js | 3 +- .../connected_components/map/mb/view.js | 5 +- .../maps/public/embeddable/map_embeddable.tsx | 5 +- .../embeddable/map_embeddable_factory.ts | 22 +++--- .../plugins/maps/public/help_menu_util.js | 9 ++- x-pack/legacy/plugins/maps/public/index.ts | 3 +- .../plugins/maps/public/kibana_services.d.ts | 23 ------ .../plugins/maps/public/kibana_services.js | 29 -------- x-pack/legacy/plugins/maps/public/plugin.ts | 28 +------- .../maps/public/register_vis_type_alias.js | 18 +++-- x-pack/legacy/plugins/maps/public/routes.js | 34 +++++---- .../maps/public/selectors/map_selectors.js | 3 +- .../public/selectors/map_selectors.test.js | 2 +- .../plugins/maps/public/kibana_services.d.ts | 55 ++++++++++++++ x-pack/plugins/maps/public/kibana_services.js | 46 ++++++++++++ x-pack/plugins/maps/public/plugin.ts | 30 ++++++-- 33 files changed, 328 insertions(+), 202 deletions(-) delete mode 100644 x-pack/legacy/plugins/maps/public/kibana_services.d.ts delete mode 100644 x-pack/legacy/plugins/maps/public/kibana_services.js create mode 100644 x-pack/plugins/maps/public/kibana_services.d.ts diff --git a/x-pack/legacy/plugins/maps/public/actions/map_actions.test.js b/x-pack/legacy/plugins/maps/public/actions/map_actions.test.js index c280b8af7ab80..7e2a3c827fa88 100644 --- a/x-pack/legacy/plugins/maps/public/actions/map_actions.test.js +++ b/x-pack/legacy/plugins/maps/public/actions/map_actions.test.js @@ -5,7 +5,7 @@ */ jest.mock('../selectors/map_selectors', () => ({})); -jest.mock('../kibana_services', () => ({})); +jest.mock('../../../../../plugins/maps/public/kibana_services', () => ({})); import { mapExtentChanged, setMouseCoordinates } from './map_actions'; diff --git a/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.js b/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.js index 5e497ff0736b2..686259aeaaba4 100644 --- a/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.js +++ b/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.js @@ -4,11 +4,28 @@ * you may not use this file except in compliance with the Elastic License. */ import _ from 'lodash'; +// Import each layer type, even those not used, to init in registry +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../../plugins/maps/public/layers/sources/wms_source'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../../plugins/maps/public/layers/sources/ems_file_source'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../../plugins/maps/public/layers/sources/es_search_source'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../../plugins/maps/public/layers/sources/es_pew_pew_source/es_pew_pew_source'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../../plugins/maps/public/layers/sources/kibana_regionmap_source'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../../plugins/maps/public/layers/sources/es_geo_grid_source'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../../plugins/maps/public/layers/sources/xyz_tms_source'; + // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { KibanaTilemapSource } from '../../../../../plugins/maps/public/layers/sources/kibana_tilemap_source'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { EMSTMSSource } from '../../../../../plugins/maps/public/layers/sources/ems_tms_source'; -import { getInjectedVarFunc } from '../kibana_services'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getInjectedVarFunc } from '../../../../../plugins/maps/public/kibana_services'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { getKibanaTileMap } from '../../../../../plugins/maps/public/meta'; diff --git a/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.test.js b/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.test.js index 5334beaaf714a..8c9185a16ea0e 100644 --- a/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.test.js +++ b/x-pack/legacy/plugins/maps/public/angular/get_initial_layers.test.js @@ -7,7 +7,7 @@ jest.mock('../../../../../plugins/maps/public/meta', () => { return {}; }); -jest.mock('../kibana_services'); +jest.mock('../../../../../plugins/maps/public/kibana_services'); import { getInitialLayers } from './get_initial_layers'; @@ -15,7 +15,8 @@ const layerListNotProvided = undefined; describe('Saved object has layer list', () => { beforeEach(() => { - require('../kibana_services').getInjectedVarFunc = () => jest.fn(); + require('../../../../../plugins/maps/public/kibana_services').getInjectedVarFunc = () => + jest.fn(); }); it('Should get initial layers from saved object', () => { @@ -65,7 +66,7 @@ describe('EMS is enabled', () => { require('../../../../../plugins/maps/public/meta').getKibanaTileMap = () => { return null; }; - require('../kibana_services').getInjectedVarFunc = () => key => { + require('../../../../../plugins/maps/public/kibana_services').getInjectedVarFunc = () => key => { switch (key) { case 'emsTileLayerId': return { @@ -110,7 +111,7 @@ describe('EMS is not enabled', () => { return null; }; - require('../kibana_services').getInjectedVarFunc = () => key => { + require('../../../../../plugins/maps/public/kibana_services').getInjectedVarFunc = () => key => { switch (key) { case 'isEmsEnabled': return false; diff --git a/x-pack/legacy/plugins/maps/public/angular/get_initial_query.js b/x-pack/legacy/plugins/maps/public/angular/get_initial_query.js index fc8305b252cc3..c50ecb2b05dc0 100644 --- a/x-pack/legacy/plugins/maps/public/angular/get_initial_query.js +++ b/x-pack/legacy/plugins/maps/public/angular/get_initial_query.js @@ -4,11 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; - -const settings = chrome.getUiSettingsClient(); +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getUiSettings } from '../../../../../plugins/maps/public/kibana_services'; export function getInitialQuery({ mapStateJSON, appState = {}, userQueryLanguage }) { + const settings = getUiSettings(); + if (appState.query) { return appState.query; } diff --git a/x-pack/legacy/plugins/maps/public/angular/get_initial_refresh_config.js b/x-pack/legacy/plugins/maps/public/angular/get_initial_refresh_config.js index 10a2580b78e6d..8735d45debfc4 100644 --- a/x-pack/legacy/plugins/maps/public/angular/get_initial_refresh_config.js +++ b/x-pack/legacy/plugins/maps/public/angular/get_initial_refresh_config.js @@ -3,11 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; - -const uiSettings = chrome.getUiSettingsClient(); +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getUiSettings } from '../../../../../plugins/maps/public/kibana_services'; export function getInitialRefreshConfig({ mapStateJSON, globalState = {} }) { + const uiSettings = getUiSettings(); + if (mapStateJSON) { const mapState = JSON.parse(mapStateJSON); if (mapState.refreshConfig) { diff --git a/x-pack/legacy/plugins/maps/public/angular/get_initial_time_filters.js b/x-pack/legacy/plugins/maps/public/angular/get_initial_time_filters.js index 82439175841b2..74fbf603e99f5 100644 --- a/x-pack/legacy/plugins/maps/public/angular/get_initial_time_filters.js +++ b/x-pack/legacy/plugins/maps/public/angular/get_initial_time_filters.js @@ -3,9 +3,8 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; - -const uiSettings = chrome.getUiSettingsClient(); +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getUiSettings } from '../../../../../plugins/maps/public/kibana_services'; export function getInitialTimeFilters({ mapStateJSON, globalState = {} }) { if (mapStateJSON) { @@ -15,6 +14,6 @@ export function getInitialTimeFilters({ mapStateJSON, globalState = {} }) { } } - const defaultTime = uiSettings.get('timepicker:timeDefaults'); + const defaultTime = getUiSettings().get('timepicker:timeDefaults'); return { ...defaultTime, ...globalState.time }; } diff --git a/x-pack/legacy/plugins/maps/public/angular/map.html b/x-pack/legacy/plugins/maps/public/angular/map.html index 2f34ffa660d6e..7d7dcf6f9c9a9 100644 --- a/x-pack/legacy/plugins/maps/public/angular/map.html +++ b/x-pack/legacy/plugins/maps/public/angular/map.html @@ -3,11 +3,11 @@
{ - const { filterManager } = npStart.plugins.data.query; + const savedQueryService = getData().query.savedQueries; + const { filterManager } = getData().query; const savedMap = $route.current.locals.map; $scope.screenTitle = savedMap.title; let unsubscribe; @@ -115,6 +129,14 @@ app.controller( return _.get($state, 'filters', []); } + const visibleSubscription = getCoreChrome() + .getIsVisible$() + .subscribe(isVisible => { + $scope.$evalAsync(() => { + $scope.isVisible = isVisible; + }); + }); + $scope.$listen(globalState, 'fetch_with_changes', diff => { if (diff.includes('time') || diff.includes('filters')) { onQueryChange({ @@ -169,10 +191,10 @@ app.controller( }); /* Saved Queries */ - $scope.showSaveQuery = capabilities.get().maps.saveQuery; + $scope.showSaveQuery = getMapsCapabilities().saveQuery; $scope.$watch( - () => capabilities.get().maps.saveQuery, + () => getMapsCapabilities().saveQuery, newCapability => { $scope.showSaveQuery = newCapability; } @@ -342,7 +364,7 @@ app.controller( // clear old UI state store.dispatch(setSelectedLayer(null)); store.dispatch(updateFlyout(FLYOUT_STATE.NONE)); - store.dispatch(setReadOnly(!capabilities.get().maps.save)); + store.dispatch(setReadOnly(!getMapsCapabilities().save)); handleStoreChanges(store); unsubscribe = store.subscribe(() => { @@ -446,6 +468,8 @@ app.controller( $scope.$on('$destroy', () => { window.removeEventListener('beforeunload', beforeUnload); + visibleSubscription.unsubscribe(); + getCoreChrome().setIsVisible(true); if (unsubscribe) { unsubscribe(); @@ -457,7 +481,7 @@ app.controller( }); const updateBreadcrumbs = () => { - chrome.breadcrumbs.set([ + getCoreChrome().setBreadcrumbs([ { text: i18n.translate('xpack.maps.mapController.mapsBreadcrumbLabel', { defaultMessage: 'Maps', @@ -482,7 +506,7 @@ app.controller( }; updateBreadcrumbs(); - addHelpMenuToAppChrome(chrome); + addHelpMenuToAppChrome(); async function doSave(saveOptions) { await store.dispatch(clearTransientLayerStateAndCloseFlyout()); @@ -491,9 +515,9 @@ app.controller( try { id = await savedMap.save(saveOptions); - docTitle.change(savedMap.title); + getCoreChrome().docTitle.change(savedMap.title); } catch (err) { - toastNotifications.addDanger({ + getToasts().addDanger({ title: i18n.translate('xpack.maps.mapController.saveErrorMessage', { defaultMessage: `Error on saving '{title}'`, values: { title: savedMap.title }, @@ -505,7 +529,7 @@ app.controller( } if (id) { - toastNotifications.addSuccess({ + getToasts().addSuccess({ title: i18n.translate('xpack.maps.mapController.saveSuccessMessage', { defaultMessage: `Saved '{title}'`, values: { title: savedMap.title }, @@ -539,6 +563,7 @@ app.controller( }), testId: 'mapsFullScreenMode', run() { + getCoreChrome().setIsVisible(false); store.dispatch(enableFullScreen()); }, }, @@ -556,7 +581,7 @@ app.controller( getInspector().open(inspectorAdapters, {}); }, }, - ...(capabilities.get().maps.save + ...(getMapsCapabilities().save ? [ { id: 'save', @@ -611,7 +636,7 @@ app.controller( showDescription={false} /> ); - showSaveModal(saveModal, npStart.core.i18n.Context); + showSaveModal(saveModal, getCoreI18n().Context); }, }, ] diff --git a/x-pack/legacy/plugins/maps/public/angular/services/gis_map_saved_object_loader.js b/x-pack/legacy/plugins/maps/public/angular/services/gis_map_saved_object_loader.js index bc636c0b200f8..710997a9c0d7f 100644 --- a/x-pack/legacy/plugins/maps/public/angular/services/gis_map_saved_object_loader.js +++ b/x-pack/legacy/plugins/maps/public/angular/services/gis_map_saved_object_loader.js @@ -4,24 +4,27 @@ * you may not use this file except in compliance with the Elastic License. */ +import _ from 'lodash'; import { createSavedGisMapClass } from './saved_gis_map'; -import { uiModules } from 'ui/modules'; import { SavedObjectLoader } from '../../../../../../../src/plugins/saved_objects/public'; -import { npStart } from '../../../../../../../src/legacy/ui/public/new_platform'; +import { + getCoreChrome, + getSavedObjectsClient, + getIndexPatternService, + getCoreOverlays, + getData, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../../../plugins/maps/public/kibana_services'; -const module = uiModules.get('app/maps'); - -// This is the only thing that gets injected into controllers -module.service('gisMapSavedObjectLoader', function() { - const savedObjectsClient = npStart.core.savedObjects.client; +export const getMapsSavedObjectLoader = _.once(function() { const services = { - savedObjectsClient, - indexPatterns: npStart.plugins.data.indexPatterns, - search: npStart.plugins.data.search, - chrome: npStart.core.chrome, - overlays: npStart.core.overlays, + savedObjectsClient: getSavedObjectsClient(), + indexPatterns: getIndexPatternService(), + search: getData().search, + chrome: getCoreChrome(), + overlays: getCoreOverlays(), }; const SavedGisMap = createSavedGisMapClass(services); - return new SavedObjectLoader(SavedGisMap, npStart.core.savedObjects.client, npStart.core.chrome); + return new SavedObjectLoader(SavedGisMap, getSavedObjectsClient(), getCoreChrome()); }); diff --git a/x-pack/legacy/plugins/maps/public/components/map_listing.js b/x-pack/legacy/plugins/maps/public/components/map_listing.js index 6fb5930e81a20..ef1d524cb91dd 100644 --- a/x-pack/legacy/plugins/maps/public/components/map_listing.js +++ b/x-pack/legacy/plugins/maps/public/components/map_listing.js @@ -7,7 +7,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import _ from 'lodash'; -import { toastNotifications } from 'ui/notify'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getToasts } from '../../../../../plugins/maps/public/kibana_services'; import { EuiTitle, EuiFieldSearch, @@ -27,7 +28,6 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { addHelpMenuToAppChrome } from '../help_menu_util'; -import chrome from 'ui/chrome'; export const EMPTY_FILTER = ''; @@ -55,7 +55,7 @@ export class MapListing extends React.Component { componentDidMount() { this.fetchItems(); - addHelpMenuToAppChrome(chrome); + addHelpMenuToAppChrome(); } debouncedFetch = _.debounce(async filter => { @@ -91,7 +91,7 @@ export class MapListing extends React.Component { try { await this.props.delete(this.state.selectedIds); } catch (error) { - toastNotifications.addDanger({ + getToasts().addDanger({ title: i18n.translate('xpack.maps.mapListing.unableToDeleteToastTitle', { defaultMessage: `Unable to delete map(s)`, }), diff --git a/x-pack/legacy/plugins/maps/public/connected_components/gis_map/index.js b/x-pack/legacy/plugins/maps/public/connected_components/gis_map/index.js index 39cb2c469e054..2d8265bae9387 100644 --- a/x-pack/legacy/plugins/maps/public/connected_components/gis_map/index.js +++ b/x-pack/legacy/plugins/maps/public/connected_components/gis_map/index.js @@ -18,6 +18,8 @@ import { getQueryableUniqueIndexPatternIds, isToolbarOverlayHidden, } from '../../selectors/map_selectors'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getCoreChrome } from '../../../../../../plugins/maps/public/kibana_services'; function mapStateToProps(state = {}) { const flyoutDisplay = getFlyoutDisplay(state); @@ -37,7 +39,10 @@ function mapStateToProps(state = {}) { function mapDispatchToProps(dispatch) { return { triggerRefreshTimer: () => dispatch(triggerRefreshTimer()), - exitFullScreen: () => dispatch(exitFullScreen()), + exitFullScreen: () => { + dispatch(exitFullScreen()); + getCoreChrome().setIsVisible(true); + }, cancelAllInFlightRequests: () => dispatch(cancelAllInFlightRequests()), }; } diff --git a/x-pack/legacy/plugins/maps/public/connected_components/gis_map/view.js b/x-pack/legacy/plugins/maps/public/connected_components/gis_map/view.js index 358313b8f5b6d..06097ebea1900 100644 --- a/x-pack/legacy/plugins/maps/public/connected_components/gis_map/view.js +++ b/x-pack/legacy/plugins/maps/public/connected_components/gis_map/view.js @@ -12,7 +12,8 @@ import { ToolbarOverlay } from '../toolbar_overlay/index'; import { LayerPanel } from '../layer_panel/index'; import { AddLayerPanel } from '../layer_addpanel/index'; import { EuiFlexGroup, EuiFlexItem, EuiCallOut } from '@elastic/eui'; -import { ExitFullScreenButton } from 'ui/exit_full_screen'; +import { ExitFullScreenButton } from '../../../../../../../src/plugins/kibana_react/public'; + // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { getIndexPatternsFromIds } from '../../../../../../plugins/maps/public/index_pattern_util'; import { ES_GEO_FIELD_TYPE } from '../../../common/constants'; diff --git a/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js b/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js index f6bcac0dfc339..40fdac38493d4 100644 --- a/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js +++ b/x-pack/legacy/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js @@ -20,12 +20,14 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { getIndexPatternService } from '../../../kibana_services'; +import { + getIndexPatternService, + getUiSettings, + getData, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../../../../plugins/maps/public/kibana_services'; import { GlobalFilterCheckbox } from '../../../components/global_filter_checkbox'; -import { npStart } from 'ui/new_platform'; -const { SearchBar } = npStart.plugins.data.ui; - export class FilterEditor extends Component { state = { isPopoverOpen: false, @@ -84,7 +86,8 @@ export class FilterEditor extends Component { _renderQueryPopover() { const layerQuery = this.props.layer.getQuery(); - const { uiSettings } = npStart.core; + const uiSettings = getUiSettings(); + const { SearchBar } = getData().ui; return ( diff --git a/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js b/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js index 7063c50edad6a..15824b82965e8 100644 --- a/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js +++ b/x-pack/legacy/plugins/maps/public/connected_components/map/features_tooltip/feature_geometry_filter_form.js @@ -12,7 +12,8 @@ import { i18n } from '@kbn/i18n'; import { createSpatialFilterWithGeometry } from '../../../../../../../plugins/maps/public/elasticsearch_geo_utils'; import { GEO_JSON_TYPE } from '../../../../common/constants'; import { GeometryFilterForm } from '../../../components/geometry_filter_form'; -import { UrlOverflowService } from 'ui/error_url_overflow'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { UrlOverflowService } from '../../../../../../../../src/plugins/kibana_legacy/public'; import rison from 'rison-node'; // over estimated and imprecise value to ensure filter has additional room for any meta keys added when filter is mapped. diff --git a/x-pack/legacy/plugins/maps/public/connected_components/map/mb/view.js b/x-pack/legacy/plugins/maps/public/connected_components/map/mb/view.js index fedc1902d80a2..1fe3d0d493ee7 100644 --- a/x-pack/legacy/plugins/maps/public/connected_components/map/mb/view.js +++ b/x-pack/legacy/plugins/maps/public/connected_components/map/mb/view.js @@ -18,7 +18,6 @@ import { DECIMAL_DEGREES_PRECISION, ZOOM_PRECISION } from '../../../../common/co import mapboxgl from 'mapbox-gl/dist/mapbox-gl-csp'; import mbWorkerUrl from '!!file-loader!mapbox-gl/dist/mapbox-gl-csp-worker'; import mbRtlPlugin from '!!file-loader!@mapbox/mapbox-gl-rtl-text/mapbox-gl-rtl-text.min.js'; -import chrome from 'ui/chrome'; import { spritesheet } from '@elastic/maki'; import sprites1 from '@elastic/maki/dist/sprite@1.png'; import sprites2 from '@elastic/maki/dist/sprite@2.png'; @@ -29,6 +28,8 @@ import { clampToLonBounds, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../../../../plugins/maps/public/elasticsearch_geo_utils'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getInjectedVarFunc } from '../../../../../../../plugins/maps/public/kibana_services'; mapboxgl.workerUrl = mbWorkerUrl; mapboxgl.setRTLTextPlugin(mbRtlPlugin); @@ -129,7 +130,7 @@ export class MBMapContainer extends React.Component { container: this.refs.mapContainer, style: mbStyle, scrollZoom: this.props.scrollZoom, - preserveDrawingBuffer: chrome.getInjected('preserveDrawingBuffer', false), + preserveDrawingBuffer: getInjectedVarFunc()('preserveDrawingBuffer', false), interactive: !this.props.disableInteractive, }; const initialView = _.get(this.props.goto, 'center'); diff --git a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.tsx b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.tsx index bdd2d863e6920..b8e4c84ad56a1 100644 --- a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.tsx +++ b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable.tsx @@ -11,7 +11,6 @@ import { render, unmountComponentAtNode } from 'react-dom'; import 'mapbox-gl/dist/mapbox-gl.css'; import { I18nContext } from 'ui/i18n'; -import { npStart } from 'ui/new_platform'; import { Subscription } from 'rxjs'; import { Unsubscribe } from 'redux'; import { @@ -59,6 +58,8 @@ import { getMapCenter, getMapZoom, getHiddenLayerIds } from '../selectors/map_se import { MAP_SAVED_OBJECT_TYPE } from '../../common/constants'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { RenderToolTipContent } from '../../../../../plugins/maps/public/layers/tooltips/tooltip_property'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getUiActions } from '../../../../../plugins/maps/public/kibana_services'; interface MapEmbeddableConfig { editUrl?: string; @@ -269,7 +270,7 @@ export class MapEmbeddable extends Embeddable { - npStart.plugins.uiActions.executeTriggerActions(APPLY_FILTER_TRIGGER, { + getUiActions().executeTriggerActions(APPLY_FILTER_TRIGGER, { embeddable: this, filters, }); diff --git a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.ts b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.ts index 5deb3057a449e..96c3baf634a83 100644 --- a/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.ts +++ b/x-pack/legacy/plugins/maps/public/embeddable/map_embeddable_factory.ts @@ -5,14 +5,18 @@ */ import _ from 'lodash'; -import chrome from 'ui/chrome'; -import { capabilities } from 'ui/capabilities'; import { i18n } from '@kbn/i18n'; import { npSetup, npStart } from 'ui/new_platform'; -import { SavedObjectLoader } from 'src/plugins/saved_objects/public'; import { IIndexPattern } from 'src/plugins/data/public'; +// @ts-ignore +import { getMapsSavedObjectLoader } from '../angular/services/gis_map_saved_object_loader'; import { MapEmbeddable, MapEmbeddableInput } from './map_embeddable'; -import { getIndexPatternService } from '../kibana_services'; +import { + getIndexPatternService, + getHttp, + getMapsCapabilities, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../../plugins/maps/public/kibana_services'; import { EmbeddableFactoryDefinition, IContainer, @@ -26,7 +30,6 @@ import { getQueryableUniqueIndexPatternIds } from '../selectors/map_selectors'; import { getInitialLayers } from '../angular/get_initial_layers'; import { mergeInputWithSavedMap } from './merge_input_with_saved_map'; import '../angular/services/gis_map_saved_object_loader'; -import { bindSetupCoreAndPlugins, bindStartCoreAndPlugins } from '../plugin'; // @ts-ignore import { bindSetupCoreAndPlugins as bindNpSetupCoreAndPlugins, @@ -44,14 +47,12 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition { }; constructor() { // Init required services. Necessary while in legacy - bindSetupCoreAndPlugins(npSetup.core, npSetup.plugins); bindNpSetupCoreAndPlugins(npSetup.core, npSetup.plugins); - bindStartCoreAndPlugins(npStart.core, npStart.plugins); bindNpStartCoreAndPlugins(npStart.core, npStart.plugins); } async isEditable() { - return capabilities.get().maps.save as boolean; + return getMapsCapabilities().save as boolean; } // Not supported yet for maps types. @@ -96,8 +97,7 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition { } async _fetchSavedMap(savedObjectId: string) { - const $injector = await chrome.dangerouslyGetActiveInjector(); - const savedObjectLoader = $injector.get('gisMapSavedObjectLoader'); + const savedObjectLoader = getMapsSavedObjectLoader(); return await savedObjectLoader.get(savedObjectId); } @@ -114,7 +114,7 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition { { layerList, title: savedMap.title, - editUrl: chrome.addBasePath(createMapPath(savedObjectId)), + editUrl: getHttp().basePath.prepend(createMapPath(savedObjectId)), indexPatterns, editable: await this.isEditable(), }, diff --git a/x-pack/legacy/plugins/maps/public/help_menu_util.js b/x-pack/legacy/plugins/maps/public/help_menu_util.js index 72d51cc180eb3..70b9340b562cd 100644 --- a/x-pack/legacy/plugins/maps/public/help_menu_util.js +++ b/x-pack/legacy/plugins/maps/public/help_menu_util.js @@ -3,10 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } from 'ui/documentation_links'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getDocLinks, getCoreChrome } from '../../../../plugins/maps/public/kibana_services'; -export function addHelpMenuToAppChrome(chrome) { - chrome.helpExtension.set({ +export function addHelpMenuToAppChrome() { + const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = getDocLinks(); + + getCoreChrome().setHelpExtension({ appName: 'Maps', links: [ { diff --git a/x-pack/legacy/plugins/maps/public/index.ts b/x-pack/legacy/plugins/maps/public/index.ts index b69485e251be4..8555594e909d3 100644 --- a/x-pack/legacy/plugins/maps/public/index.ts +++ b/x-pack/legacy/plugins/maps/public/index.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import './kibana_services'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import '../../../../plugins/maps/public/kibana_services'; // import the uiExports that we want to "use" import 'uiExports/inspectorViews'; diff --git a/x-pack/legacy/plugins/maps/public/kibana_services.d.ts b/x-pack/legacy/plugins/maps/public/kibana_services.d.ts deleted file mode 100644 index 89b1fee1aa842..0000000000000 --- a/x-pack/legacy/plugins/maps/public/kibana_services.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { IIndexPattern } from 'src/plugins/data/public'; - -export function getIndexPatternService(): { - get: (id: string) => IIndexPattern | undefined; -}; - -export function setLicenseId(args: unknown): void; -export function setInspector(args: unknown): void; -export function setFileUpload(args: unknown): void; -export function setIndexPatternSelect(args: unknown): void; -export function setHttp(args: unknown): void; -export function setTimeFilter(args: unknown): void; -export function setUiSettings(args: unknown): void; -export function setInjectedVarFunc(args: unknown): void; -export function setToasts(args: unknown): void; -export function setIndexPatternService(args: unknown): void; -export function setAutocompleteService(args: unknown): void; diff --git a/x-pack/legacy/plugins/maps/public/kibana_services.js b/x-pack/legacy/plugins/maps/public/kibana_services.js deleted file mode 100644 index a6491fe1aa6d4..0000000000000 --- a/x-pack/legacy/plugins/maps/public/kibana_services.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -let indexPatternService; -export const setIndexPatternService = dataIndexPatterns => - (indexPatternService = dataIndexPatterns); -export const getIndexPatternService = () => indexPatternService; - -let inspector; -export const setInspector = newInspector => (inspector = newInspector); -export const getInspector = () => { - return inspector; -}; - -let getInjectedVar; -export const setInjectedVarFunc = getInjectedVarFunc => (getInjectedVar = getInjectedVarFunc); -export const getInjectedVarFunc = () => getInjectedVar; - -let indexPatternSelectComponent; -export const setIndexPatternSelect = indexPatternSelect => - (indexPatternSelectComponent = indexPatternSelect); -export const getIndexPatternSelectComponent = () => indexPatternSelectComponent; - -let dataTimeFilter; -export const setTimeFilter = timeFilter => (dataTimeFilter = timeFilter); -export const getTimeFilter = () => dataTimeFilter; diff --git a/x-pack/legacy/plugins/maps/public/plugin.ts b/x-pack/legacy/plugins/maps/public/plugin.ts index 0fa7e1106a6df..4ec068ff44029 100644 --- a/x-pack/legacy/plugins/maps/public/plugin.ts +++ b/x-pack/legacy/plugins/maps/public/plugin.ts @@ -13,19 +13,11 @@ import '../../../../plugins/maps/public/layers/load_layer_wizards'; import { Plugin, CoreStart, CoreSetup } from 'src/core/public'; // @ts-ignore -import { wrapInI18nContext } from 'ui/i18n'; -// @ts-ignore import { Start as InspectorStartContract } from 'src/plugins/inspector/public'; // @ts-ignore +import { wrapInI18nContext } from 'ui/i18n'; +// @ts-ignore import { MapListing } from './components/map_listing'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { - setInspector, - setIndexPatternSelect, - setTimeFilter, - setInjectedVarFunc, - setIndexPatternService, -} from './kibana_services'; // @ts-ignore import { bindSetupCoreAndPlugins as bindNpSetupCoreAndPlugins, @@ -62,20 +54,6 @@ interface MapsPluginStartDependencies { // file_upload TODO: Export type from file upload and use here } -export const bindSetupCoreAndPlugins = (core: CoreSetup, plugins: any) => { - const { injectedMetadata } = core; - setInjectedVarFunc(injectedMetadata.getInjectedVar); - setInjectedVarFunc(core.injectedMetadata.getInjectedVar); -}; - -export const bindStartCoreAndPlugins = (core: CoreStart, plugins: any) => { - const { data, inspector } = plugins; - setInspector(inspector); - setIndexPatternSelect(data.ui.IndexPatternSelect); - setTimeFilter(data.query.timefilter.timefilter); - setIndexPatternService(data.indexPatterns); -}; - /** @internal */ export class MapsPlugin implements Plugin { public setup(core: CoreSetup, { __LEGACY: { uiModules }, np }: MapsPluginSetupDependencies) { @@ -85,14 +63,12 @@ export class MapsPlugin implements Plugin { return reactDirective(wrapInI18nContext(MapListing)); }); - bindSetupCoreAndPlugins(core, np); bindNpSetupCoreAndPlugins(core, np); np.home.featureCatalogue.register(featureCatalogueEntry); } public start(core: CoreStart, plugins: MapsPluginStartDependencies) { - bindStartCoreAndPlugins(core, plugins); bindNpStartCoreAndPlugins(core, plugins); } } diff --git a/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js b/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js index 64a42173098ee..9dc07bcb5dc0e 100644 --- a/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js +++ b/x-pack/legacy/plugins/maps/public/register_vis_type_alias.js @@ -4,12 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; -import { npSetup } from '../../../../../src/legacy/ui/public/new_platform'; import { i18n } from '@kbn/i18n'; import { APP_ID, APP_ICON, MAP_BASE_URL } from '../common/constants'; +import { + getInjectedVarFunc, + getVisualizations, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../plugins/maps/public/kibana_services'; +import { npSetup } from 'ui/new_platform'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { bindSetupCoreAndPlugins } from '../../../../plugins/maps/public/plugin'; -const showMapVisualizationTypes = chrome.getInjected('showMapVisualizationTypes', false); +bindSetupCoreAndPlugins(npSetup.core, npSetup.plugins); + +const showMapVisualizationTypes = getInjectedVarFunc()('showMapVisualizationTypes', false); const description = i18n.translate('xpack.maps.visTypeAlias.description', { defaultMessage: 'Create and style maps with multiple layers and indices.', @@ -23,7 +31,7 @@ The Maps app offers more functionality and is easier to use.`, } ); -npSetup.plugins.visualizations.registerAlias({ +getVisualizations().registerAlias({ aliasUrl: MAP_BASE_URL, name: APP_ID, title: i18n.translate('xpack.maps.visTypeAlias.title', { @@ -37,5 +45,5 @@ npSetup.plugins.visualizations.registerAlias({ }); if (!showMapVisualizationTypes) { - npSetup.plugins.visualizations.hideTypes(['region_map', 'tile_map']); + getVisualizations().hideTypes(['region_map', 'tile_map']); } diff --git a/x-pack/legacy/plugins/maps/public/routes.js b/x-pack/legacy/plugins/maps/public/routes.js index 49705acb417e2..c082e0e1352c0 100644 --- a/x-pack/legacy/plugins/maps/public/routes.js +++ b/x-pack/legacy/plugins/maps/public/routes.js @@ -5,20 +5,23 @@ */ import { i18n } from '@kbn/i18n'; -import { capabilities } from 'ui/capabilities'; -import chrome from 'ui/chrome'; import routes from 'ui/routes'; -import { docTitle } from 'ui/doc_title'; import listingTemplate from './angular/listing_ng_wrapper.html'; import mapTemplate from './angular/map.html'; -import { npStart } from 'ui/new_platform'; +import { + getSavedObjectsClient, + getCoreChrome, + getMapsCapabilities, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../plugins/maps/public/kibana_services'; +import { getMapsSavedObjectLoader } from './angular/services/gis_map_saved_object_loader'; routes.enable(); routes .defaults(/.*/, { - badge: uiCapabilities => { - if (uiCapabilities.maps.save) { + badge: () => { + if (getMapsCapabilities().save) { return undefined; } @@ -35,7 +38,8 @@ routes }) .when('/', { template: listingTemplate, - controller($scope, gisMapSavedObjectLoader, config) { + controller($scope, config) { + const gisMapSavedObjectLoader = getMapsSavedObjectLoader(); $scope.listingLimit = config.get('savedObjects:listingLimit'); $scope.find = search => { return gisMapSavedObjectLoader.find(search, $scope.listingLimit); @@ -43,19 +47,17 @@ routes $scope.delete = ids => { return gisMapSavedObjectLoader.delete(ids); }; - $scope.readOnly = !capabilities.get().maps.save; + $scope.readOnly = !getMapsCapabilities().save; }, resolve: { hasMaps: function(kbnUrl) { - chrome - .getSavedObjectsClient() + getSavedObjectsClient() .find({ type: 'map', perPage: 1 }) .then(resp => { // Do not show empty listing page, just redirect to a new map if (resp.savedObjects.length === 0) { kbnUrl.redirect('/map'); } - return true; }); }, @@ -65,7 +67,8 @@ routes template: mapTemplate, controller: 'GisMapController', resolve: { - map: function(gisMapSavedObjectLoader, redirectWhenMissing) { + map: function(redirectWhenMissing) { + const gisMapSavedObjectLoader = getMapsSavedObjectLoader(); return gisMapSavedObjectLoader.get().catch( redirectWhenMissing({ map: '/', @@ -78,13 +81,14 @@ routes template: mapTemplate, controller: 'GisMapController', resolve: { - map: function(gisMapSavedObjectLoader, redirectWhenMissing, $route) { + map: function(redirectWhenMissing, $route) { + const gisMapSavedObjectLoader = getMapsSavedObjectLoader(); const id = $route.current.params.id; return gisMapSavedObjectLoader .get(id) .then(savedMap => { - npStart.core.chrome.recentlyAccessed.add(savedMap.getFullPath(), savedMap.title, id); - docTitle.change(savedMap.title); + getCoreChrome().recentlyAccessed.add(savedMap.getFullPath(), savedMap.title, id); + getCoreChrome().docTitle.change(savedMap.title); return savedMap; }) .catch( diff --git a/x-pack/legacy/plugins/maps/public/selectors/map_selectors.js b/x-pack/legacy/plugins/maps/public/selectors/map_selectors.js index 59346e4c6fb98..f350a2c944756 100644 --- a/x-pack/legacy/plugins/maps/public/selectors/map_selectors.js +++ b/x-pack/legacy/plugins/maps/public/selectors/map_selectors.js @@ -16,7 +16,8 @@ import { VectorLayer } from '../../../../../plugins/maps/public/layers/vector_la import { HeatmapLayer } from '../../../../../plugins/maps/public/layers/heatmap_layer'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { BlendedVectorLayer } from '../../../../../plugins/maps/public/layers/blended_vector_layer'; -import { getTimeFilter } from '../kibana_services'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getTimeFilter } from '../../../../../plugins/maps/public/kibana_services'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { getInspectorAdapters } from '../../../../../plugins/maps/public/reducers/non_serializable_instances'; import { diff --git a/x-pack/legacy/plugins/maps/public/selectors/map_selectors.test.js b/x-pack/legacy/plugins/maps/public/selectors/map_selectors.test.js index 77bd29259647c..b83be301653b8 100644 --- a/x-pack/legacy/plugins/maps/public/selectors/map_selectors.test.js +++ b/x-pack/legacy/plugins/maps/public/selectors/map_selectors.test.js @@ -14,7 +14,7 @@ jest.mock('../../../../../plugins/maps/public/reducers/non_serializable_instance return {}; }, })); -jest.mock('../kibana_services', () => ({ +jest.mock('../../../../../plugins/maps/public/kibana_services', () => ({ getTimeFilter: () => ({ getTime: () => { return { diff --git a/x-pack/plugins/maps/public/kibana_services.d.ts b/x-pack/plugins/maps/public/kibana_services.d.ts new file mode 100644 index 0000000000000..867557c296292 --- /dev/null +++ b/x-pack/plugins/maps/public/kibana_services.d.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IIndexPattern } from 'src/plugins/data/public'; + +export function getLicenseId(): any; +export function getInspector(): any; +export function getFileUploadComponent(): any; +export function getIndexPatternSelectComponent(): any; +export function getHttp(): any; +export function getTimeFilter(): any; +export function getInjectedVarFunc(): any; +export function getToasts(): any; +export function getIndexPatternService(): { + get: (id: string) => IIndexPattern | undefined; +}; +export function getAutocompleteService(): any; +export function getSavedObjectsClient(): any; +export function getMapsCapabilities(): any; +export function getVisualizations(): any; +export function getDocLinks(): any; +export function getCoreChrome(): any; +export function getUiSettings(): any; +export function getCoreOverlays(): any; +export function getData(): any; +export function getUiActions(): any; +export function getCore(): any; +export function getNavigation(): any; +export function getCoreI18n(): any; + +export function setLicenseId(args: unknown): void; +export function setInspector(args: unknown): void; +export function setFileUpload(args: unknown): void; +export function setIndexPatternSelect(args: unknown): void; +export function setHttp(args: unknown): void; +export function setTimeFilter(args: unknown): void; +export function setInjectedVarFunc(args: unknown): void; +export function setToasts(args: unknown): void; +export function setIndexPatternService(args: unknown): void; +export function setAutocompleteService(args: unknown): void; +export function setSavedObjectsClient(args: unknown): void; +export function setMapsCapabilities(args: unknown): void; +export function setVisualizations(args: unknown): void; +export function setDocLinks(args: unknown): void; +export function setCoreChrome(args: unknown): void; +export function setUiSettings(args: unknown): void; +export function setCoreOverlays(args: unknown): void; +export function setData(args: unknown): void; +export function setUiActions(args: unknown): void; +export function setCore(args: unknown): void; +export function setNavigation(args: unknown): void; +export function setCoreI18n(args: unknown): void; diff --git a/x-pack/plugins/maps/public/kibana_services.js b/x-pack/plugins/maps/public/kibana_services.js index d2ddecfdf915b..2a79314380330 100644 --- a/x-pack/plugins/maps/public/kibana_services.js +++ b/x-pack/plugins/maps/public/kibana_services.js @@ -89,3 +89,49 @@ export async function fetchSearchSourceAndRecordWithInspector({ return resp; } + +let savedObjectsClient; +export const setSavedObjectsClient = coreSavedObjectsClient => + (savedObjectsClient = coreSavedObjectsClient); +export const getSavedObjectsClient = () => savedObjectsClient; + +let chrome; +export const setCoreChrome = coreChrome => (chrome = coreChrome); +export const getCoreChrome = () => chrome; + +let mapsCapabilities; +export const setMapsCapabilities = coreAppMapsCapabilities => + (mapsCapabilities = coreAppMapsCapabilities); +export const getMapsCapabilities = () => mapsCapabilities; + +let visualizations; +export const setVisualizations = visPlugin => (visualizations = visPlugin); +export const getVisualizations = () => visualizations; + +let docLinks; +export const setDocLinks = coreDocLinks => (docLinks = coreDocLinks); +export const getDocLinks = () => docLinks; + +let overlays; +export const setCoreOverlays = coreOverlays => (overlays = coreOverlays); +export const getCoreOverlays = () => overlays; + +let data; +export const setData = dataPlugin => (data = dataPlugin); +export const getData = () => data; + +let uiActions; +export const setUiActions = pluginUiActions => (uiActions = pluginUiActions); +export const getUiActions = () => uiActions; + +let core; +export const setCore = kibanaCore => (core = kibanaCore); +export const getCore = () => core; + +let navigation; +export const setNavigation = pluginNavigation => (navigation = pluginNavigation); +export const getNavigation = () => navigation; + +let coreI18n; +export const setCoreI18n = kibanaCoreI18n => (coreI18n = kibanaCoreI18n); +export const getCoreI18n = () => coreI18n; diff --git a/x-pack/plugins/maps/public/plugin.ts b/x-pack/plugins/maps/public/plugin.ts index 14487b615e759..649627690ec9a 100644 --- a/x-pack/plugins/maps/public/plugin.ts +++ b/x-pack/plugins/maps/public/plugin.ts @@ -10,6 +10,12 @@ import { Setup as InspectorSetupContract } from 'src/plugins/inspector/public'; import { MapView } from './inspector/views/map_view'; import { setAutocompleteService, + setCore, + setCoreChrome, + setCoreI18n, + setCoreOverlays, + setData, + setDocLinks, setFileUpload, setHttp, setIndexPatternSelect, @@ -17,9 +23,14 @@ import { setInjectedVarFunc, setInspector, setLicenseId, + setMapsCapabilities, + setNavigation, + setSavedObjectsClient, setTimeFilter, setToasts, + setUiActions, setUiSettings, + setVisualizations, // @ts-ignore } from './kibana_services'; @@ -31,15 +42,16 @@ export interface MapsPluginStartDependencies {} export const bindSetupCoreAndPlugins = (core: CoreSetup, plugins: any) => { const { licensing } = plugins; - const { injectedMetadata, http } = core; + const { injectedMetadata, uiSettings, http, notifications } = core; if (licensing) { licensing.license$.subscribe(({ uid }: { uid: string }) => setLicenseId(uid)); } setInjectedVarFunc(injectedMetadata.getInjectedVar); setHttp(http); - setUiSettings(core.uiSettings); - setInjectedVarFunc(core.injectedMetadata.getInjectedVar); - setToasts(core.notifications.toasts); + setToasts(notifications.toasts); + setInjectedVarFunc(injectedMetadata.getInjectedVar); + setVisualizations(plugins.visualizations); + setUiSettings(uiSettings); }; export const bindStartCoreAndPlugins = (core: CoreStart, plugins: any) => { @@ -50,6 +62,16 @@ export const bindStartCoreAndPlugins = (core: CoreStart, plugins: any) => { setTimeFilter(data.query.timefilter.timefilter); setIndexPatternService(data.indexPatterns); setAutocompleteService(data.autocomplete); + setCore(core); + setSavedObjectsClient(core.savedObjects.client); + setCoreChrome(core.chrome); + setCoreOverlays(core.overlays); + setMapsCapabilities(core.application.capabilities.maps); + setDocLinks(core.docLinks); + setData(plugins.data); + setUiActions(plugins.uiActions); + setNavigation(plugins.navigation); + setCoreI18n(core.i18n); }; /** From 373d49223ac6aa13bf327fcc0bb25bcaf673cfc8 Mon Sep 17 00:00:00 2001 From: Ryan Keairns Date: Thu, 16 Apr 2020 07:54:06 -0500 Subject: [PATCH 54/80] Style dashboard buttons the same way (#63403) * Stylize dashboard buttons the same way * update snapshots Co-authored-by: Elastic Machine --- .../dashboard_empty_screen.test.tsx.snap | 11 +++++------ .../dashboard/public/application/_dashboard_app.scss | 10 +--------- .../public/application/dashboard_empty_screen.tsx | 5 ++--- .../add_panel/saved_object_finder_create_new.tsx | 4 ++-- .../__snapshots__/top_nav_menu_item.test.tsx.snap | 5 ----- .../public/top_nav_menu/top_nav_menu_item.tsx | 2 +- 6 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/plugins/dashboard/public/application/__snapshots__/dashboard_empty_screen.test.tsx.snap b/src/plugins/dashboard/public/application/__snapshots__/dashboard_empty_screen.test.tsx.snap index e71e4f1b15134..7210879c5eacc 100644 --- a/src/plugins/dashboard/public/application/__snapshots__/dashboard_empty_screen.test.tsx.snap +++ b/src/plugins/dashboard/public/application/__snapshots__/dashboard_empty_screen.test.tsx.snap @@ -667,14 +667,13 @@ exports[`DashboardEmptyScreen renders correctly with visualize paragraph 1`] = `