From 7b8178c839a17c74116113e733cbfec5879d0a27 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Mon, 25 Feb 2019 15:08:46 -0700 Subject: [PATCH] Remove Hipchat support from Watcher (#39374) * Remove Hipchat support from Watcher (#39199) Hipchat has been shut down and has previously been deprecated in Watcher (#39160), therefore we should remove support for these actions. * Add migrate note --- .../migration/migrate_7_0/plugins.asciidoc | 6 + .../settings/notification-settings.asciidoc | 53 +- x-pack/docs/en/watcher/actions.asciidoc | 9 +- .../docs/en/watcher/actions/hipchat.asciidoc | 393 --------------- .../en/watcher/customizing-watches.asciidoc | 2 +- .../images/hipchat-copy-room-token.jpg | Bin 16906 -> 0 bytes .../images/hipchat-copy-user-token.jpg | Bin 17177 -> 0 bytes .../watcher/images/hipchat-copy-v1-token.jpg | Bin 15551 -> 0 bytes .../images/hipchat-generate-room-token.jpg | Bin 114702 -> 0 bytes .../images/hipchat-generate-user-token.jpg | Bin 21372 -> 0 bytes .../images/hipchat-generate-v1-token.jpg | Bin 14500 -> 0 bytes .../images/hipchat-integration-example.png | Bin 150246 -> 0 bytes .../src/main/resources/watch-history.json | 57 --- .../elasticsearch/xpack/watcher/Watcher.java | 9 +- .../xpack/watcher/actions/ActionBuilders.java | 27 +- .../hipchat/ExecutableHipChatAction.java | 53 -- .../actions/hipchat/HipChatAction.java | 253 ---------- .../actions/hipchat/HipChatActionFactory.java | 35 -- .../xpack/watcher/common/http/HttpClient.java | 2 +- .../notification/hipchat/HipChatAccount.java | 126 ----- .../notification/hipchat/HipChatMessage.java | 457 ------------------ .../notification/hipchat/HipChatServer.java | 56 --- .../notification/hipchat/HipChatService.java | 111 ----- .../hipchat/IntegrationAccount.java | 135 ------ .../notification/hipchat/SentMessages.java | 153 ------ .../notification/hipchat/UserAccount.java | 192 -------- .../notification/hipchat/V1Account.java | 139 ------ .../hipchat/HipChatActionFactoryTests.java | 63 --- .../actions/hipchat/HipChatActionTests.java | 296 ------------ .../hipchat/HipChatAccountsTests.java | 63 --- .../hipchat/HipChatMessageTests.java | 325 ------------- .../hipchat/HipChatServiceTests.java | 279 ----------- .../hipchat/IntegrationAccountTests.java | 181 ------- .../hipchat/UserAccountTests.java | 313 ------------ .../notification/hipchat/V1AccountTests.java | 174 ------- x-pack/qa/third-party/hipchat/build.gradle | 31 -- .../WatcherHipchatYamlTestSuiteIT.java | 75 --- .../rest-api-spec/test/hipchat/10_hipchat.yml | 279 ----------- 38 files changed, 19 insertions(+), 4328 deletions(-) delete mode 100644 x-pack/docs/en/watcher/actions/hipchat.asciidoc delete mode 100644 x-pack/docs/en/watcher/images/hipchat-copy-room-token.jpg delete mode 100644 x-pack/docs/en/watcher/images/hipchat-copy-user-token.jpg delete mode 100644 x-pack/docs/en/watcher/images/hipchat-copy-v1-token.jpg delete mode 100644 x-pack/docs/en/watcher/images/hipchat-generate-room-token.jpg delete mode 100644 x-pack/docs/en/watcher/images/hipchat-generate-user-token.jpg delete mode 100644 x-pack/docs/en/watcher/images/hipchat-generate-v1-token.jpg delete mode 100644 x-pack/docs/en/watcher/images/hipchat-integration-example.png delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/ExecutableHipChatAction.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatAction.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactory.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccount.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessage.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServer.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatService.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccount.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/SentMessages.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccount.java delete mode 100644 x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1Account.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactoryTests.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionTests.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccountsTests.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessageTests.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServiceTests.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccountTests.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccountTests.java delete mode 100644 x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1AccountTests.java delete mode 100644 x-pack/qa/third-party/hipchat/build.gradle delete mode 100644 x-pack/qa/third-party/hipchat/src/test/java/org/elasticsearch/smoketest/WatcherHipchatYamlTestSuiteIT.java delete mode 100644 x-pack/qa/third-party/hipchat/src/test/resources/rest-api-spec/test/hipchat/10_hipchat.yml diff --git a/docs/reference/migration/migrate_7_0/plugins.asciidoc b/docs/reference/migration/migrate_7_0/plugins.asciidoc index 05de7e85b8e..a0e89469fd5 100644 --- a/docs/reference/migration/migrate_7_0/plugins.asciidoc +++ b/docs/reference/migration/migrate_7_0/plugins.asciidoc @@ -75,3 +75,9 @@ Tribe node functionality has been removed in favor of * The method `DiscoveryPlugin#getDiscoveryTypes()` was removed, so that plugins can no longer provide their own discovery implementations. + +[float] +==== Watcher 'hipchat' action removed + +Hipchat has been deprecated and shut down as a service. The `hipchat` action for +watches has been removed. diff --git a/docs/reference/settings/notification-settings.asciidoc b/docs/reference/settings/notification-settings.asciidoc index c3f0ca3b8ce..670522ee849 100644 --- a/docs/reference/settings/notification-settings.asciidoc +++ b/docs/reference/settings/notification-settings.asciidoc @@ -7,7 +7,6 @@ You configure {watcher} settings to set up {watcher} and send notifications via <>, -<>, <>, and <>. @@ -67,10 +66,10 @@ Specifies the maximum size an HTTP response is allowed to have, defaults to `xpack.http.whitelist`:: A list of URLs, that the internal HTTP client is allowed to connect to. This -client is used in the HTTP input, the webhook, the slack, pagerduty, hipchat +client is used in the HTTP input, the webhook, the slack, pagerduty, and jira actions. This setting can be updated dynamically. It defaults to `*` allowing everything. Note: If you configure this setting and you are using one -of the slack/pagerduty/hipchat actions, you have to ensure that the +of the slack/pagerduty actions, you have to ensure that the corresponding endpoints are whitelisted as well. [[ssl-notification-settings]] @@ -207,54 +206,6 @@ HTML feature groups>>. Set to `false` to completely disable HTML sanitation. Not recommended. Defaults to `true`. -[float] -[[hipchat-notification-settings]] -==== HipChat Notification Settings -You can configure the following HipChat notification settings in -`elasticsearch.yml`. For more information about sending notifications -via HipChat, see {xpack-ref}/actions-hipchat.html#configuring-hipchat-actions[Configuring HipChat]. - -`xpack.notification.hipchat` :: -Specifies account information for sending notifications -via HipChat. You can specify the following HipChat account attributes: - -[[hipchat-account-attributes]] - `profile`;; - The HipChat account profile to use: `integration`, - `user`, or `v1`. Required. - - `secure_auth_token` (<>);; - The authentication token to use to access the HipChat API. Required. - - `host`;; - The HipChat server hostname. Defaults to `api.hipchat.com`. - - `port`;; - The HipChat server port number. Defaults to 443. - - `room`;; - The room you want to send messages to. Must be specified - if the `profile` is set to `integration`. Not valid for - the `user` or `vi` profiles. - - `user`;; - The HipChat user account to use to send messages. - Specified as an email address. Must be specified if the - `profile` is set to `user`. Not valid for the `integration` - or `v1` profiles. - - `message.format`;; - The format of the message: `text` or `html`. - Defaults to `html`. - - `message.color`;; - The background color of the notification in the room. - Defaults to `yellow`. - `message.notify`;; - Indicates whether people in the room should be - actively notified. Defaults to `false`. - - [float] [[slack-notification-settings]] ==== Slack Notification Settings diff --git a/x-pack/docs/en/watcher/actions.asciidoc b/x-pack/docs/en/watcher/actions.asciidoc index 67844290cd0..34bdd2513a4 100644 --- a/x-pack/docs/en/watcher/actions.asciidoc +++ b/x-pack/docs/en/watcher/actions.asciidoc @@ -16,8 +16,8 @@ serve as a model for a templated email body. {watcher} supports the following types of actions: <>, <>, <>, -<>, <>, <>, and <>. +<>, <>, +and <>. [float] [[actions-ack-throttle]] @@ -271,9 +271,6 @@ include::actions/index.asciidoc[] :edit_url: https://github.com/elastic/elasticsearch/edit/{branch}/x-pack/docs/en/watcher/actions/logging.asciidoc include::actions/logging.asciidoc[] -:edit_url: https://github.com/elastic/elasticsearch/edit/{branch}/x-pack/docs/en/watcher/actions/hipchat.asciidoc -include::actions/hipchat.asciidoc[] - :edit_url: https://github.com/elastic/elasticsearch/edit/{branch}/x-pack/docs/en/watcher/actions/slack.asciidoc include::actions/slack.asciidoc[] @@ -292,7 +289,7 @@ that even despite the exact same version, an OpenJDK distribution contains different parts under different Linux distributions. This can lead to issues with any action or input that uses TLS, like the `jira`, -`pagerduty`, `slack`, `hipchat` or `webhook` one, because of missing CA certs. +`pagerduty`, `slack`, or `webhook` one, because of missing CA certs. If you encounter TLS errors, when writing watches that connect to TLS endpoints, you should try to upgrade to the latest available OpenJDK distribution for your platform and if that does not help, try to upgrade to Oracle JDK. diff --git a/x-pack/docs/en/watcher/actions/hipchat.asciidoc b/x-pack/docs/en/watcher/actions/hipchat.asciidoc deleted file mode 100644 index 27cd177975a..00000000000 --- a/x-pack/docs/en/watcher/actions/hipchat.asciidoc +++ /dev/null @@ -1,393 +0,0 @@ -[[actions-hipchat]] -=== HipChat Action - -Use the `hipchat` action to send messages to https://www.hipchat.com[HipChat] -rooms or users. To send HipChat messages, you must -<> in `elasticsearch.yml`. - -[[configuring-hipchat-actions]] -==== Configuring HipChat Actions - -You configure HipChat actions in a `actions` array. Action-specific attributes -are specified using the `hipchat` keyword. You must specify the `message` -attribute for all `hipchat` actions. If you omit the `account` attribute, the -message is sent using the default HipChat account configured in -`elasticsearch.yml`. - -For example, the following action is configured to send messages using a HipChat -account that uses the <> profile. Because -this type of account can only send messages to a specific room, the only required -attribute is the message itself: - -[source,js] --------------------------------------------------- -"actions" : { - "notify-hipchat" : { - "transform" : { ... }, - "throttle_period" : "5m", - "hipchat" : { - "account" : "integration-account", <1> - "message" : { - "body" : "Encountered {{ctx.payload.hits.total.value}} errors in the last 5 minutes (facepalm)", <2> - "format" : "text", - "color" : "red", - "notify" : true - } - } - } -} --------------------------------------------------- -// NOTCONSOLE -<1> The name of a HipChat account configured in `elasticsearch.yml`. -<2> The message you want to send to HipChat. - -To send messages with a HipChat account that uses the <> -profile, you need to specify what rooms and users you want to send the message to. -For example, the following action is configured to send messages to the -`mission-control` and `devops` rooms as well as the user `website-admin@example.com`. -(To send to multiple users or rooms, specify an array of strings): - -[source,js] --------------------------------------------------- -"actions" : { - "notify-hipchat" : { - "transform" : { ... }, - "throttle_period" : "5m", - "hipchat" : { - "account" : "user-account", - "message" : { - "room" : [ "mission-control", "devops" ], - "user" : "website-admin@example.com", - "body" : "Encountered {{ctx.payload.hits.total.value}} errors in the last 5 minutes (facepalm)", - "format" : "text", - "color" : "red", - "notify" : true - } - } - } -} --------------------------------------------------- -// NOTCONSOLE - -To send messages with a HipChat account that uses the <> -profile, you need to specify what room or rooms you want to send the message to. -For example, the following action is configured to send messages to the -`server-status` room. (To send to multiple rooms, specify an array of strings.) - -[source,js] --------------------------------------------------- -"actions" : { - "notify-hipchat" : { - "transform" : { ... }, - "throttle_period" : "5m", - "hipchat" : { - "account" : "v1-account", - "message" : { - "from" : "Watcher", - "room" : [ "server-status", "infra-team" ], - "body" : "Encountered {{ctx.payload.hits.total.value}} errors in the last 5 minutes (facepalm)", - "format" : "text", - "color" : "red", - "notify" : true - } - } - } -} --------------------------------------------------- -// NOTCONSOLE - -[[hipchat-action-attributes]] -==== HipChat Action Attributes - -[cols=",^,,", options="header"] -|====== -| Name |Required | Default | Description - -| `account` | no | Default account | The HipChat account to use to send the message. - -| `proxy.host` | no | - | The proxy host to use (only in combination with `proxy.port`) - -| `proxy.port` | no | - | The proxy port to use (only in combination with `proxy.host`) - -| `message.body` | yes | - | The message content. Can contain up to 1000 characters. - -| `message.format` | no | html | The format of the message: `text` or `html`. - -| `message.color` | no | yellow | The background color of the notification in the room: - `gray`, `green`, `purple`, `red`, `yellow`. - -| `message.notify` | no | false | Indicates whether people in the room should be actively - notified - -| `message.from` | no | the watch ID | The name that appears as the notification sender. Only - valid for accounts that use the v1 profile. - -| `message.room` | no | - | The rooms that the notification should go to. Accepts - a string value or an array of string values. Must be - specified when using the v1 profile. At least one room - or user must be specified when using the `user` profile. - Not valid for the `integration` profile. - -| `message.user` | no | - | The users that the notification should go to. Accepts - a string value or an array of string values. At least - one room or user must be specified when using the `user` - profile. Not valid for the `integration` or `v1` profiles. -|====== - - -[[configuring-hipchat]] -==== Configuring HipChat Accounts - -You configure the accounts {watcher} can use to communicate with HipChat in the -`xpack.notification.hipchat` namespace in `elasticsearch.yml`. Both -https://www.hipchat.com/docs/api[v1] and -https://www.hipchat.com/docs/apiv2[v2] HipChat APIs are supported. - -{watcher} provides three HipChat API profiles: - -<>:: -Sends messages to a specific room using HipChat's v2 API -https://www.hipchat.com/docs/apiv2/method/send_room_notification[Send room -notification]. - -<>:: -Sends messages as a particular user through the HipChat v2 API. Enables you to -send messages to arbitrary rooms or users. - -<>:: -Sends messages to rooms using HipChat's v1 API -https://www.hipchat.com/docs/api/method/rooms/message[rooms/message]. -+ -NOTE: The `v1` profile is provided because it is simple to set up and this API - is familiar to many users. That said, HipChat has deprecated the v1 API - and is encouraging users to migrate to v2. Both the `integration` and - `user` profiles are based on the HipChat v2 API. - -If you configure multiple HipChat accounts, you either need to set a default -HipChat account or specify which account the notification should be sent with -in the <> action. - -deprecated[Storing the `auth_token` in the configuration file or using via updating the settings now is deprecated, as you should use the keystore for this, see {ref}/secure-settings.html[secure settings]] - -[source,yaml] --------------------------------------------------- -xpack.notification.hipchat: - default_account: team1 - account: - team1: - ... - team2: - ... --------------------------------------------------- - - -[[hipchat-api-integration]] -===== Using the Hipchat Integration Profile - -You can use the `integration` profile to send messages to specific rooms. When -you set an account's profile to `integration`, the messages are sent through -HipChat's v2 https://www.hipchat.com/docs/apiv2/method/send_room_notification[ -Send room notification] API. - -When you use the `integration` profile, you need to configure a separate HipChat -account for each room you want to send messages--the account configuration -contains a room-specific authentication token. Alternatively, you can use the -<> or <> profile to send messages -to multiple rooms. - -NOTE: The `integration` profile only supports sending messages to rooms, it does - not support sending private messages. Use the <> - profile to notify a particular HipChat user. - -You need a room-specific authentication token to configure an `integration` -account. To generate an authentication token: - -. Log in to http://hipchat.com[hipchat.com] or your HipChat server as a group - administrator. -. Go to *Group admin > Rooms*. -. Click the name of the room you want to send messages to. -. Click the *Tokens* link. -. Enter a name for the token in the *Label* field. -+ -image::images/hipchat-generate-room-token.jpg[] -. Select the *Send Notification* scope. -. Click *Create*. -. Copy the generated token so you can paste it into your HipChat account - configuration in `elasticsearch.yml`. -+ -image::images/hipchat-copy-room-token.jpg[] - -To configure a HipChat account that uses the `integration` profile: - -. Set the `type` to `integration`. -. Set `room` to the name of the room you want to send messages to. -. Set `auth_token` to the room-specific authentication token. - -For example, the following snippet configures an account called -`notify-monitoring` that sends messages to the `monitoring` room: - -[source,shell] --------------------------------------------------- -bin/elasticsearch-keystore add xpack.notification.hipchat.account.notify-monitoring.secure_auth_token --------------------------------------------------- - -[source,yaml] --------------------------------------------------- -xpack.notification.hipchat: - account: - notify-monitoring: - profile: integration - room: monitoring --------------------------------------------------- - -You can also specify defaults for the {ref}/notification-settings.html#hipchat-account-attributes[ -message attributes]: - -[source,yaml] --------------------------------------------------- -xpack.notification.hipchat: - account: - notify-monitoring: - profile: integration - room: monitoring - message: - format: text - color: blue - notify: true --------------------------------------------------- - - -[[hipchat-api-user]] -===== Using the HipChat User Profile - -You can use the `user` profile to send messages to rooms as well as individual -HipChat users. When you set an account's profile to `user`, {watcher} sends -messages as a particular user through the HipChat v2 API. - -Before you can configure a `user` account, you need to: - -. Add a HipChat user for {watcher}. When setting the user name, keep in mind that - the messages are sent on behalf of this user. -. Create an API token for the {watcher} user: -.. Log in to HipChat as the {watcher} user. -.. Go to `https:///account/api`. For example, - `https://www.hipchat.com/account/api`. -.. Confirm the user password. -.. Enter a name for the token in the *Label* field. -+ -image::images/hipchat-generate-user-token.jpg[] -. Select the *Send Notification* and *Send Message* scopes. -. Click *Create*. -. Copy the generated token so you can paste it into your HipChat account - configuration in `elasticsearch.yml`. -+ -image::images/hipchat-copy-room-token.jpg[] - -To configure a HipChat account that uses the `user` profile: - -. Set the `type` to `user`. -. Set `user` to the email address associated with the {watcher} user. -. Set `auth_token` to the {watcher} user's authentication token. - -For example, the following configuration creates an account called -`notify-monitoring` that sends messages to the `monitoring` room: - -[source,shell] --------------------------------------------------- -bin/elasticsearch-keystore add xpack.notification.hipchat.account.notify-monitoring.secure_auth_token --------------------------------------------------- - -[source,yaml] --------------------------------------------------- -xpack.notification.hipchat: - account: - notify-monitoring: - profile: user --------------------------------------------------- - -You can also specify defaults for the <{ref}/notification-settings.html#hipchat-account-attributes[ -message attributes]: - -[source,shell] --------------------------------------------------- -bin/elasticsearch-keystore add xpack.notification.hipchat.account.notify-monitoring.secure_auth_token --------------------------------------------------- - -[source,yaml] --------------------------------------------------- -xpack.notification.hipchat: - account: - notify-monitoring: - profile: user - message: - format: text - color: blue - notify: true --------------------------------------------------- - - -[[hipchat-api-v1]] -===== Using the HipChat v1 Profile - -You can use the `v1` profile to send messages to particular rooms. When you set -an account's profile to `v1`, messages are sent through HipChat's v1 -https://www.hipchat.com/docs/api/method/rooms/message[rooms/message] API. - -WARNING: The `v1` profile uses a deprecated API that is expected to be removed - by HipChat in the future. - -The `v1` profile only supports sending messages to rooms, it does not support -sending private messages. Use the <> profile to send -private messages to HipChat users. - -Before you can configure a `v1` account, you need to generate a `v1` API token: - -. Log in to your HipChat server as a group admin. -. Go to `https:///admin/api`. For example, - `https://hipchat.com/admin/api`. -. Confirm your admin password. -. Select the *Notification* type. -+ -image::images/hipchat-generate-v1-token.jpg[] -. Enter a name for the token in the *Label* field. -. Click *Create*. -. Copy the generated token so you can paste it into your HipChat account - configuration in `elasticsearch.yml`. -+ -image::images/hipchat-copy-v1-token.jpg[] - -To configure a HipChat account that uses the `v1` profile: - -. Set the `type` to `v1`. -. Set `auth_token` to the v1 authentication token you generated. - -For example, the following configuration creates an account called -`notify-monitoring`: - -[source,shell] --------------------------------------------------- -bin/elasticsearch-keystore add xpack.notification.hipchat.account.notify-monitoring.secure_auth_token --------------------------------------------------- - -[source,yaml] --------------------------------------------------- -xpack.notification.hipchat: - account: - notify-monitoring: - profile: v1 --------------------------------------------------- - -You can also specify defaults for the {ref}/notification-settings.html#hipchat-account-attributes[ -message attributes]. - -[source,yaml] --------------------------------------------------- -xpack.notification.hipchat: - account: - notify-monitoring: - profile: v1 - message: - format: text - color: blue - notify: true --------------------------------------------------- diff --git a/x-pack/docs/en/watcher/customizing-watches.asciidoc b/x-pack/docs/en/watcher/customizing-watches.asciidoc index 27aa2baef04..895e9a89cc0 100644 --- a/x-pack/docs/en/watcher/customizing-watches.asciidoc +++ b/x-pack/docs/en/watcher/customizing-watches.asciidoc @@ -202,7 +202,7 @@ Actions are associated with a watch and are executed as part of the watch execut only when the watch condition is met. {watcher} supports the following action types: <>, -<>, <>, <>, +<>, <>, <>, <>, and <>. To use the `email` action, you need to <> diff --git a/x-pack/docs/en/watcher/images/hipchat-copy-room-token.jpg b/x-pack/docs/en/watcher/images/hipchat-copy-room-token.jpg deleted file mode 100644 index 3b954269fae1df6c4bfac17e4486bfb42a8abd4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16906 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

k#BZpPI*MkuFUq^rrJ)>--h%`NecrUeD)``8TO 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 YuBy|`74^{0(PGHi{7e&GDE8g|12S_Bpa1{> diff --git a/x-pack/docs/en/watcher/images/hipchat-generate-room-token.jpg b/x-pack/docs/en/watcher/images/hipchat-generate-room-token.jpg deleted file mode 100644 index ea296f60b6db68841731f6f3564eae11fda2f9a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114702 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 diff --git a/x-pack/docs/en/watcher/images/hipchat-generate-user-token.jpg b/x-pack/docs/en/watcher/images/hipchat-generate-user-token.jpg deleted file mode 100644 index 923626f8807c7a7031de26d4cd7173069c390a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21372 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 Q8f2rUq!rRXM1j5k195gl-T(jq diff --git a/x-pack/docs/en/watcher/images/hipchat-generate-v1-token.jpg b/x-pack/docs/en/watcher/images/hipchat-generate-v1-token.jpg deleted file mode 100644 index df594d12882a47a1cdf2d4741623fc78d28314c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14500 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 MkW!vf4k3K_KgVps4gdfE diff --git a/x-pack/docs/en/watcher/images/hipchat-integration-example.png b/x-pack/docs/en/watcher/images/hipchat-integration-example.png deleted file mode 100644 index 9d8bec6bdf947f275c7f5593324c9c0cb6d0b5f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150246 zcma%i1#lcovaOhz!9q(GGcz+YGiwAEGfNgr7BgGS%*@P;7F#r8hVQ%g?*4uI?nbn9%YQh!eB@p58;6Ok?5TztVl|euthklzYiHNB3r)^apG3M~uv(xQvN_1OK1|+JlI`c3D%!+)cZF zs3mf3@UnwQVhogK^131oK!f(Mt%4cxg9O`^aHJ+NpzOJ!l*5q-frObd$)_08G07(x z1H$EO8W;wALB5yLCNmO%KstDvgYpmzDWM43Odef6qS%M51ZDN^3U0t(1!rcaq0lIk zu*zZxs^_q= zs78^v?ZXJLk)j!6hD~2{qIofOC6K^HB&;IW+;|&Jf`EfyeAV>LL+RJfM^IAFY(`kG z3q~`rj1|AU4l*(0RO4jP#v-EIIeZ$9+C{MYno4`f?CUx}StYdx2_b@Df#+Gn_?ca3 z4E>yTXHY`00>r^hUtP9j;$6t-oBcpZv?2!Gp$*JcJFAgk!vd7b^eFx$e7$i!*{21P z`?2XT#Q109@Qsdv8YR0=RXN>>;6p#J_e?XHINQDR&AP|~&nVOQ)cYrqqLPnOi11{RHW)+^Pg%Fk;x5*glgc8*c^u*kT6dE=H`=~#jGmL)o!X%NV->cgzG(_qW)eTHtoL2JoD?x?s z67g#qNH&75VOfDa`{W7%0F^!CT#C>eh>5sbk##3cgDof!lW8&QU&f(!P=pgpCfIEco_=WoPs z;k}){nE)h3xkUD($^;kW>mwD&?ZdVUl>N@NHe%1LU6Z6H@#4>2XwY{6WnWSrsIxyP zV+hwOn8XfLhra*}XdE#XS-`KF6I^2Gx@^e9fWcgd#DGOZz7jB<9#=)=d;hmw$WNdY zJyu^qor6wy=ri$scF1ucfW3@?#ALzWW>67Dv6+NvQFI1yuLNJ?7|HOYgq6QL2gine z_ZUI@fj}iu_T5$z{F=uRhbtgc#Pj?5h{z8jk05Vxro@P{{IwD$Zd4cX&RIoPtgLTE z1+A7O+EG=aG_%^y9BWb8f(*IKv--E>+`*u-geHcbspN-IPsVYY%*o$iYaunM)B_fc zKO>N|MDGsVH1Rd`9+(G&7KmhZccG>+;epC;fJQL4yNULg(rQ8#N#e!b{|+D=r@c` zg`^Vee7uVEQthHPiAEV0MLDraeL8*HChf*GrAB?IAx3iumO9*WoEKaUoSb2+*c-xO zf@W{s`4*Zz{*qXY2j!!(lro@Nch$RAQ0dR=xWZcT0JD>&K%Q%#oJ?6^vsr*y z!GQ?PH?>r?IJL;d^6+oy2^3Xn?&iB30O(VjQ-UQoTU8rjn+TgVo2`}f^*Y;f+v?TX zGq5wPwZ^s1rskTXwdIv<$6TIZ9$J^?xjVjF zxH0uu^5nl}zT9;`zx6z{J)bchAlIPOAf-FPFVipS zBM9Wp|JHxVzgIA{r#0YQC^&Z}mraNxs4-}@7qK^pM4seEgj=LEk10(D8A+Cv>j@o`<(o8HTAn77j-@`x`J$mh2XW-4?N7!v{o zABlZW2dAsrom$5UxGE$)&A-lflR-;vzyx43Q2V~h>@Y-=!;$yJXUJ?O+i87c*rPku zwrlp@yS6XPoVzhwGQ%`8P_NO*{8&6(9y5?oFRDD#K4>X3XLDflyNhPa2Aqs1jl+)< zRU;a#cf_<-Id8V#u`K13*Ho|61=I;O*CV4{g=?80J`RM{cY5cGn6x`wfF0 zfy+ThBiV6_3aG9{u})hN+KgKMvX!$w=lbN>QZQM0K0~DLw?HtFq4esp<$R$Blp6 zvG+>&Ml3Wkl%7kMd*NVZ(R=lmBcNHvO=tQ?wuuIBb!N+n+ud#B4gkAKLKoPI>bAEu zS<2yM?_kH*o#pd#mlepGS--I(`Ul> z^;&8xfx%}`!AgN9`xigJ-R|X8(ofLuA(D#WSszXx2|4k#@O8OJqo^9`{rv7>uy>%h zYq@Xvv%Px9qPxz+)VtoW;=)YO0~atQS)Q;X+CWlHYW#h`dRo{`DyVCu--gl z|L}WC6NjKBk#WT6F%+4f194Y@2BCw^CfMPN$tUjglY)rb!X<}!MNi(ECEJA&%)$n7 zhy;NNvPi^Ri6SoQYkqtrIE7T?X|Mf~(80>1V?|5dF^Iw+6VGGr_X;H`KKLGGba;A ztFO*h_IAX7*flb?cX8$;CH-Tde|`S+)6CuK|Bqzn^cSq(02%)1VPK+XWcWKZXDjpn zqV`A6pKAZW_2+QBe;DIdv~oAI(Gsl=0R)@)m`s{ALPTHJX->2YHw_mT6_-Nk zu&(*F%ubjzuIAC}wd(MfTlXhWi5}Fi5WemZNa>N~N7hRFPPfS04EhD1cVIZdV*LN( zaA_h=d`Hi*g-Hi=1bVLj*50ud>N(nNE-cQJ|A(c&4F3Pa&Tx<*m_k?cmdWezyxx}b z-%I`B#6NWcfDt`BKbiC^*SGz6Kia|ep9uc+QlAg(<;ePh+V2j>EBt@?_Lsw#&Jfnw zzT?2Z@&1290uq8%;rKl~FX-(59o+w^aESoHJM_rXbEWg&#{M_?-?Lk97Zs=(r(+YD9H=`JB)>{wrkvvh?q9{G-tw>JNZWoWA4# z2QM~7dNB8Z`Z=DF|I5SwwEGnzJHVf2CK zz2^Ue7h8M~%0T^u4zYixq=z2tz|rGK<~PSrfIJ+pLI1(vf2GJ92y?cba{6-Grpxr+ z_Wi;0pCsb}t0MC|*V}>kTLyLX!*s|GKHM0(3_jkVT)+G^u01&zG*u_^^LeFBCi?l` zbEzZbj}eEr4MM>-G573Az_~{M(q;(lc`wi&tK8Nf?t5`e^s@f@DD9j}5UcwS({Wkm z5N^NZZN2@>5WtwzkNp#34}M6`yVz4S=~TGG-xFgC6=G}Q%?+&2HAnhB#{YcsuY2zC zid3<);=EZDy!@00OaK4)C~-Xx`w4M-+mcr6#UQRbzwv7hG@c{3q{)U z=O9O1Mn^~I;%skhu)e8NC;b-fybZ%X`Mc~~(tob;16KO9@(v#O7bUDY$^tAcYh=IN zr~WaHw()*$R<7otAv<^fxJ8F0= z1YVV%zj*%X=S&Ol$96?jmQnApsPqH;Pht^ke+@)V<3G8l= z95y@eKKie*GwNw1|9@Bp~>Gb#ajXq33@p;A`Uo*zeTI6Z_Zp!+pLjJe}G?)%MlJbxmcX%DZzNaf24 zBMDjs?Ppn=q{ba%abE!1ga5bW-ht`(0`cQ^iC=fhdM#xfz^k6!{Uu(w@%IA7J^Rr1 zm$@zuh=$7{EDO4hwp%^@pI5-z1MV;R+qga^xvA$epGjr`{U{b6K{or%Q2DjkGW0aav>Kk zXe~Vbwi%5?BLTg|?FWskFU=+bmG5teLb;wTjNTQ`Ub4II+jnm-9n>Z*Xjy6Lmo12X zITg;x(}360vUKqKjo6Eer}mGou9v$qlrYblGM>xyt$98*OfkNWkN5R0qI?0npu-FI z_ZYwGcYVlje$Ic-%1;3)qQqM!H0$r3Ef<4cSC3mVSRZ5Y-O7WHDy8vg!XHS=w|VC9 z#JQ0kG>e9LwrX@K*M%qLzs+q)LEK+<4qc8n)Opf}LA}eE`K6Wdp5LH8%KJRM?(&8F zw>6U!%$^jiT9m148xEyQ1JHYyTYuERPyg9BrA{}eyj!3+40z=_Xuxg>bX9YY6aM%W zak*@J_ecnOm2W@-#uQsVk_tq=#X@$Gj?=X@igzo+jwpPX<|?%64sF###Na42jtEv(-}fR(6`A0Y#>r_ycyUs2u-OE{ikO)t zlVld?T$6WIhv>c?#K?D9hYfLGQlFow=y=Q=a~?MrW9@MKElvN~7@*bPH7gOb6)uA$&$fr(biR0o+ z9ZE9g`xIgLf?725h%rrME0Js9N=pl|AM{Juvap*dQGX`JVTp1rb7%mE4}G>G5yeP- z^Gk<7X3{^A{%4uGvnfQpB-Y)BC3Q-ArxlOwiSVFV(qLNA6_HMAS9iP=baIA?_OKZl!6t?|XuyvuOEi4GK^u zr`@zm$bg`mb-QWwfac2yF;L%zbf^Pm9)8tPYX(0KxlT`BS=zXjo&j*fe8l@)Ys{Od z$_6)vGt{(9+uUgj2x&+HoK)1Z+ajiI_P&eWD}MX%FoRKb`PwQ;R7JnO^xSr!a%Uc0 zsjlG17;=7Vp$6<^M(ZH{`_k=?`dOa?Os(wLUPxN(39|#qB*cLdib0X82QH&2e9qm& zb?pn0!dgK%Zib$AtxMvF5L32Q?YAZR)8o^|_jkL~Q|rbiD2#o|(XbA*D(h;%Tg``8 zV%amp2`?`};ljFzvP-;$ullexrFs&?IK+zWfFa!uoqF93Mj{8`T> zxiXShd!KtaWfD7g%)tTNpG9oKomZ^^81_Ka zc0UhPD+^Do=@R6Pr>Hf#x=rzK67Ih`uO`E}EV((ad^`2308Lg1JIdWOuDEzR%f2;W?WZa!}#3N?ZB|O|CVO3?^Qx9|47Gu zz;!!J?sxjY2O@eawuwrTY=}i~Q@ysaP!cVWUB77BzIaE_*xRLkYP;Wo{8oAkS6qP3 z$g`a7=;pimR09v6mOY!M5Jh6PUsh#ZJhS|s2iFZprw}ScS5hHFVq2(ZZ{DxZQzu{z zM!om>tHzGs<2MG>=5rBqf&R`B_fmR+_=s%Xz+G$o+}D#v^*xS>Wruek;LEU^WH-ZP z`Lnj1#zv1N2ESH6vea@y;|qfTE7)R3Z8z{?zV74wVYL3`^d4wW3AX5DX*T7R)_TBm zMfClw0&(Ul|87X~;^^q{;nC;gjR?KFTemy7kp3H;zVRdB-N<{P6UEP|P-*TijfbPD zb04CuL*Lcd(+twjXF;47;bT|_TyHIY8>c)Pw;bNL0{^Idh%YxW_SA?)6G(bdVPes~ z^x1ZxSlF$V->`YeBULC9{n8HPT4 z`(nD>R7#L4Zj{hW_Yx;$0?$}H8)Q;LmT6LEa z(6!F8sy3HWcwB6pRQNjTh&Fi8R5>-ha=duzYVrwrEjy5)(frhUN_#!VSl0|#N#hNF zFh@8RHAoP`5Z0wpsL?L$j%AxlbH0i!*b>WROz}Eo_g>P;5Q+ap;}U|i{BjCE2oDTv z;*+ko&rmS?)3gNwgWKTb7l;vg5{LH| zg);aVi$)EHrp3b(uS89&8l${e{jHfvFY?;J zU-hmH#l4;?9x^s^>nHmz?QVN<(MRhxjZI5L-hzZU@xTn#Ibk5zTmmx+t!@e+l?2InUmMr+*YB0B_$UQA?sE8hwH3_ZL5v z*o3z`hdloIW?>5kBEM4?lPZ3_yz5!wuZJoQ>;Pa9PAn$anxUF2A)9g-X0xr6)fnMs zr;$c?t8EIA-I^o637y>J(o#08rDYyv3cUJ;XaGNt#XQSA<dIht6bZDC`AD^c*F%p={PHh-Nf%@=4I2@r$B$$>vh7xy`eDvyZ z()j%W0pq!hCh)31S+1CIj1u`XBm$ahx~K0T&pAQ|wq-86J7ba5V`%99mmMpe=Dx8K zz7CgFdOm8cwi&bVJuCb^6J9+P(x%6@19gi_R$tTk!j8s0J^cw&+AQ|O^_MER%4fC3 zZ`=Uo1{M=sjGFMo=gL4($_T%B46q*x-PE_CU`fV$U~i4e@F?Ft11Vg=;?= zFu7SX3u5!T`vRxSoDAOUn3cr6rNza%kMA0+cYW2klyYu_9z!)I{5)u|E}sqhS~&R4 z&<`q-+L~<3B?T<%#oYuv!tYCJ12k&g&(gGmWt=k{=$18@>a)pF_v)%eXN!2-5^tkB zsVRuTqF=+mMwKMxnLoh61hWsa=(xa}oC!a}?NPc#_1bYMb)QRhJF$$_j=S-2b^|Z2| zfOp`b2A2yS7UR7lOew^dCeMz_gP)hb-Q)juC_%m^)uQ8D!c$e~=r?Vjp5(fkmq$WAwsj-e!THD5Pg5&eEXGK+d1y)wO&cM zkY4xjF0`WdAU1+xhB$cM+T0w-_prymCTE}~DcSn*vemcy>g5;hZt`IdoOpnnmgvN5 zwD$8mZ(y6yO2Vw;?w1ejB+4GRS$zcVZ%OoYRr8EyzX@HViAGF;uW4qvg&LGly4KCS zrM_pqET)z54?l=_`XbMWCa6o^v6k$5@4Ar`$aJ5-629FIY-hb-dMpQ3!l^V{$~ zd4pqLOe!I$el1%-pH<3>Yz8mGzWgbkD4lp#6e}5dG0gc%wE6_rC60CfP)1jy@G%Qm zMsg<7in`BVh}gQC zP?O5$cN7PdcnY{h_+H;d8dxp>aj3I0l_&*mNc)+eN|iOHK(6-n)K(5e2Qb%y^2F^TFOW3WV5dq z=&+k@T%NP}+TNo#J;U;C-@nQ6+BE>)^vv&~*=IDHxX0k-OMWQut2q4#kM@g;^w3lU z^I&+AApAbJI}rH&%dDf~3cr>jB3zD5(bCDxj)fp|TD-CB+7F=HlV?2I8`@nEp=F6a z47yM1gjPv*cm`U6F7i$S82l)O>0WGN;&hkmi+)c2pm0VC_9*s2W!O-Frw1J%&qx2F zr1VxrQi|*3b65EL(Vb4lRZm;|)JO_8Dx8zr{iDArZ2#?CpQx%8JX;$tY=W~e({(Otk z{vNIRdMQS)sHg8<+VuWo`?J4cxD`rx% z7$m%t_MZ8b69jMMouH&wMT7Ijpkj`)U+0yhLTiEsuO0+zt*Z61b#fUNNZWiA-@b08BFM#P8noPMX^11%CEX^d0pB zx}bL7-u>5V-6~6Z<$E!07H85YQYBH1V|W)CL)0trLc&Q%lEKK=*>LJH(XP3#WkT*V zr-L`$k_7f1c$1Au?+7^XpL@20;-0mu8FPY4(`EfcDHiVwH^C*y4Kg+AV97&$QMS)Y z$)+Tq#Nn@xD4@7D}Lzq$=dH1Ff>&2r*4&G zclwFZdd1GGNsNvJ*t5lNyaR_s@!pkksacMl27w0>p?V{Zhe?Tennhl7oa zhN-9HAENE927GL#^6_ILZfpzPup0{QVA{2OT<3 ztWO-B;j*u+l6HEvKTR%U&9dS7XM*d=o5EQN5n*FLq8f4X4ew*+yk|Y6OcMLq+9Pjm z(Y=j8ce^{p;%w*=p;{nW(>o)mg&tB!c~>|bdbpF$`%I@mq4qY6)x4BUe{?# z8(+s_fbEsyr7jfJ*BkUomS&N=qogk+3(X!gt!`z}C*Bhi+YSN=EA|M7b~}W{uZD1y3&e&0#1H`TRSEm^QPYAvXYtB7HrRZwN7?VLU22|{x} zDLFaW*6a>_Iwp|YT|QDDHt`27_9*(v;Av75*5K!TsWA0mOb?z&4mdO3Bqgw=K4fYN zm|klh3IgGGx@Z4a$SWsJlu{15OwnfE1}ctcqRWzAfVPnfd#)D^_5nIx-)GPvs%J|0 z%`yhujshwUR@zrss?S}5qhA7iy!w~0I71klt!17P3r|_pQ$|&+c%9P#;8=gr)xz4zMj&5)psTSFqdyg(f z>;ryGk`pG6wq#DT&&33q-57qis(Jo~HEw4SEo5~{Gq9$?>-Zc^P?Ch30P9X2N#UV~ z1^nvHvS5(VWTTSOXpv5ejn_A%g{vQ%M*1qTs4dn{$yb3wp`mx;sdRelp6RNr2Bc=Cj*Pe?mj6DrL{jgdF4{=wS^;2X#8z zJ!|#SOn{U-BY1XWaD^1JhK(&V1yge=0SdOh)z|8B6Mj=&@jaq+YF^YYxRy)bsM}bP zEZd{#FQwq!teGNg=q6V;SiNPu45``@P`GvtqCTfv1kQcppA0(1ddp(y6^LTG(n`+A z)90qZX=C+E-jQ=R1!VBzI4*<+_^k>K{Rq#-W?@v5{K(sOWoIU3E#uvdlr$=c?)tj) z33m#>_te_Wh z&bl<}kq4%;T1u@BJ!X)RA{d+rHS*XN+_yy!YLvHxSpyF&R{RmT9W%EQj~Ey4#caZ zjpe?leza6NvVK_@qQzy)IYt|sm2lVa*3jw~e*PZV5KL1E`+_u!#(X95lo;WC8*&o$ zQlLysRYpHcdiE&gV8_WSk;bM1b=n))QkdqYKHq1cH2=YwJ54&SZI z9UjItOf60pO-l43e$c^gu`X?)O~G=_1MsN2pG(O>!I#!av74VzG9_k(wk z9N1-#Eni~ID&R8X1)QV5sYt!PHPz20&&a-oABVx1de=(Gg?a=#pkJJ$46YH2XtNfV zB%Zj20v+bY+Pk^Hesd_Y$4w&&Xw_Z>Q(D)QwxM*-*qW$Vw8-kJrBY8=(MnNku0wdT zY_vHXyPDU^g`edUY&=(yY^s%5X>@KLF$bo*p6po0;1U}p?Mevyw;G*3SPxU zU1#0;O(JHs_J*ReyAz4QMKaQY2WBlBzcyR~`HWrv+=PXuDUCtLmd9asU5BnTG_tB< zU78CqiM9;Jp*<34=hY9^Pg(#e9;o49JF8B#S$oyWhR?u$<1bR5yjyXgadbBO+B8{( z+DDqu7!y#iBGg~AklU27b+_!1pY2Lsi|CWL z1%aj-JR(A)dAH*Xj){*L1 z5$@gIV6)s5v9NK^U4}|xI25F7(vfN6;xlgs@-@7~TG%>7hYCaxVwK~uv#qX)pPmub z{bVV&0b$rv*92#WO~HsC9CXO=@ZP?Nl3P38ud5s*R^GP$b?Q(m9F0EHYgQP5*s z?<|wk>Goqj=031f`n#}G+AA_}wG;aH+~_%|uC$LCei|pqq3s3yPQc}{7DISZYxk&m znEqX9>@}K7C-YNdhTHJ@JLj8pC%LN>Y+r~eK2K$#(+Uz1zfJMCwTezFjXXS<>cr0h zf`mxq&w!gN#EcH7EcPh$Y-mU;&rS8Ci?t&^-9u4GZ_l3%S=_S#J*mVI8k1mJPfIuP zA{%puMRrA1tY1&gdKqkuh^srZ1+FLV&3EjxLb}Q=Qe-QLAH?)=#64O;%oLpJU(Sc_ zP}}d>pvporlj3Qb?swqZJNW@O;1uU8f+<;c-{!5v*`t*#%vOsefGdr!fl1gYHXe5T zml~~AgL8;kO9Gsh7V?N|hHf;{7Q_immUa_G6c%Soj#;*B2rHwXH3o#TpG;LYLS;u%rM-zJK6R)jNG=u|x{BW+a%)HXE{J~^jvDycI z`Kj1Gvau=6x<=J^5)Dw_6anT-w`ljPYR`3lq$Z1?qA_`(V=^XYwQ+qwAxE#t1=kV> zrSvj)r{C2QhF9T!HP4m(lQF11sLF}Vm*x`tr6TbiqvM=ZohCMn{WFcr#NpE}+nMK4 zzh{Uio|8ZlX=#V`%sMs%Z+a|rxWUPG<$IG zUdX5(K9|z{l>S6GND=68hd-DcqS*u09$7N>8?pu)*sR4Ps_xDfBL|JC3S)bLDuan7 zwK}u9{dIo4?@G7ll*oqPER^g*`6MQ{@w=B)-L8$W;0OGrG|4b@uB@5a8IoHIcCmLa zTw*r%F3u(hLqhaoRJRfrgVq|n`tz%)b@bsO7{EE;9aGF|l%#^<`MPe>+c$cVYQZ`h zFiIb#ByVixEp62I@im;Vy9^Zs#|6%ZOoS1dkxhA3nX#yL#_opxSRb$XyA+(wAsnXX zjv6T~=`|^sMK+RhvZNNKlY?3(CKxNCmG{_4mO0_vGl3NPI#vUOX@6&t&w@Qd=t)4rNA<*VI^jXjpo#e-W`BJ}hrieFNM#Uv&>p21Rx zP-%|IkYq`kfo(^g=TyWlq6ot0V?T+(0dt+VA-T$^rb?>vSAHbk&Y<5>oaa~Z0!FKh z_F=)gABaTjzK8SfkZ9u6WlPk}z^f`qK&}$^h+Baa_^N+|iw(Mat|J@o$UIVB61^&k zCy&$*PwaK5|Jasx%oSqa6Y#0R+bzF_-BQ+jjD&c-1vI!upe(j#e15$Y`A{kVB?&f7 za{LsraF|OO!{qTr4)Ym2>@uuHV^4n4TvknSae3KMYAJ#d3&_~S#*gf;E6&Q5mE>SZ zU7}#w4?3zZgWvJTHbM7Bm;viidjo6Dr?jn9R#qiTFgX-+l2J01Ve{Ok4qS}v$axiZ ze(f4NLRl&WGY`}ss3>)mQFvZTEgc3X<01SQ6O~KLtA=_u3%88?9*RfHit2oAR?S^) zQGM1E;>nlCrb4snLC-jHo}qlC{7>e!LsQwu&DldyY-3*aHC8lEd#*2QE;<7yZ6;N) zTE&JYlnGeHSXb6&L|KAy0ge@JpoNA-vv8C)NE~rQrWhw?PF8(GK)rgJ?Twmhp#18> zHM?}(kHtoI9W*ml#E7o+Nx8(cO&fo*R4KkLzx2>#cNfgL3fe-t#MFcb8#MB>#=9>% zG>e+!_ZZT39vQkcYZGu_B(=UgP*}E>ou)KzyfaRFNYW!-_je;@(Q@`sX6m*k&1^*R zVAYn<(Gqm)k;3s!6qget_Oy95Vxy0X9(62Y^Mqf zg*!mMCt{D^yCOc{Ib`Vc-gJH4iV)f4HN<4Fcx-QJG?s}aS|R8I)oXhnA(Y+In+(j6 zhNTF;!IPJD-VNw%2><;B2H2hphNk^-&I<^otS^fKe0a!Z_ zBy#FQw!XfD>Tp_sFH4W8{Xv;4GkeQbD;x#}pG{{gCiBIHe&Pg}WL&8!5KYb@4Z%eO z+zhu@;ES1l3o!_k8;IQn?}FYUBVzivX|Qngo+6B*Tcx(qRgu_?>b@&<(OI(_3|laj zU`E3$q@`cKKa7vw?lQvPYYg@_LZG9cyU4`65|wAY)g~Hy7ADYVM?_o-y(1e;9h($r z7}eo8iWKchBe1^gglq@BHZTGu#VN?AV7cu8Qd5C2N_OJ}bT2AyeY9k*F#CsCx8 zX+U?5INTs5IQepDd+ajdSb1llzwfbx&!0iOX|5@Ah{4loFoN6g%FgE44#HSVzh;*kseuA}ai#>ZP6GKB~2)up{5gA)%6?lA2mh ztNPE)jMR*FiWLgq1&X6Hu31(o{V1R+)i6q*Sl*VFgHe(Ar7%)#y?htMfm18X1?!j8 zH>NUESWGR^y!uU(i-_aKmL))g+5kvP16e~+{AL~wqBV`nlj}84&R*rJ^M<7WmE^sB z*|OSRB#vFZX&nDR0`GkLpV+>Mmx!9m%ykYjHdAZQ3s5(rqvDLzb)BK=^>?4V=Q)i+ zQ?7Zd5|~`d*4J9wTba!gI2cwNrPzbs%5elwD|13i%n#%+oGlG3U zxi5rECR5?}aQl2&k=cHyTCDt@N}kBq7tmBog*}a- zk;180_w9<-XdQ=PKJ(CW0o)NKwpCogW73!+j&iD2S{Z#b1n4DQSV@FidlJ>kRw zmN~leN7&7l@bU87X)ill9MXTvK zBu!t}!C5U7wRr#D1DfkC^q!iNS}TD*-s_R~K?!ww!M^mh1(RH=rGZjSuiXdL!P#b? z!FFPO=@o|}likL%e6fyhlbv)^g1;Xc}i>3;wR|k4+bYk zrtYCNp7Hdik=OA@UfvlyJp%3=Q5Kr>jd|ItOzX&AzLqxZ$D~;;E=(K@Ksrkar8}(* zQ%|FeQ^{30bIxLQ5?Fq-;8pWpzoJBlKsNDCE|GAKH}+SEuL~*duNZrD2N3nDgdUzA zL+YFkEm}eC;^-IL_P$HawgJMV614{D$xfvfPan5oE~L&*U; zZFZ7T0h`tcYQ!hi)puA%H&wS)L9*xM=n=`rLjfsJSCZ+Qo}OM&2&peNm28vCMon2# zcsm>pOIFd*YDmMv`JJ|M6;57Srz~OKm5NIqrLG2Y%c^4e7t~dhy3Msxvgz~dbq5`N zf}7dol9fe(7x$p1L2SPgpn&ab8w+^$NhkybOMhE%{p`tWU1f#ivnmBsEkR10*?i`s zjipTkR>vY9{&(zE+2QOd9uaDPQbSVh0TZiCBRCJ?LVEvgD2mRj4tqHSfP8e%ELqEVmyv7D;CiT zYrK6{dGJTkRqQ;$ED7#{?X4+vO?1<8{^(k0JTdoiW0>5F=40C z=~o-w0Ud(JP6^_$*$~ODb4QLXeLEEW2Bv38U}@8&VKf)*?voLZ{Mt8$wE0d`YeO5K zGcx;shWeO_=)@u-HfZv^SjshcA!s@np^8nvzMLOb<6w+>v!>VNwbBh?J3XCnBWay- zts%T~?vtN#5^U!4_rfNq)ZT8$2kj~Ex(Xy{cK`al7up^YY+H|skVAz z0L7HtY9+OI@3|;?OE5LnP6Bt;TyK+LX?E7g)|PH5eaM6-X!$WNXRTU0c4h4gC^BA# zR+wgRnqsq3@}&ODgq=Zm)LdBTK&6GEptGiiMuE!$dKZ}3M!^+s`@J-LZ(mY(Y)N*}>k748NPHg<9v=arJZ!tNVwhy_{Z za1HO9p0uBEjLj4(zxmXc%eG9>6>EFDrb9vuZ92-^B6S;p`KJSmEp@`&Fi{807#B7d z9X~qZrQHhKO4;>8(b*yGOVV@O#`GmD{0bT!SKD4JJKq?kop`<0Sc)6z=t{Fo%?q2R zsxQKLxvK8GU4|yxy09$=N@&Txu0t_yBw@C(>vJm{u5TB7FHiw~Y(fIHVJ>X-IJ+bQ z0_-L%=npoZ7~V~pL+8#?k}H8V*?m7M`Pz(|FXHTt`_&OLuZYjd45Xhf!E(~t?9tcD zVbU{_tsWtb*pRdg;s;@3kE@j=-w)=%y>2b3Y?gGcrtAP>4z)r$=H@n@n1gG3OnoCe zc@f1rHxd*TwkU;%_raArWcNY1}W~@wh(q2J-0+7|w4<2sCRs$xUGq=3(TtL{prDWe_FK zALOh*C4`=T#d`1We;TUfxqn)YRUA6{$q)sxd25tDg9=aSR%~u->p6abeowZoXo2s3 zl5=X?bE@8NrUAFAWmt$|0$OEjy#qrQ;q8IJ5_6&)!6Z*~%c^6~)Az9yyg9Jr^pwM} z-Y*er%O{o{(<{lyFkv!7ayE7-;`O!NGBT19NTIMo0W44i+9S1(yCM3Z)4EaTp$l-xO z4ii4kh4F3A#r2nV#sNV4yuf6Wy<}4{Fd6}QbJB=*WVy0;o}3*IpB;Kz_vJQX)0Yu2 z4tp4@FAv#}mpHlS!50~50x8mCi8z#nAk1a*bVkDC0Ha_9n~p(~6$8<`DU+eICS>`^ zRy0|o*_Np>hB;w!CO-HW?59wZ(gaH~Gr$$!>~(E9g_E2q@G8XDlBg!el@~ZJ1JlI| zZbT3?{)T4eU~G2%!^hD9$KFkzh^*KD#jUD0D96tXnJ{V%uB{y7X?<<2qPC;2U$)rR zmEiNbWTKzLNutm7PX`{hiJ~w$DcC*vxR#64^6@6d$y5{G<)$W`Ba$c&naj=V^n)X! z%bIzymtCbTW*ixHTUU`qWEaQ-|guVx3eHO#%@FTG0a{irfKdM1qF zDr7^N+ODFEQ@5JIu-lnq*DS(^ds=xAJa}8imz~-0Vqm9j?G^G>DQBhhGlBYipb|QN z>1KNE;FEcV4zD$fPLR4m%ILJ5?q&7VX9&Y#SLr%&Mj0ZTx% zzuJh4Ul~9cS65NiEZHLrzO%WMwQ#y>xThs-%8NSQBP_`;!)w?Wkx{WjrQpnOGHx(p zEzNFOQo=h%yT)chg0blm!rH_HZyycskXf6M=*4XnO||3>GO$$gs+|YtjW&DAtHB!8bwE9;YtN-ktcm!`jx@3R+YR&%gh?7slr|jST z`VdCT`p7dCZ!dABFxlA%2U^r9Xyp~hzTG7;qEEO)NNUXSiH1hsl{MOchc@p4CrY99 zK+4pl=I@!W?8@)|WdF~fA6w0#3-)jS=|9>pdb_L@M**zFp*^DI#V(aEdZ-^BsKJQ0 zy@s*y>Ywbte0tkTZNv7f?B8R+#jwNXx17s`HcBHCc($T!*{LgZI@rM5C6p1x#RoQb z<^Qx#|MbxQFm}?~&i=LiFaPl(a$bWa@!FF|V$2M|Yg)L5!nDyB&O%!x3fqYHo*H96 zq!$lGd=w!UGV_P>=fgoV@G6IYa!xW?zJb z6BmJR_wnIV>v{^UY6vt4XN7Ug>%sEO56dXPR!fa2+M2Dql~YM5z9c0|(GuaiuU<;| z_LuPFB|a2JF}9&V>WRna{;?gm6{3QS858idK4DBLUEB}5$u;2kFD!JwQm>4CPw;)* zc^aRjm3J!xi+#d`&3*p6a6xb`uw21*DD1h21oc-Sc>l5 zOa04Of_9agEHBvfgS+;--`>Irp~lYq@R=s5@qcM=CGZ;9Q zF>>Di(!Tl}ru$m*2%{=QUIO_pNeDcwhqgZYnce&HzuTX$joa4~ z$fYb&iByx7>(5x<@Q3y{e|6e^^+AVqqKuWHMe;XNwv~|`XYYM&fBO7u`}E4F&7gQ? zmq&lKT1U@O`{Zv3Rr>4mHqhC`+7GVsUdAxEHbEON{n0-E=7D|vc-^8zyX_6Db; z**h*u7Q#r;I@D#2oP%w1Hp?rxyJaUYeY~bzj)vPK6uLfr4=Dw@3iLWlEkCmgK;7JP?0UDBii@! zt`p(VT0*z7_~^1-{_3jz=_{Q3CRfR)+=S1>`S94qi}um4KDKiwhODcW5Uj}GDqSa5 zVv<#bUygty@b)9{ofP9iugCPG8A6kgzL!J%W~|q(gvuD~CkF1CJw`z{d3(~vP?)#1 z6TX8m8vXq}D7QPUvt3q0l+;+S>)ZPb8Kg3yVfiKA@yg5yUc^$;qGU@lAs;(!?+qWe zlf!LPZCn-8I&YwogoCTc>uu|T27gT}4(w6%Bi+R@{~ zgkr#2j>2n&@GbWr5^m)&Ug`HA+IVN5tr6;=NSx>Ose3kh^M>7efX8&P)w+%zwu|Q! z5~I#ic+rk#@7e>b#q$VjYnoi)hrJ6@%pjG?Q!{C}_^!nZE4#c15(pG5F_!H*LYRR* zJARm0&L{&XZr?*;PpAaENhju*!0{^R8A2I%YS_B!S+J%?3AsUdnR&bj7AEj!UA103 zwEI!0<`xM#bNd@S#YgQCw5JD8+xa6$P{g$pHU)zNp78f>jM()nk8O7Bj@_aU8i)Gv zSZJ^&JbLFxZlDaCvw7>Z_9O4v`3uMGbWh6aF?5Kon^$k52%fXmnJDDN08De=Q(xIEJ1(7MsHoS`=gV@+9ziC)Qq+E4%-mIdS62%07UYG zXcA+v3B!9N+c9A6hgYpq|mMwIRo2Yj*)G0gM*}X8VTeFj?jmeVTQ~iT_XArC>eQHJvld8!20U#t zc-0LK^@PwKx5ig&rc7Mvwthklowk!F4zr=bGbXWMbL0)NG})jeF^aVG4cOqZW1RMA zwz@ogK{%bUhZ8okhC&pBNCQ|MJJe%?jK>5UCJ81<`XP(ZpGo2Ij{n2T7{gs2B}t?89%5sYpRh+Ggb`t$*(h)l;n)c~eCjcfDS zz-ya_1doo6@{nLc%-mhI>x{E@P8@XhHd$MW4anR*8@YMat`SaWDPLz@M~>Q&GiPnE zk9g_{3|zB}W%Az~owo7&t9A{;PAlFh9X)-FFud#89<4hU>^@F zPIH=JapW%Eqw{RO$L-#9!s?nh<#P0dogX5kPIk+PmxR&ap^eNF;$&jhMp~BbFy#-U z7|$@*#Q5w1Ml7c}o0rrG1w3z)coMaA4q12qfSozoWc>{roYr}a7yNx2d4OljU9+2m z1J;0nbD)K}e7Kjn38j1vW5E)07B1#(&F~BYb21Sr`{$PyZDO4{r=iC>5968I(-t0B z9M!G<;sq(y>Iaeb#$6&(Y*rx_wnOM&x5=^l_VuMpmODZSoL`^}sn_!eGFG3ch3^PO zgU}xoBxDT7F;#$$RpY6g!n;3PT(d1gYdvC}xiVQtxSBc}>Z!FRPFcuHr@)3iJSdEO zK`BFsCLQ^#Bi?_Rus{nF5AE9JNoyEBViyLxt%o^0OTOqBIGYY_G6U&S6rrrpk#i|K z)sAp!L!}pFvKt8TS*zlPs(&gI6#2Eez*woxZTK8mDBKT<73x)7{;;VCMF7RI?*?=kh<>r+?1bXRE)q^Nq*t*KBy18p4LPj51B3 z5rQ#8xTyWQgg+Z1^@Y4mV?|M9;3OS+Qeo3i8!FfaMHpp}IfPgUURT0Lbg8BMS2^PT z5I!QyJWy`5{0cZ>K+NH#SlYzkkHS30N2J78g|hhTf$tSkb}*@-+!CR$W+onllW^tU z8hh_=n1^|GMKjNpNWhn(tH693_%80Bozg`&#%{b7rEJ1FX6qUFjX8W1FU*X*t&oXS zMtFtx(IZlhDjb0LMn!Ntv`KxYFYrT%;~DrzSVxq{>=(W%EoFog6_lfU%Bs1)2u6Cz z8&3vNDTWG*w>b%R$F5u<9M#d&_OmU<8y;XdK4PF_T+$1)a<`pS68eQZK}KV&Y5t7D zp@f=39@Q7(`o{blc!SKs1^lwCvE|Yn2Aq2~KecK%3dgLWyWN^lT=j==YEtq+FF3{R zd}3~J1Qk84urAB9qo_ugiL|%fGeB+pl~Kj7(oZL zGn5t-&btayjge3ueHV>p_(FXp&4oGSiqRe+u{<6%g=vr zpIt+qJJ)1GhkuG^t;)h#2IYBK*lKI`KHrv1mzc6Am4=^^N z!20YOhJ4EFLSU8ma-Iu^~a|r@&YI7SAi1JENG|R8^T1 z)E{wQMtvReUNo0PXva<#LO@i?sHK?d@f;T9BGt3g|CCYTfsmXrrTILnCmL5f{VAI1 z-!LBNvz^%A;(e8=0(J(ezGD*CH~_y?5oPc+O4L98(SHBslnwkV)~63O*@9mYL;NZy z190M*dNg78zxm3pefE3%@+PNf3+JqDz8g8D-#$FvOmk?t3?d>$HE=q0du0_5)NxLz zeq;Bpd}fzEziEHD#(LQ{Z>6q&JB?DkPiqb21<&BXUl>-_7cdIK2fzJiyT6KaMo%Zs zO~`;-8|=k6;oQ=L5$mX>kK~MlyVO=9%-^bQEsojU8`tblpIt$&B^|P3h9}bJ@tj`4 zY2x81VFdH+IkQdn{>d)uLbs{7;Nk=}0~lkk+KoT_*8cp@|6*T`Z`q@A6hbpmB!r#S z+j1V6>+}F?TYFHZ>y&L0BW8YWl9PF#+ND4J0Srg%$~ZLBCZtBoaq?+_@Oy_&A7`Jy zx+G%(P8JCqc-H4f?Ecly?ejmN7{9}QHHSQccYZR5L4OW;7iX^$^F(c5o0YRY)Bg7##h<>h-`+{uh1y;_k1{>T6EZwAK2wybOA5!Z z{)P2k@&+S9@&T_%Nvq-mM~C$4+3?Je%Bi==BU$&gG-z#Lz66uNa}m=8y3#y*C#$)f zlK?>$`fAGR4-eV-K~BjwHCnBV6XaFC!k+wMTkwEpJ-a83%+|;xlp-8x4zJ-=9BSy= zAQOna!`M=r$WsFzX$-KMFSZJVD19_yU;O@ayTV>)zOU12c;;AbmVF!RBaa_oF44@S zv7vE6)O@Y*KOFh7WgJPcUT^}IlN}g~gRw9WUumb>2R*vv zbR~zO>iJ8p4>X2#UVKoMKJcExZ?T6_al8W7e9#=LYQp*lHrlsJeiIHd*y_1fTR0g` zGq&$ux{RY6r=Zu_C$e@WkiUwY7++ZC^jQ{XARLB%GDO?azXU!M5uvT3I(&*g_+LlB z5qN76_)d!P>Q;xjNRv-kIMUYILoD21e1MV@0qELo+aOl%>c+ZFG0|)y49!lW3}@qC zN08|TLXtFfC}uSt%ftP4xI-c#*3>+nx--P4%jL&5voK?~A1`pEztxUq74kt|CM?E;P)K&4uz^$O?L)#C9PT32 zgpOBEwOR|FlI6uI8{w##ChGzd;s!^w9}|+}-gN|;MHHFC$L)ikU$hTS6R)}v0bqOC zx={jlbY$!=gwR-A$I}bNn~oa2$Q9%Pgv^4xAht6oqYl}r4}W6spCyiQ141PV=tFo? zX9_cRb&Q21)nl#4erhK#yl3Zznyim-3;E$z8)?KN_%F9OcFKeL2t8583Z2YB^E_cm zP*~l|cUfZKLp%Gy&+L=;`s^6tN9vN`QCI@Ee&T$8WxxCEp3M;3{2m_UtteZ1QNS(Z zNl`*!U*Cj>`4G6BJa5N(6KtH1a2y$BUQeTa@x^UhK#7NbnNTR3w!|^AdGc=aP{4W& z9bH4m$#>C?^d+p7#dU~$U6p(@Z2pr1p@^3OMu06m|5xS_=;}J{$j2Ys$G?8xPP8{! zI~z5{e%w5SXL)AZYFBRAR|>I#!bx%2wh3i0^7V+7~qgJGU+Kzo>$KjpxDDnpgBa|*3wyi!4Pj!E>`W#_NQ0T9(w%EOy zqt?FIXGieDZUH-aB4}Ax<&oINLz1KzKQd^xiih@Ej&K7Q8v2jh;JFJJY+CJ5Hjf8? zB&ZhPk8~Z!I1in-6BjSo8R|cTr%amhw2DGGo%_sI5WY7FHKZ7!I^h^y62`zseaMHJ z@;X8{53GcDmkVjzEH_z411B>OZqJ?Rvql8+EjCDf92af9J!aQurH}zL{!>i2_*fD4 zDnG<;AsGS{<9ZwSo)jM3182_@CmbUbyMP9ix3)EDJ;W6_;C}j#@0G*&fc>N=Z@li#Bt=*rXA)OXlDxVdgkO?96^4-vliNVng2LB z(>XY39h37`7%A8knuW&`Yu1l9NqZAUi1IR?@`SD8p|MNMb*Ubm3?hsX%6`S#3`}1w z7#~30oBflxjdR4)`D|oPKU{#cM5Fa)WN*0VO+DvG3&F1$> z;ep?2PYqsoI-af=o6#j6cf6(Zb9LOi(Z*INnS+SNOFSzfJ-!!4qO%UIMV2; z!xYzm`2XxSqekl ztcNISg11(sBZ9(~jdpmbVkl?dAKImm2{o)MTdF(oM}Uch+7$C*ylKNM<;&jgp;YfJZSeR;vImbx(}*4h~q?VrTcyN%64$t$$m6V`k`pwC1jPmO zKzQI>HPPaq{g;%3v@Kv27Nkl$1vZyF4jFb_c&a!qW#9|RXi4?PBR*{wUP70kg?GN)VN{~FEJo59C@{GYSd(wW=|7+H^4m;C> zanTm>B)?}@FY`Q?Z~kDPwV@!zp#1A2?RK025%jU}h4deCCeVUP7lSd5DGNBHT)twD zzq(~})@G#>7m$r3{y+jZRO!*oI-F)**<2c>jv#GO0qUEO5pgk_4qF~ zdhPdk%s#Nc+?caXPKOpaMV!V#B%#>i(ZZz$@n5qi>mPiQDG+vV?5h3q?>@EPes;~~ zIrY26gX&kaC`kjafeU@5CdSaIX_^xx7p+isF4JrS@13=yKmRFCF3ejvamizxaQaHl8z!_x}+eY%=Zv&j*tA+22 zjPJ7cRLl49qW{dk`0|GRc{F3C{$JSNe*C^29cs7K49+rt;xzH~QJdl<_W$>Xe&(U9 z{pMJ`_0&h6`Rdxxts1WYr#SH?LP;*&x@8leePz>&@ZQje)^PNswaO6y89m50QrKeL zWqTD}5$KiAnn=|H%suo$*emP47?wFWD9JILix+juQMcktV@0cxVyJ5gl%63d<0T8x zZX~e4zstx%*KS_1PV%24>?NyEC{L4kQr_3d#qz}0yb&5kUC{%)85%7e*89m{*+=Yw znl{q5)O*DG2QtKBi0Cr z4OtxZ+B>X)y=yA)BL;@BJ}^h58nI}6V1s{^vA^qFwxi30+3Xt(VLD65ikb&Bt}7iu zO~_QjmH8ydU(_G-Hot}|GEgw|7~E=NNX|SGdBF&P z2YmkWH-w_>w#=yy2!kj-6@t)0Es}}0p*hdo5-yd20U*hHkP&*%THh!CWWQ;hv%dK@ ztL0f^{q4xTIACZk+Ii+x)Vb{K>C-SL?QNq@8z5B#`K!R(s$PtY1JoDRYUHT>phOgr z5L$s#xH3&bJUqlp7Ps{U^cRnjy;Dc+XTKh>+JQl9=hU}7zGUM!uGpQ~DZBNT5sV!} zA>?cqA&(O9Vkk&V;Flxd2)r{0FtvUAYj^2lf?zU|;GzwMCbat29=sayK18`$CVWM0 z3-Ncc5^gea<~g!eKv?9R+8g! ztw+z3&oSVDxZX&^+)0E_7{yt-L< z5OxjE=6V#hOLNUOx=1X$1{9j--m|lKU>{*UZI)4>2_c3fqD{A_EKQgfS=iH9KaDtc z8>@I(^KlUiXNNp`@rYRn09odaBOCCnI!IF zO#(v!9u#>zZq{&1m}N&$Cd`IBguC#JW;<+a1&jlPaOpsyE=j+H*KrADbO}MBNG#{I z1-y${AaS0w6#2T9uZ)s#3$I*4WpqeDCbUTd4~jf}x()?gC&!kKATVM$;aJ`_o*7ao zZ4=@~3t$5=|LO@zQiqpX23i$EdXY`k#3o3SnMqS!@+TCyQX1L;1f!NQ8y?tSzD_uaWme=TYlFRj? z!7#Fn)Ak^J!V&Otc)@%+8BmKydK-$=R%A(h+)zM+RSysTB<#l;G3?eJPuVtJxJ^BT zM>&sD`rIiyf}W!#w3&C5xGm*1g#ATA$M7&yJS^vkSv^VkklvPb*qBIg(k?Cfr;qe4 zo04X{fjhc*h+^FY$NBJzXeOiyb$7H8Ymah@D40d79=MYt=6Lt#IXi~(wk_0; zM=-c7bdFfZ{RLYh)_*F`c-CfCqY=SQN)o*!tY{vQz@q-FtwmVD$dk*h67PE!{?D*c zVv|&Zu*#9qQ-o-0A#_5y2}QY%;elVkP2)*e@}G}8m&(>0AYqSl0(eE@wLW~zF1~-- zu-BkTCVa`g30s_-v>Lob>f4W7|JjS2SU5*mp@elPjWw}p!2p1QJe|Y4hp;a<*<>%_ zVKlkCWevGGbn8>_Ql9*HM4!1}XO+J@X`LZIMZmMoHQSaZ9M2jX!s~>BSX}49r7PQZ zL>q7kY7BclWV9Xnj=xX-z6|Fs!=+&cAS{>D9cm;MkF2< zf%n7)G0#_Q{3^#ydHC@prwKNC8PC1Lc+JmP?FgPk)10~)o41wTZjK|<9~cjF9HU<5 zA)?#xb!$&Mr-;}rve}ejN*+WtvTjxSE$+4$GAMhquF6=|+^tLFN6*txY|!pzV%IB9 zb&(KKlZ5o_b`L@3SH2#LZeu1IN{GGmzKt z)Prvr&zZ(n>cuz%Kcq-sWLLOEtoWSb5zvkVwB!lrvdII3^Mnu5_-`UaP7{j6te%X_ zW+~c4GE~`IvS_03n71{K9j|Yak2OY~LQ?cA&T1ATcRg!OEt~rkbF468^o6>3GA-*B zp{NLSnnQUl@3LAp)fqgmLU0KZ3)u+Wh%Lg{rhF<08y|VCm601ZMy}gK=KZ@37?+NH zU_arc)dii7z<98|DS9;KE1abHhB+WbNTbrmV@`(5*p=J0mg^p}Uw(Yle)+R5)**}z z^hv0jQvmCDZ_Q!gU1v;hqg;ak1{8dYA-I81S1nE8!|{IY(gTg)vPGz`W#Z@tg$#Je zBY2yT4SD9XGI?t;7B_M-OK~bw@If^9s%eZp+O^5Uix-iHa@1Euu~%$9YiBxvz1lyjow{l;FqBXrEn!Sw;{n;?(R7MaRHu&HPu`<#(B6dNI&6BCK1@V9owaV; zI<WBH8rIBOo(a-OoaQ?6BS{FNAXBNeQu65#dY(0Heuh&z7~^v& z5~VT&E)OyF9^HClCs2G1pd$5#lU zva*U?`}nG@@xb^y<7+ljLLS~~vwMj)Yhzt0GN(&cYGTYbp(vC=APg3jU%BFbi@(S3 zJD%c|{)l=-YX=Hc4N)nA@qk-mJzFCz(3TY8WX{NwT_-bH%cMjLN>B;V)GhDm;ySoa zDy$PYvFR_svwBE-UA@{#dr^3aM)hln`DYEo`3Bf*FiwI89_dpU9x`B`1P2+;w|GvD z;z~F2%!>vvmU390q#`}gtq=5FkOj6euuk8$*#{$bJKtt=hX(BDCr{c(1Dxt2Jm5CU z&$Zcgt%$^*hJWigxhbWtv>Ymjrbvz`u)eO&Bio@|Of@tz7s6{<sANISi@cO=f%f9G4WyAFCk;BX<(3=n1s6Z{%P`B{Hkhz46 zef!!CyEihyY0Gmq{5Lk)sqhyN#T$8;{E1)v#{SL!`XB7X z;V#SIz`$~_<`w(Y@VNOH;@^lZOTIzUq`du46WcIuN z^n3fi33GDoi)(g>5Rw;9(w+{&b0K3sx_Q~Id~wO{E%7Xjv;W3^{`ddZ{_$U*wiATy zDe}CBX-ryOups5xGbP!ra(hoBr|(lhsk56IDW$(Eq zrvpMIZlc&u!aMkZK`cfKPVX)~ykYl8Hf=n2&OUtaZ|xuc{v*416mRs!QCk=++aLea z@9clOHf`5GeQ3R{efCiwW#CLC@9JPRfsuq)*jJ{?@ahWB!MSVKuidkJ?R)m#U;orD zaH>;bU()bfo;gr+$1;X^DWb*bMdr&VwYh*hnfX+4*Rdwnvj1P#-i+}TB?8o z*^T!S&l6%lyp8i*38$W!*)hV@a3Y$yruQhP(NCPR)5nfkokEhK@K3TnNFI?4qJ4KU zN9dKsP1?9cSwxXfpRmsNGuDATq_w^Qc}Ssu#Dbch!v$U9;jH${$m_WkWCh~JZwO!d zJQ$HN=+`laNIuCjxHZ3P*CT$|;u&6xgx%XDK4y;C*#$8;{hOkVS>)FS_KSLsgZ2&K z)Cvw`Tg(Nki)G}3B^$kT-R|8PvFV02OW(SSYy#ib6|Ie8ijpPZ+ZJNgXSD!{a^#^B z{Ia;r+KG&ylLG1Vur;$!{g8Ib6TPuYMo=5We5w7fCNS30?PX|29$Mp>1B&ObHKLaJ zs{v=QdScsWnL|`pIC02&qvw6C0R~GRmri*Q!UbO3K>pfhJf&DOBwI9rjZU12?O*_2 z@Dt&T8ro0UsZQpm4==L6Qpgl$yRlxo``=gWfB%1H?6(gH+1rVp=%e1Cvq{1~5DFiu zz896ol-4gtz!7+p5kPEvRTs02CYs7ym?)A=HeH0__!v*plY}GSsO<(5-QqmQjb@2c zJ;eh#iL*AtLz~v-9|wi>Eq3snMzah3NgMe8*?aHrxU%cccUM9o=bQtP6T#4IlHKf} zRu zVUFXVk{yFR5cHtVH3VsA2mo<>|zn6TPP)N z?b6Ljw>!mgwL?+ISTYwLFg9AKHVW#BEh|=S8BvR@M|hquEeOByDw|P0j*lX^NK4>} zmoZQWA8r{Ap*-V0@iHr{uCc@d=WVXj7mv(O3hSCXPZSN_dASX}6fOjX3STw$KAlF9 zlg=XhfZ~ENHu@+I-2u|N5k}i34bOe_-#W+FrZyv%~$kUdf9MN4a`YT>M6?@E} z+=bxT&Sj(b`thZezFMDrAIU2*EMFE^R=$BM(4NBIMW$#C@@zb^$KCwqTc{YQCJ-ZN&@)DGF z(hVzc8dSnPUVwq=3QTFDaWDnnY^-if-Mjjm6h;|4noqwyt9VDn`gkkBTn~pTpvK9k zU@RH!?%d07GJ>jWp}}diTzL230&+@%3|L+B_Ya!k=8qa91f9N|LrlNR=$E1JjK$0rHt@gLI9GG$8~Vz zV|bT@k8RU`V*8-NUp&Q82)ZUW2ZgqPz9c=dtQ5!XHG*6?BEu**QvRGVcKHCFl5*7! z{nV<~+R!?~Nf|;W@iSkacZcK)4h`l&GEF-uqFV{#xv`J{(VNfkL6rJXWi`RIX3JmM zHh%k21Avgd^o>wb=v|NJFiXiwVXC@zWAWfzfWuLWFG`~yrL=^=QBI*g?>&XaM2Jb3x=vf1(tr7vbM83SN-!w%p~_or*&*Dbat5LOi|PU*DrXYk-^`XANdtz56knp>DX zmc=-pgLYe9e1$XYshwj4Z${v(hnlN==&lXixo^EK_12V6k>xPdTNDdkf=_kii-%BB ztwULqvE>blL7oO|W_Hy6|G$(B#;BucYkl7>8~o%$>*}nt668<}1m5iM6MM0|X~PtQ zU072_$iBtqC+vs+^~63StHV!CgY0^!d)ma&a-cQy|#!WYkNeHotds_Qsp-=W|s#q*FgNJe*0 z-O;&1Bw&SJgzr6bx?%B+Q8I0)zi>k40vSym6tujC;8eB+@p zb=OjPmDY0Oj=l5Xee3URu&OY+2XaGB7(d2tM#V5^hi&xX6PwvOvZJzEP*tsba(t3M;{24(WNcfvbb``d@R%!dI6P_|A|V9U~~dF_C4zi9Dr{^DMO%4shbvS?^7F zdLIl~PX_^AWVsI`UUv)-U`bQsVv#=j;^DYOc4JmtOF)o-T2W1n)q!qrMb}cHXMNrk z8e>%Ad(?{|vu1wl&=#T~EpZG6H)rg00~#m-u&H|H!tD?24ne^|HtKTZgaBxY2MDDn zBv?SkHWWI~9zL{})C5^RNjd5&U!d4pu65fx@7=Khf}WK{e4cX@xWZ>b2Gjus%ExT( z$+(?P?%Blr4w;DbXH`2jX|CG`H#)4Rq0|Kf(|DJBJYx*Hx$Vg@8ylIhC(07rrBJD! z2cSf-ti!qouiMA(lf~6i?&PwMfK=jQ69nwEefF!@6y%-+96&Y^d(XaoVOd2J_S2Uk z`wao8(=(iGt=;zEJ2&mdAhki5+IWFhNdU1sUP z7Wd`Q^jT$NtF_<0Zvz7aZlO;oCmYWNSx~Tp)Zy7*n6MWha9_TfuvPT1gFLbc%6hE3 z|Au|zy-u8J1lbfABPg7J(ramP+Md50x3Q^3JHSbvRf@jR)L}IQ-iuBaY=3RlmX5M5 zP}6TickkKlp$@o=acH1(xj+lgD#sB1N9G79*`0kmc{*$n9MpS(TJyEvCo`(qiW&F- zK#((#w*e06`XW>4G+*mz973PrJsI*VgzXD3A zSiB$f@B#h&0vl$My|9Xa?|Xfv)=|lxtlAPdpM*pWLLYFry-AAxsBPn{&ueNWIF@6l zwfnmyK(CdSu%haLg;3!uNZp;1cB&W$Wc)q&WzaSUqKl%GDlm_EWe`Os(S8P&(LkV z(^G40LqSqoOz@0s)t~(;ZIhb>b*KyD^l(NB7>w?qk>+U$*p;=}z+KwY z7a)5Ly2#YAJ^R^n_O=}W9j8ujbt3Zj8jW}N~B0(Z}E*UbTVaV z;ZRG;!G~^?04bY~Z8QYho`bRYmN`cc)*x*$lUK5_zzJ`!pi{WP5@W;~h!f>onivlew4 zHe6YIy|v${v+C89Ekvlb#g_m>P9fu&C5P0{juHn&O;j=$7aKOQ6|olwr{?d@wYz=g zHq=b8H;a2Q=aO+KC_rm3&(GTh_K%+$V&{v{Aw3zjh=P$7^z{wuGu^(2%p_YGDx(|( zfwH?4(GyNS3MJs`*b{q37RFQRMQ!XcZ%fLoedwMIz5Boh+Um$kC0L>00mW8NmtWiR z@M9ZZ-msU_g;qRW=wg1-e)!)`>{kG`{H($3`d(}3r|&vit-n$fCs-x`0#fJ%hf8Dj zlzx7`KpixIDUDhSMFY#B6qhMd8%mg5C$UH!AjFYjvIrY?D zz8tm36C3EpM>yZ}tz`gR`0ht`y{pZd3q4R;Tzis0lv@kXp&l3?rwwtd2oN;dS+!C2 zz_lp##_GH5Hcsyc*W0YM8lMjLQw<-{YUS5Je|oprA=PuCR?5Q`&0=E;P#2_xx*(;b z9=Pmr1y5YmOrxUp^7eS!18;laPpt=#zW@3|3i;Ouf`Z@uLLXu*o)du;C@sKdoL}8! z*moQ#90<&_eGF5aC|m0rR$I4i8=JefzY7u<;kLUnXE8qrXB5^dxUiLim?Om)B{8~% zKLfs*(_ELhglyhS0W7^JGH`!4)9lEi`HnhiXD7BQyjd#uID; zafEUL;i%0=(pldL@Zu1~@dnZ*Pzn?l2XzXRn;g&X18jP!1Y3EW$S1pIks|7x zlI4_hZN@OrWnDB_5ptm&NN0>gsS-JbW1HuZgM%GjAMzYxj8_PxRT<7zKMHF;&skIh zj~E6_J4Vexa>33HmThf!-e#2Ah%#9K?MrSFY*6cgFh&GUgk=og1)M(HMAVOQGF+fw zt2kqtwnuSZrkM{uAx_=i#CYjBK|uvjcIKmh4@tD&n{$p1z3*c!B$-p^pp(SMr_M`}Jt5A$SQO_4*S#{tc?hShWzotI zib$G8#nR%Ev>)`mjEW4eGchs5)So12;R23RygT5&5vQW zgrjeJe%;n4LBIH!A8^W7HiJyZQ0pPpF*k>PMKh^H$Fzq(ewq z7i3b%(I=FoQctz6g*2rOD=0pOhBXjnZ85DqbSlpRHq|*9yh+6~Grs!L9fTm(@uq)d zAo2&L7HUYc$xz5H#7oHY$KX&080iibx=Q(QD8PxB&pA1gL0s`7L(mX;pdf{m)J+i3 ziNgp;n0*i)RUn(8&H`C}KsE-EG=e7-UIvwtt2T09eMt@qF{|TEyWDU85x=Py)lRk4 zHQogx!c2e=lVqQuz{yuHNTFrU&(07KSh3y6f(6d0LjiRZv&D)#ad6@s$7%(2v`q%f zg3WKN+a8XP6S9Xy?-0eHU0ufshXEQ+vChjuAqn}(IM8z-sySEOHUD zqwGcs&f*v)0OHR<4zqS#(MvhK;aNRhdk#YFsr`B!&gbs;EK}QLWp&U^VGPN+rGHFy z@1UDCWwm(uOc^o31QujHt(9H|(viw%M!TicchERw+mN(_US zotr|$aJu50(@b*C9`@mwiho5`Ewa2u9fdV&4J_M4u*SCf2cQ8VZ5>YA5bYFVOo#eP z=X+~iFaC++O@Dqpf3@xc%m+Ut5StXXelZNKRDO;vFDybWv4lVyw-eH*Q`uz5fx7N* zAgj$~I&lxlb@aG%(4Om&6`RL6&t09c#gzr~R}G>U3|jte0wd6RA)=gfMLJD_x-7f1 zFKl9D+MetOKodmck3g}}ee}*zvM$yNPHkm% z%cka`Rr5svQb2ivvnWj9uDK9uzn~n{F*3%sY;kO*dyA5u&mSune>Nms=^#30CIA6)U=ioKK!NU{s!!3t2_>_ggv z`F}N@Z-(oi7*3})PvP#)|d%h~8`2jIxQ zuN>qi*{c;GosuKoRgmM~a}}5ka|yIo20CW?g=V z-9mRH!G-;cK48!Fr6>fwK5j3VAM@K;Hb5TWcU*xASr0o)=jvjI)}WB%L*Kyl+xa ze%!{tdT39-dS%ZR2&6(|mLN-QSHPkq6k16rwr+LXAQX26QUbJA2zJE@er`-Y=DaWM zi)VB8dTAd!C29q`tk=CH=xk(7{Dviv?@eVYkc)o3!uoyu8~ftbiapx`z`(q%;%}P- zK!nuw9fFjc<+_{HzE~tn4vL$Wo*HC54r=s{0Cqr$zW@W7VjuSk9HXaDl=K{3U~1;n zCRWIpdavI4->I?YRuKH`eQEX{WkLnZx^YbR!Uau+BFN+XG{KLN5qtV@gMP#=W9~XJ z&b7T|qHzJ%Lm(_qj%sA$ZPspSLB@8Mp|k<5y`mtfP|NN_Iz@+Gb6lZz@fbUKvNSbn zFULx4kL=Yf#yx;776zT1F9fY<962YAZI%ocqZ^f4E9Ql4TxD6s=~LB{39@g8uoFvZ zPf5vvyAFbY6~h;qrx&1gSN5R6ix*lmQAVTs)T^Nt9$I+#^o|0T)z5{$AYD<vO9A&a+mAr+ zN%7CUbUxP(SYbOff@B@Y=I~*AMUPf&@fGv-H;?VfB=v@NpgP5F$XO5Del!ENCkMSU zY3~v|sx1`^h?V+QBV;#v^KB5hfGWc?axkvAZHc>xSDf}vQD+Q$>4e1> zL_dq|f-2r8JD6a4h`?AIf-#qCl{ErtQ$S5X1N!NhtiQG81>4$!+d497frW0%uDfnG zhWe~{h`>l9&q{_snC^yLUa<|8}9j*iBetARqubpYUC zb7q%T;dj9|k)=!z^h{*ct6_8+zzn-*=sM^T()q)?WWLgGj(R0b<}vfEjC;wROCh)R zww7#>pu-{oJb`7HJ(k&9C-|BHu7~c2o#a1*wzC2IkoBYNYFD^ZmI%SaGx|2Ny2O4< zovpP=3oUg(Q*<3WZ@>y}pd;uxWoFWUns0t+I1?uki{SWw@%bbB>J@dzw%E4-$Pvf1 zy>sY2sR4C{q3i2~mI<(#vQPa00At&ewlq3pUyM_Gjy2hUy!Vr#JHNCIc!bd#+eBw! zE)+qPL*mdjQMf-*`BMgUy1CPEItR9I>Eh7eLs|!ugz2(_sA|MZ`TU z&CQQ|t*Yy7J%fGBc-TlA5gie$3uV3%6mr)~hYLE`6g*xVA7Z>bDSzUKk@zX|DQMQt&u!qV#Vu z>2o0p&IF1u@1b;FkS=__zl`!h!NqHR zaBw$KR1)-POQC&|Uv8a^Gn_}!%LR&aVuYN!^FRcUN`Jn$#Ch#j(>_2ob5JQchoH%p ziDs|b#N-NyzBLpg($#2RCY#jXymHXO1O;%4oSvp}AZgQ;QKj+XVbn?L3#IxpH`E7i zgHu=O6K2Y6qX*L7FZUFaD1rAu*+&eJRR)6G!#zW%1!P51Nt z@(lMDN)!gDG8}wR{uE!kZP$ydtsLZQ%^U?!F_4$xrrd+d=N#vH91iXa(C6#3t2q1U zM+)J#G?n2z(VV6|`qJymyYl0A4!y55bk{yQ)+urPW(4c%lCEf-qdn zjltFDdjZ?j5ud;sGS@^mq6xE_DQE5;24nK zP7bomY52R-f%iR^IrC0V$M}xTV#GdTt{p*JG(ega0&OoJgHApM-F}2lS};%DJb4uj9wYx}d zhfVgw9cUVkZI0C8?z3)!P^=bN^=|d3xBivKWnXKn4A3|0P_^x?;6wzeefN_=`|h0) z+nsq~GZY^mc{I(O1L6J+5N~ikDa$??qmOYE)wW)@_r6(b?JX|}0F2^@R9zD&39{Pl zRu`)qUBm5P5^D^GsI+3xuN;HW+us05SPpcH+?1*Q2&ZTI23KPEM%i5_RY^8R#x>!2ZKe ze_~&}ShPJK^?JVbf!%Ecni5;Ft?Ab|Mt*J2{wL0coq&DoyIpp(6)x}$e9#0M4iC}i zD^$aVKu=i$y&s49Hsjs`60xbpTJ~S#q&UWbxNEO)bk&ftSwmn~+ieDl6K`iEu!a+5 z=WxxQfViE)F;T<5ejh|?E9pgk7I7LhbQoQ{yf|ue{w$X|E2U<3p;GHtp*sqdg z%^b~8Yi0_)0eN)ZXahb{=Ya-tOAhU`o_uh!hHqL@F?76R9GBFNwnQn850I0&6$GL5 zAt`@!w7S}H?{Y#C8imu>WCXpQ#z9?c)_lh*>c~=HA0WJrbL!15j$qUJW-M^~T6mm_}rj35x812jC(=WYJWpWCOzmFpxRPO6$j)lCT5=g(%((jSl!uE?UB+-}6U`fnYKhjx^7AQ$-p(i4tG6+u+yu*-5} zkJF){`|ZOmugiA>IFEzy|DPNzQa6Y?QuEIo&5s{Ch3u+sYwo*=+;6uVEo4X_BcmY4 zRs2zOM;?t4I~o^sx)*kWc+eA2Tbz+?a6+IYo&`rSg~oH4D}FLDlIX7&1Om=**6yy) z*w`08vJr|D&yUU9;r=PS(v4)wJh1EUfTXUkusT3Ge)hT~G#$G*Qdf{gtH)dBpZLlS z#xLwKj`8RLfrorDm|AaH=iobbufLIVp()W8L6F)$ zURhA=ER8Iak;z<1VYA)fo@6`Z!Y}Rwy!u`p#siA4KMg46YzDmN*79@OX(3aSw)sh z7Fhq?N-{dhf_gG+o9GFV`6WAS>;nX4WC+j?%x}#skAej77+KFfACuwAT3Ov)Vy~w7 zDp_zvfEc=Z`=F~tu5(UF12x0YpNa@{@GJMl=FYCP*4{hz5rNTz#b;zp5nvC+x^AzBKewNM_PLGB0z%2{wYHDY&uZZ@Pf;9`I$fLO z4evugy0Uv=t)S)(hu(u-x;HUxYjXrVo}eFrxOo>^ z*Ke{&8^Xn8NbrnzE6iVmWBK_Q*;6xi944p%9a1d__@-ALBC3w zBbemRDzk=;TlRo`cX#2roo!5zVTgUaUrlmGyPcpT$Nmge~=J2zB=Zchd%+~|Jk(pO3=Eq{Bw?SZ#F@Tb!Q@>2Ypjw=VUP>-Sn$bdeG z!(q08bL-U<#`*S{`Ej;pDdLTSs)CFDU@qtYeSyU0s7usYWe!4cX%A$wvZaZT!)Yg! zniR{FlvDV{^KlR~!v$AII$I7K4f->iGRBV_RVmOEAhHrTE5qcy6jAgfh(RUU<=Tjc zJk1F%0?US@jVBF)*E=xcxQFMcl63SodRGY>6kY}=XMhu3(K4aW+<|h$YX#JW>J=xW zkm+(z{ozCJfBmTUS=s+s4ig2yT=l5Q1l*qjy0TZS5Rb*##+ceu@C1*5^_q7Tne40Yb#0)>wDj;!PYu-iqxsX z63|Veu<%nLm9)~;g$-LEeOf3Er9*l=vh)pOpGG;&oS)D+P(OgEesl25X;SKuC<%y25l^77B(uvwJvCdqs!l7nnK6mQ>0}(xL6m8qIC4>xVqCun?hx^E z`aur{K+BglUvtQhLX^=OG9k9%h1@5)eMWoEk5)afG96rfB3xH+~k@=BD5Jfh4Qksk!DdZqu zt{@IZuE_W_{T;8rTUy?e2!ZSh+%UKGw&t>eOLAhVHGUydFaX3~353;3nnTtBD!Z_J z-D)=vYzyS^Df2Fl!{lUb%qC}+p|$A&$Vj?Fa zeZ{?^C|EAjh4Xc9@k;waVff$-Rb}>+bAmG-oG;~9O0$smYK)3n3Hj za}Z!Y5Mf~qWIw^1tSXA(LK)SS9k=VCGQ-ejokgN>y*J_5{DuwmHj@?8=+M;aSDXTAxI_GmOX;;CyZPW_`@s-0>HLX}|MJK7*MB=h`aQ^QWZYms#bxVC z9n$h*ZO+zTzOdP~Qrl_yfxY|D$MzTZORcXQ#1tsm`Kb-t*owi2j_had$cO93_p+N5 zSPH<+ta(sX&-}tEoz2>HvPSKC)4h7Z{BZMvJxzu_bI(o*JVeHA5tP+f0Ay1Qsq}D2 z^_PK;XYLX^bB31Wj}E24Yv~7(kueJFt}RFGk)7SWo>24nC{DyMVi1 zxpl2KbrCYs$kxfCfM)CU2ll=D)z%YgwY6tH`Ii&}Q*#yW@f~O#*k>J}fzN9g)kfDp=oWGW`p^N38_E9p@Xzd< z?_IYhkn6L*{-2h0^dox;;`jBdZY!whwDN8;2g~4rjV{{i^oV`=<$_J_7s7A*o_+X( zZ`ylZ1lB`1X$dBbtQ^_+DfAZ@yWSK))=1u{f0;o+GPp`x2CV=65AA~{_{iI<>{aT( zKAk$Yak3Uiq2?J>poCO?7jVuaNZWbK@~&lBYhROfbVJjIjLz%~+s3Py{rJ-{`{C0u zJ4=;7Pf=z)coXwTXRp3i!F>iT$=ca_d1AkwWe>A{D`=;%+x2pLP$!uW^%8q#7W-;g z`x4`Ng<{m4)i8PU{|}6(`{UJkO8#>`d;P)syuEz%#2&xeu-%S#t@ph@vu{7>v-ews z>fN{L(N%jsOz~#GDWbVav+pL)BREHyhdT#qgS@|G;Tlo z;Zyt3@JoB_ud?Rea_eeF&tOey?++A!I<7^5+`63&Dq2SBgXO&raikzMu z8@K7HRe(6(uxtHypbx4e$iO^98E~I>`yA&vJ<1C+C(xVs&}DLPJT-RSMDE_R8+D+C zk9G)bLL-v~#aPUGJSU(!{=z1|f)->A-I@Y@_dfi@{>!)8teGI>^y6Pz`mg>w^Xi3- zjLUP7R{m2Qn@?S! zV*~!+DiFBksBJ7cPZuY{H+_EYXn7*z1i%tF0$ZWIA?Q>?woCyI$r$rJNngp)tU{9+ z_NF9blL2hwk3+df5FzS#V#_C`ViOyB~^vov6d6#7&WF6j#acf`YvPU7@w zEhJ8nmf_YEKQ$f!=1Ktt#fx#&AMG6C$X%ii65PZIoW5DmMl2I(gG$C1@3F21=nrwc zDN|1c5zoms)m+d<6Cx0jhdzEmVZPbXQPvjMiC?pdwl0D~&?5imJk_X+etDEZ$S;#Q4U8m`!zaO0z~x*_us~;d>*Bi746SG z*d>^YT@loNcy7yEAed8k$Zl>YQw!%fx@WkUBCz!bR$Vb>1!J$syo}mspA*E}s^z<5PCzh-cfBKiZW!-q~bW>!wuHZd(Ynce!ulpoY>mSUz`26U)q-drgo(Zo%Cb3 zu$K_fK3asU|M6oAXI|KL=soMd^&R_9|IeV^Y|FCUNwV<%`mb&O3xaf0IrfD4UQ7l` zK}i<&8f&5)CwLfLh`>*nemviZQopL%-u=cmY>=$3Yy#FPbR>nHf?1M1%D!Y>tKs2N z%OgP8*B-Lgt__=qyZ)<9(Cy5{edf{uih(p=O+&?Ul4PFw{A8K2?-f+H*-&!XwwIn+ z;75;ahZ-S8RV{Ys8=u(ielmm!6v#&Mk&&&!x&b%uX#P-GiGl&6F=1V9yDpp`$#Uwwc!>1U|_y4Dx*6`L=!MTlejDQ;t<;BGiXi zv6m6%7=53Ey~1Q?EuaI1imkK(CovhT`PAFE-dkZ!WD6ysD~VM8ojp1Fp?$hMX|G;h zBXhgSZehPSfuJsc(y6c6Z=FN?w!-`!-CDOL_I>}*ed{1lJV=H|r80$OtKfrCO&Vpq zYlRSTAlOxD^&O2?(cEK+ zBet3Vwcq=Ree=(6+xvY*mRyIT?0@`sJNk#uZFwqfPpgx%J+KQ>4kk1HQhFb3AGhcs7@hP?&-` zufyJLX}>%V#BYq0-Gv!@It&^ZhtJ;5k;nI%y=gIca^s{I=N7|JI`EG5fu^g=BO(vS zR~{UC;TZh1Y0}Hr;DMAwz-bPiV^hcxx66{omfD&sK@Rhz9zjO-ZA!w;1 zoU;Wuaj(K4U*GBXTf^^{ZT#(~%E(cGOa^U$G(M8`?37g8Bi50UHPN>)_;|s15aD2c zDaH2)RF0re>Q4}4P_C$0P9UvO;C$T2M;K>1U#K&t8h7D*&O>`8cykCn42BZpnMA3S z+)%psRUcj{TDt8YJoJY@@W-pSum1GU_QmCe-8ouMd>EzxSGY!oksKG^`3e}4nvBCg zjuL!Cn`1ae$P=#v&{$UU@%~cp_%p;kIK5*t@4wP$soCb;~E}(xbc(7lcxGHs~y?2@F|7? zT)f99?!vK#furTfpvaWj*f{_NRcigt11zoa4!xOhQynL{0OiX!(;&E z1YFMr z#SO?!oRpxpR7f$50qUr#_^U@1#DpUKJq*I9wmDKRsmav` z#?dexIk3X@Gb_VMR)Wz}I6SfxP7U~x;TZ7>jCpe8YF*MEcU&$a z`bs*F%PP8j-wT>K&EfL1m%Ym=dZi$55+_C-&ci$J!x4I~nS$lC!J4h2>m6&FB)GSD zf!JE1pkyn0PBnWLZPA!8-vSh~QXwlJ!QfOC#o$V4;|5s++Bay6H|H*Itvl+5%>N`v zxkS@|mG?d%_|t5y1d4NUF1K}c*thOATISiV<945UzHPTEaxGmVil#|BTBAaj^x3_RYj%%$ zkDYA6hFa@m9R3+3drm3n z@yay{zvHk-k_CaI>WqCL8$BWfokkb|>cjaaqSxa63(L!}R*J}yEP?`}STmGhBehZ7 z6jvANg$@Ztz2-|<2#A-d*YY{KmX<2l59hf&(0^bLgw*|GItagX=cb zMDU091PQ7)wIde_(cjoDiz}eZ17UZu1^vYGnw=gNLv__+x4U}mUR#MZ78B&lZMNXe z_pNg)3jh3sZAQl_Qa)h&XJu9jl?2f;=-NP?Ly=chMG(QaMXdmU5j3lUg6H*(byj=Y z3{UofC6{q};GDl`Ddow5No##Fp*5G1dwX^^`qc69AEfIo&~S&0JP_5a3q~Kx6MBpN zISe&iAvQqS>V<_S*X?xu8HJ!rD7XgyGftV<0SH@Au)CwjP~IVn?{vUt#3LY)iEmkS2`9^wpV*7pZCf)?(Kv8FXfCief+M0|k^|QT@Lj*7Pp2rZe6(p# zR<~^!-rS8Z3mP1Md$_G2M5Lk%B)+unKi9lOD)X?h-#R|LXWiGYSs8LY2w0@Lxx?;tR#L2Y z!$z=6rWOvNa!FcuA;n3Trfqd*86?dQMxnY% z83{X=a}&J*wB3#6?{r&JZ#_Xs} ze&^(J6Z@b2rYksr5MAuh{PeZAKDKVp5|}bfmGkCCfZESth9&MrnHs;%{{%X5^4MZ{A;wo;av~p6kj*u+xM$;2*fBZK#@zuqe-B-R znp9!>xd<-#8=Xz?;E&rQvX2)QcWtiz#Cj>>Sx()kU>lr%2>#cT2;At?y2X6U6Dqw@B*xE0=bV%H`e+N z;y_gfcDBC)yA|4!T=r^!cq%?z00ogU(X!+0mh_JY5YU|^_310wa@;Q)iWd-PcEaA7 z%i8r(G*vNZHQQ`600=XeTRhS5* zubi3&yc`#)vX%qj7ZR6!cleJ@$TQi`}C3Kvf961KYgk-3pr+ z1sRV`c}zb>+Y8Y5wD{ zXIr`$E;$qmq=^KhB6DfJqB!s(^DCg~NMAu|31KLS?=hIiHiAMIWV7}OK`v?E~CyB zkRckLPtk=uQjvC#C}y;}U@IG?6k&iX5u;xPc4D-9e`lS@GH7U&i42B|Xa=qjYrosC z+KI1rt4fw6LUB0gqf2X}_zuuyy-pk8t>38o-r)XCa8b;2QU>09Iiywo}8Ki6g zqM<2*4;4L<&w>h%ZKH(4R~SJ#J1M~MAjK0UC3Z1uk-0hhY875}H~_PX`cdMmFL~nG z2rt&GJaY`EC|uA{HZ1tQ62~}v*Qta~fa1w=ww)Jsz;Q<^TT|_u^D-!rl;^Xhl`UI} z!H+111H6|fr=-UnW9*<5mz7pqT~{wr>UK~7D(J|TMI`wQMRk*i?uqUNauTb?87){8 zj1$HuPNMbgEsFik+rnxoMlfl&Aefb6nV{&~c7)=gaAocQuNJ!B+YH&{F=X?(Z@vNs zs0wnhWI`Ce;+(`;#Bbamw>l`Ltpl95n?%_$U}_3cv~ZT6QCxKF`J&B`s@Rzc+r3&G z;|=9jty6I*p6-Y20>g7{8vb$|O97NmaobBx(xLJ6lnL78#@3r7jz$HYNJWf-1c5{o zAUc|JoHst!NH%LE7y^NHL||iO-6|?cNu;872?$KN!jfl)DD2Brk!SA0(Ut_|u1eko zpjhY@J(m0Ckkfj_@1ANvBUqm*>M9;UQJo~JO=MDyqSE$wfpiL3JI%BZ|Z&T zhkNDTzkJ839_}8$^&x&&fFgurJW0@Gje<6hUl7=6xocglv!P}R?NoW!OhVm#x>U-#v6^?{U@gD_P*Roj>rLqDjg|UIl}sNS|)Ohqnfz z6_hAx?&YE(0!@^TQV4b(&U}j3Y)0U-OH#}TXF~z}gLybI{V3r9kc(&T{8gK;ufbW2 zgNF07e((HsogV{{A;%K5Jz;s@=|dqe^t4`odVNZZ-Fy1`)j#*zoucRA&+c$u?KBQl*{dQ|PRz6h2ZMTosZ%D3wl5(FiZwgI_Nn z;!V50Zt8!?S66dP{fkZDIJOh4nGy=!cHXDhTW1BCImib&NkS#AcvL9`oKggRV;I*_ z_-E6yxa4eR|8g`%^t3}pfJ74|C zHB}oR&N)gg_sK!W`|h94r$>`X0-k>8Z|Z97U7X_Wl~9x6&`sgE4p#N>9OKZO%~>2C z{1f(%V;n>!>?oo`NYt6mG2|YlkUfhZC=+ zW6;{W2AHGp_7i}VKy~O~x2>G@h?m8g=h=StxP9?NCYUkYOA zhTxygBC|_HH(h3h>zd2)%4C_x|*%6#E-LzAS8hr9|4Ubto6ascO$>T4jOSPDTh@j_NbFt3dM$j?FN z4AinOLIZKgKEWQEJ|VL&Q%L(cm*-U7fD>vLOoOM0q_67ZGtrfVF*Suz4(%x z<$+1#&#LMJ1-@ss{slYPA+>-1Iw)OG%OEnN6lhrv==Qu*X22m($hoBDn@Dm#X72JR` zHb61E3wZEz37}-tF3~?8QQUe78p_RRxs`VG*uXt#X&R6R1bJc!>G9a6L$Lss+)frciJjM9U7 z>Sh%E*naW%)Zkd0wC5oLXtcYRfKsW75^90d6AChg6|7~=?aV!~;YSbc@#2YX6;Q}` zpx5r+U{9?>uTud`r4PE9z#hOJl2ur1HJx|u-Y0jVtSYwpoDG|M_6y7W<=@$_pmtiE ztg}&^-?bD~EnyC2Bc}y;2}65RS`EF+U9!8rch7pM`EW>>?gk*wNa>bo{vD` z0li9F8+9*&N7!UraB$;X_tjDV;DDbv&)G-g^jU6sE+vSVcUV1V%Vb(WMTS{TAF92V z^Bvv94}Hfu!Lu1`h{<%FwN*CR^~OA7`Wn7wz(dY2&a<&bX=ef%?}OT=svSy^_xh{_ z8I%_yaK~QZCrhpX8LuD%En%OLgOOJ_kGG(mTsbPRKy$lw6TIo_Mvmd^P9mrM1Ug&V znk_!qL^edWy;{Q-TVbBHQa_?dv=;2+tPK^i2QEZ!GZ*>iKnuJlU5Ey_IpXwx%{B>8 zJ*j(K)-CU;K9V1uA+IpYisSHSqdQ@Oay>q-5A*G+PLJex1{+$oN17TJ8Eikz4Sg7` z&gozY>2K%+UO@A5=VgvNeV46JnYIDsr3yS|5lzfGU~O|xW|o`Zx~23tdDi0x+hheU zvfmMSY#Jg^_6|i@E3GCM{RNKmQ|Qftp)#wi3Rs<-%sh8OeaqGSP@ZJP$qGLJRJKM| z-}b5Fm-hkc3mk6P-UYR(kU@F)SMt!MoGqY-<~mw`GPl8q0j^?xune4fA{~~oPBKSQ ztYsJ2=bX!x%nMJWQrD|30roQQIpgd#$PzuLK7YCPRYytLANxl!kn;rbikj`(9YAVi z?-b?G1}OKEY_>IxjrQ*K7BVr<>~q)%wwDMOKN}9ycjLl7vRWnS@jsk-9x8JvK zJ)k%;PVoZy6WEWqf}1;@WB+n~sLM2HZ;!V<@U{p3sCxiW_wRJDX$Z+`C|~}PdJ5fa zSWc2uEz-n}d3zFt>14Zxs>`I{!ZTQag_Vj@*_}c%Tai^;Wn*81H!T55s-U`rYRPpL zuAtz_!5$PHYZfMD{AiLY?%5Y8h}Wzeh=(v%SUM}kXlps>ghD6U4t9fk{PAQgS;TT88ZH3x(I6vJrIp1kDQ_*{1r z#($imp``ZCzJ6_+r#KBU_Ofz>>P5JE+vx9gth>?gyeFkuhPe0<`Tu)|_jxH(;(3!} z$DUO?m9Np)X64} zNcxQw*%{KMPl~(vJO&QNV)B?xh?Lmmq2IPig&dxNYY)z}wmQ%xa>kr7ZloZ_P~iPU z=lvK!bRJ3!j%Adw1i)AoWqUP4kwl7IwAF)@(Rt8{=)5RYIX)cqeo&2m9NR)(U@o#T z;nGFBic`21pEG~wNl8VFZcW?5*o3`a1}T7|caEdn2XCbi*(n?c)$o+Jv=rD9NZjR( z1xr5WIVg11)c}nQ2GIWEye)#rSd4(?WmnfUm2rwHNTq9x8jSOn0t$^q=Ri;8*$WES zWzucd)${TNLFz2+hHIju3RBey2ej#SuEj=~ERt=+AC=x4@o{1;$L8IF)s=D^G}e9;qd9Ix?gq^#C}&TYX^tj$!}A$+FU z>!i10AT5oIVQ{b}Z*-flxq|a4LbDCBXJ(r7aRRK+573X)7UP_(2xGVg>_iGPPa;_* zLtOpz+lT8j$qAl;&ijM1%qigfJ;<2Iz(L&opARQLP*fR*tmBBqHv%?4hmsDutGlrf z%-Fu|uy#fsQ*?1W!YbvtYfG#dRAISN;?-WlS6KnLe)EeAW($jh3f&@r6N~3tenC0G zIH-~GnRm3wk5VaT2V(6{;?SJO{6$LWnFz4q6wJlB?TmE4T&A9pbdLNJwN(^{6#pfx z-P&_|00POSfr9W+wLu?09h#DH_KYfZ*kyO=rv_I4)t|if>wKk;v##_9_lj|K2H4ek zZguL$GF?E*_$UI)m}Rjpm0M2W#N5Z z&!~e(b7=mp`3)QYV#(Hb2%`3Pfk^AMQfR}1>?1LZHjx#n&%$^hk|5HS$A|67uRph! zui$<^=E~4{l~lpGOdvA8v&cFoWj|Jn{6j|a4C;0DY@B@z!Y>?!I39TZe5KN(5BS)Z zWn`X{=DoY0qVN{|O`kfdCN)))h%Yy+^tTISxM%nN;2hgrTfe>euzt}ASBKUyYd<6z zhb(nYah!3=Ji0fnn4GGk_%8A+}(i-E4b<$9(r!|)8+l;3{jgLvKdsaj|>dyD{{zc zPY_MRRr+;CIuF!DX@M}*SoDqqIQ5@@{<%GWhQkWp@)SY7BJ|g?T%5abEHBON*ueq& zF^J0$*VSq6-~w(f@?5%)0zUeq)_@yZ{i4tCUo3Gpd|1)x9`$W44#WM7Dm4mn0URDjGUrxXDemHN%ac~^tdR>iss5e!Oz z7z`G`wVV%sFKaX{x(tF9-jiy~$&lgxdjJj|FM$*!`>>*~%#$QY37-$tYeL}(FV54Jj z0OJTjXG`zCw8a;n+CThi#D*gjA{~0y-v9plc5|=}PI7L=+PUgz%`b-%2Do!P{oFPu zUQ^Jt*nHKusV&oPwa7n`?b!z;2ly<9_g($Zdkoka{ghxVOPKdHWU3UBG2_Qci;&|p zTJw5F9q8u#J7ex%03FRIs8R}XbUs`qlJiU^3nDY~C`wvTN%8juf;?nw#-TNd0V0Uu zh)wa8127~T)M^gnDu<7pT?&YV^2qKgC?lXT$9jW;D2X18W8CR+&a;VNVmv`5flh~( z5)?(4;F5~b`Pkd?YT%XDe8-6w$59-|xg-iPCu~zt`%&cfgjx&>JMbK*YOJfOkzh-K zH5but+Le^|5t-;{mfR$C56v~a?skBw%QbxYmp4Ct`{Qpqm=nD@EhnD7yzA&Beg5iq z&ymiIlU^5wDzQ4>=mm$|RRAZ5eqK?JIaW31$8 z)bz;8K((o=R`WrF-M&);B08VK zkx+B3Gmn?40R`aU;SWc!*$8UA2lBZT+Zl={KmC-6W7DjR+y3jvwzEr6zvQ+R6DX^v zV09V6Y~0-zWj->T?$D1I9e%-=K_ms9*f9w>VrTGo zKl8j89`Hi;PSIDY&t0&(47;WlPW5@#CH&d(9UQ$l)-%XS4YJdNm=u0}-pLECE3H3% z^Io_`c`5n42D|TCbvj3%N6PRek)uoz=k(SX^4d)%KB;H)E=M0}58)TpDst~#{>^1C z=sowo8o?ia=Wq?XypDEN_9*RBtof^3={`IP*Wd;H6g#94=@!5h_L)ova=IP)qxqw? z&1bwlP$x;Bp-0gNg`gJY)%o$NjSoM!ho8T&5h$oc*;Gu1PbGy{Lq`i_e;?TFVTr}- zu<6KV!hM3Q;Zm*v^ovv8Xa?<(o}-4leM~Y-eZUi_nOBF}uEXhXZ$7Itc}9ZZZ=Un( zZl%RKOEgPKoc73T)?*a2NQ3IxraI z=+N+>6HE!9*EpS!ad3OR#sLq18s~c&s-%o$k-M+@P^+42M0f0BdlHZ(S>VSlU^i}9 zZ#^_><$%iMrC>Q~UbsHtjJLAlu%Ro(&3sd!*t7=C302KE zUfaSGDopQEY-OX>T8c4bHWzGe^fkQK6zE~hO6qyuQc?y92xNnXEhxkBwYLR2j}*UQ z`WYI4NDC2ZoP_7=i#9vGNFXCgq`SZ>aFo^8f`GMJ3aM;Z={Chnb}!F6KXB(&g(wuH z^WfN9!@>%2UO5rnrbh0Qs3hWDYC(b|vE5CJ(63{lb7EDD|HUTUyi+#2K;a;YVeLxE zj2+k!(eKT}W2>i-QC)o-MP6{=`R43&{?s;R$KXxdvi+7KD+xm9v$SRrQnaGl;2GB- zMqWlifHav2*%(jtjn>t=U>EZg8CiL5!~1)1zEO0DB1~1Fh|i%=nH`_9dD?wY*g={j zg^p0vaxjR(i88CG*tCK*ihs?F*yA{S*jp4tsRIE-p}37%3V1AoxW&<(LyCPxBglIS zMkyF@WyEU@Y5i!vdf$ougWxFy4N+Qx!{+Fi>gBWc`UP?MWUKk$Da~%_wgw6tu53(E zY-!S_6_mKZP=p(_I7RW##VM3x&?ws|F}V%a+DNgv8qhItz-Q~;Oj6xe3XYDew#Yf_ z3xocn0BaV=7$4}LBdXZXqxmF&R;EDE^yFg#5|mIy_jCRh#qg9e>1HI~yvG3rjxii1 z1K}JrLs;knO=*1!bccc{(I`eB&Y~zN2pKCSp!q7xR&9~Fx$+c*6PX~#UG+GiF*>)X zIzIz-&mO6|VbZqC8m%0JqWDA6y}7weXElQ7(huI^$@x`lmbFhi@T=p$5ud!;;XStx z13Rm<5?=ETYlQo5d1uzv;A)*?U8Z6<#1E=T#REC8G7bMBv^XHSVi+^6AZJ@^nD=Cr z6#Jk);QYGvbF12&w^f2O^Q_4(x*7h300_=xE%t#pY4PkLys(0{ZkMo=jO`YTR{yFS;0>fpJZJVDl7z=h5ST#(5r z^_PG5UaNC7@a`-+g6n{8OkUssW38%S?EEaembCvIKX1@@12{nVAp&);-=BFE3emc4Y zj6|Wk-H2lhW@Kr)52$jZ76zozB` z)DSJbP1XZCxHZ3W~jOLZ&@ z$6eI%thE%+Avc37v_U)NxMkPk8bUF09rmyb^s@`*qxfFcXYmW<@u}pWXfo7D+D^bb zdBPqv{=|Oylds?zU4>>2&iTG_($#TRdC z(0g(UI>#S>^}11?`}%nEo8}L4;~eU@B<+=aRXvzDj&j|{jREKKnv3#z41M~~PXTd+ z4|AD&={?56wT90pnHve-7hMIDfEksaFh(Mnd0NUtKmkg|Ul6}XsAh73b zbU%yYZ><1cKwvjy8Gdc9>ph+x(aXY=GyvI{n{OS}xnw7v+X_zcIWn-?a{v#J0>6sh zv_b8no}vrAx_~AczVD2Ayh(bRttqn znha3!VAE4>dTB0;R_TnawfS*soS^&qbMMgHbwLYe3zoephfa0MBzqG8_kw_5t-Eb2T9FkzO?sqHV3cuk3N>1a(|QTaPs5w=jHEmLh|1oZtA`{ zkCD1^L~;#xE+15YNAs9Jx$#gtMV$}~qW43Mokg&4`NrLF=LLW!J{B z?cqdBQKfXBYzWwUvQ+t3$qV?3*?HjLu!_IaQ4=K)W06I!Ask#Uf zQ2{(*#@5RI{M6|RYbG#d6d_>}BdkPz9hTT_HdirhQw$biw@&~w(gT6CUnQXxwsu&} znN#33*W!t55 z?=Tb6>$}qN&k0!J1sUL(GVlfWtcd9@Jr|~dgogR(3Ko~bxeSrjl4jJGsz z#8))mgPI0wndm~7(^hwHyDhE?(8kX_)yKERzw2{E?bIHDG4J;X0c~le$_Q!VcprQ( z!kEz-E#Bv7$yjg#b;gO-UI)3PgPfC_KufpL#9$83A*PGd?XAI7CG$~vvfNLyo+g2C z)tD61(>NEk)upbVdC#z(rI@>gD8air+N`$gh;@|XRgRI%CiK^qLrMszY}sz7(ue&< zh6mRH1r8|idrbjW$=~)083KzFS-HQ7QUrj9?abFRR)K};CwK1KL!!+u&J&$`0fFTR zR+?-yC6Hbr6#Odgc#)Diu=Dz@2MoRwowe4?1~rF`cC5C^j$Am2;Ec`2H3DxTbb1OF z^`Zn#Fu@e=oeOh|wgE<8MaM~N?w^;OGrMoV%WPW2& zN+PIRMKE5-CMiX|0MY_~3!JphtQ}n-kL5wTkI?JhwHcdxoCnGzn3P~6F3bbL!DeYQ zj`cJyO>z$l*Wg_R1s`{4rBz)4`!?B3u1YXYIxRN-(z_M}4jpVJ*0GpcLohBTzqkH; zm(WiZ$+$yFptb??PO{0X5VqX;eh!4RU=1jvx~ zV?>WWZhZ*2I|&MzQ*fAk!G&MA3Ty>J?or(6mVgm?fa@_@St&H;SJ>DmaOJATwXUni z`oZli;lRI`yJhvW>saRz(H;!ddn;2mrF0Tf5K(-Az?ti~DArcB+Hp3KCp)kNK%g|6 znYCgp^JC+Et+e&1b+YqV ziCneS&qizzjqyVcS+j${MMO9xFJT$B#AY+Ug@A9kX!SMQDFSSj7O?qc5pS!Tx1-f_ zb`t^k*dwfi=cqdy&;(;{5kLHSlopA~HtRm#!{!rL{%X*tU0?eZ*^LU<_2Ky7+=4)( zsDxrSKaJVeOO}cP%0e5TRZzgOC z{I<=lMyqUF1A0MY6U<>;&xO7C%%#l;Rz_Rko3De7n8zkX2Q+P9C3xFno~?n>I+0hX~m+eScsuqDQ*|` zIM}3YxZUM;p#J0U|6ez2e6#eI9k%eab?A4q%Wak=Cegp}+SMca=;)zC0-J64dz3W` z=@s$@2|MURUJ4W?398RY<08z%=Nd)85s6`~7ZGd(X%G@dC27%%K9z99S0Ehq0#;Z? zV1Ua#{42`gL&03PWc^HRh>8N{BK?J!lcDEhXh`5=u_7z1>9S)l1Eqso_k@Dr5!`om zVF<4;#{0;kjedOD?%=J}S^uJyp>Rs5E{s&wRO_8AH^nbxOAqr!SOvBzo+lV1@|?!2 z+NKxxC9r1hZcaY7#}o=$DXx9*N)W@DjVi>cNQ%QLs{=wr1h$%+2o(!) zA#SY9F=B<<6fVe$ov_JCQ?wDCC8*VYBqbrQ_9~7~Lk-=Nl3Zhfm#pnPgpo=nz2JDT zbf3Y%U9+m%UyV`z0%IDhTK6xcmZmKG3+kxpw*@~=vd@&Ku9Fbh^!}V9)58BZ4_S@?dkw_?%l82*>8QvUOaQyK!kE|CFo!%m)bKaRA*|z z?<)ksov=$!rtIoe$_kHH+qu(C*4+vOq2d_00p~}6n!R(03i@4td1;)vwVmG>AClfV z-p@xj|5P6QLQ06ZtahcWpdOlEt}o$Lf|Sgx1Ls4038&Bi&Mm@TO@gF2^F@Lm^s@+f zcxesbzn7m8-WK7@eTzyqG^G%*L3cyHVZrzjj zsIw4eUKrTQad4?~CH##kz%2Bn0PS=%RdXV%HitLn2S0z)e)9eed%RU^9T#4+SHJd> zz0gu&jkzMWgsVI&!m^G=@Jd9hiXK&;H3ykL%Ejf$ z%UIsxY&Q4!u|0k7x{VHkDBkroJJ;G}ueK9#7a55hy>pkrEq@%bU*1UBRp6mE6#NrI z14mBU>gq-L^0bXRt7_y7&}qZb1fI-4zr$lpLs-$yUAx=Kf-j}*{&uEmr(54?MpW~W zzL2su!FZ1%!w}ZJ_?G%#E!8W6tbhYH=Oy;L3LXLWlROIC{C1t8aS)6(H|Ep^-!G2e z>Z5NIA9QV3*nLy{i#Q%vLJK%uSZig?#NH4tI*&O;m(Sikd+_Ig0tXcM!=ym4QvPO* zbFSJhDT|002cO|>j;R%tR9kaTj00uDwh%t%4uVgMr5WcKx8Uhn!9|qTlvovT7)4k( zH+J{ikwY!kS)EUS2r`0c#R}14clC0Bh9R?L=RF>?d4$Lt2%t8!K}%qL-iixY0~=}% zFuh&v;3#r zvS7fX$s2dYI5-Y{;odWKbK{~LQi|W7uEvJvVyTHk-0NR5i&{i{e zUn|x+jsP-6J)OV+3*RLzh(N;>5s0I@#M&C58$n%1%E5w;DX19>7MoBhfOEjdEh%ra z!<}-+Dze98C|o!Y=3rHvQ&|n&Xv-L$2a9Q20jE9!Oo%o(TI{oB4OVqHZk^zdXTVD? z<}f<5hIW{G%k3{#P-~@C;D%Qb_5IKxtU|z$#Z6TMK84_^xrJbi9DH+1usA0;ovcGP zuw+WI(d9(T!dgzixkJ{E+hcDV-Ue&}!h@;PJo`@PubV;cT^2aG;H{Upc3Tr}y9-#Z zuXEZdML?4Q7cHJ!Y0b@@R&-_#`4Je|gJ76*@K&(cRh0|eKs^?`wTywjv%S`Ps2->s zF9h?$$B#+(R~uJ~)@RL$EHqCPRsorTC4J|jl`Rv12QP#THl%`xNXNj1Wy4+93@pG( zsnr3OgYmFCJSi((Q4Rvd1YBw8=!6#ZJAGZofj6cNPyz57^;n>6qOef(bNV6&fm~4? z%97KI%vYF;ig_MOM^duP9obXVw9$QuUIn`DT zlu$)un;kiG)Q%i!wYog)uV{{VMLee*{JRb~6dP7NF!COtSaIoP#i{gFR;Ba}U@wCI z+K1&TC@gFOC4S@p3N~bQ(;7SoXqF0DSnKelI;xfuAmYAS-C%9-f=mN-(MFjEw&~4y zDXhT5p|ur@oH|QXqf{Yy+4lJ2!9Bc)TqQKs*eOMT*-Af^FnMEO_b6Cv5}fc2+Kvju z;t1JV+ks%}10Na;%_i`|i*#_%hMw`D4RK7o3nfl55HkwA7{P+00LZNB_G&AGFL^FtrG?a#8Tcq*TGRB8tUYg2SK_TGO== z4w&meumbf;|Qc=Maz2OcnSwl z4%#btehiOJ+2|^DDQ~h`=1gM^hYtcl#~3rJDQ8o6=*>Y|oF z%ro!+Ctz@gT^SQF$H^)MO(i7ML0y+b@R{`)n|^xNu0#L(Qy3N09kKp1c(dU4Ucq39 zkRV)h+^{8`1XYrBc?&w_<@3|nQpMD7o~H)CyD`hyqhB3t3uc$%QnAef+dxnemlZH% zlF&W}NVh!pAQEmkfdW!i9blvMX$JnXHacp{W0RKb>HvxjxDFH`NuFJsMG*(2#s&xb z+(P;VMja*4YYsum@^isDfBMwsBKK|jOfloU5n(V0AOsV09yN@W4c2XGS=6P12y!)7 zgEa?&dEoe9&|0-MY^FP4OBsVj<>tx&Mh|n;qt6<8zHQ(7-f{cpDHPhe((^#O04;L= zDR}gw?1`kfmvluG^t2MGw7<}5nr0nX10u|Fu+-eD!N>y`AB}XZ(Bw^^0i@^U?yV0Q zJTQ`TgEn^m6Z_=u7+x5xmxrTvj5VqNXp9nJq)?88g|6@7U_rBoEC4Pho*uUu6tGXG zPY^&oi-8GyVU+Yx-3cM2klsXU7m+ssmb38!Vw1!tXfn!x*dU&p^^DLOtB?yjpEAVE zSe_v$_WU{l(W^jA zh0Orz@aR);zMl+(iT#>&^_{cEI{MW07xRi{I%|2Q&}XtnmIB5$`+y?^gOpY3^*MWl zW$fkgF{{aC-sa)CMWEZ-@>&GCBvPN#$yw&=+RPxl1M_^ENik1f+`4@S`5t0!o&vM4vn%o<|nX+WHd9FJq2~?=jc&uqa)hpRt95(}pZ#(Fu|1T=4-3#;7hrJ9rO=xGe9! z*QJEiSjPZ@SS0s9o3Ok05We?U+2K=d*47GKm-rKcG|@zBo%%y#-qDF%-ESzQCdS z(@D+@+Ffy9W#+Lj&7<#PoGrG-hX^kE82X~{UFGb72~;lpPHU-xt}jktkoECZ`{|`e zc6B1(I$nI){`fm@*egBtRv#x<#@PmKkbs`VtVKn5A7db(a#p}l2BP7~*t#{KAXR*t z0tDKN;6IOJsPqIFm9^qD@v|`KaS)ThHxQeoB7f7K;!QhwA58O_8cVgqFRAmUFy6tG ze>yOSg*iJ<&b!q7qzEr-u@yywt z^O3O8V{7aW=xdp7DN`wU;{;L9;iY&yn^IhA{wZiP&`F8RB%aMcewNnQ{CU7VI5*|t zHkU(yNeTHkF|1g}GCH9^wJxXfcD8K1{}~%`5c5|+7M9>cZuigr7!9q|K|Ee{J{@Ech`>vJtqdC zpQ7w5^Bak;Qe;i6oq3hy!yJ_tflI2v>mK*{hyCk*Jos}!fddNsK~O;Qq2JNv8HO_R zYXKXaI6}b2K0A>Ee994oEimm3gq7=95}|bDIW{gF2=fbId;|t6ECouXn9nj>Vd3&@ zj(iAUR@Qvf`V$Cf`oP&jKqx$71rdp`z~mKT$yQcDU=ISuA@nN3S{x3?f`_n*KozeP zb|5ST$^rpUDe_Esxxcgsfqz(j_+{&_UAJ}uLgwHyTZ2GHtr2t212&`P@M&;}5rPx^ zX>o-^j->k>ZgUan<-*9dXh|;Itlg!>BLT)=*&%RSYwVAjur%WEQ(lXnvZ zUPM^e?KT-J2wm3@_@b+3v6Cwz0V=6;MR|!;vnh8M>GF%}tc`S)q&rG^vW8#XpRNGd z3^10faZyq~McF(S*Y#N61%lo5Vxder*T2eCZjV?KmjbJ!z@ZT~o_)CJZAnQ&y-R>- ziOvk$$TY#Q(0Hd31lW4d@+oVGHs*}H-DQF~SI6nz$>y*UM?94@fFqkpS`I8mQ!ZzW95l9nDjRL)_tcg0RH zK2}vfH24`d25|`p@(Qi297RGk<5>G~4No^Hwns)VX~OTkV;vVK8hbqg)t4GqtY=9F z+7!Y9##dcEmRqtSskW-F^LD1Z$6DuC5K`kA!O1a=1zCb}^EoJ&mV-xLT>+gquWDKa z3wv0SBY^(!gWEK?A2=w0ncvy}qE$5?hK}0o6L=HhZ!x&qwIx}sSn4Qu-MUi=grUOW zX1;A_hG3=uchO@nSP_xvkMWEw(5p~*CD^FPYWuA7LW7m{v%w?~QbiTs8H}A+9*U{< z({`rxkhLAh@*d38B>Y0bPQpm;#cU8utA#VlCKe%*zkF*nz1(cu)wl#Wnf1MAfkf!G zZstf7MO!81$+AM19(5aagi;aOT-u&*{iRq$A6Z5~gC~Zp9#M*E4CG-=R6_q(R5M=~ zx}xXyrA;8ph*AXCCraqIo@HCYvqk()me?^i*gidDs0KdAMlV-~L-Mw~1}knUvU5c! zFi;j0lmiC^_PwT~KO%BKC~C1Ir;Dt<3rijG8GvzIVzP{9<4#AqI`HuC?d52=U3g8E;H_VL{_kI)|ND$ zGs5I_=eb>Fi~h)zv8YPf>_XB8(L{D3w5pTR5bN1Eik`GLfmDaNdgYKH10Q{Y!1&U` zMXdZYR$WVF@DkeKFg!XeudED*bFe58#8o4FOu!45fOJ|$@R&ouvMSbA$39WgMZgg* zY+@ZHz_xA8V2O>uin^+Ku0YmVCkaYU+RFGx_Swf^H;*tUT3)bz6nsSl1XO@H2@!SN zkhP|GWE@M(jm;&yKR#){c(i0A1W-JT)!LbpwN?oa5|oo0gQB_03Wy`T*c8@MQxC8d z|HT8F7|vS3p<~u~w%@_5%1gc5Zq;&QP%I3&x$HO(B56}=SH?jp^`#HbDa z@`^pUe4l{dxd`V8Rw@@{)q)CZFC$FodE!1STzY7A_1$)y^#s`pb7IxTW=HHI0@48> z$C`k9>#1SQHa=9=|p(ME?nnMoktb6o*0)v1AdyE9@weCe3Lpjtb4PV+oaiN;a z8WXoBf*6k3>_r5T?j7mHF>OxAwMSxY{- zVe<{GHr-!`_!Y$}qkR+arw3P_*j+H(*Q<|NQ#V2JU~+MJ@0GM-`gUj{Xt?l4LI=jD+Nn4T zj+be^N?5@c1-(|FPAO2sD>VbW-Urw0?)!IaWoC};MHa(8fq4$i+z@nwn6ZrDD!mL$(b#=rqY%h2)5^L-pg;^ux)7A8 z06iKCrl~A@PvW_tKq$m5e*y2Z%b$)}C427Idh)ClrG=ysTX^Cvk4-y8Z9V~4D^Q&0 z*B-(+WtcH=7sXT3?oGDZ>D6}ju+Rg{=(XujZTcQK!=ucT(k81QW<*sf`(ls}CD4@6 zG!%A;mQv^o^2J+oiWiFh&{t!Peh~fLY(v;QgBRj^;Iv6xB>)?+xr)ejPzLYuOK_pV;`lL3{u4jJ35lS`H9PJ$QIDHnYaN!YDI? z*WU_pjP6~s_ul*1E^R4C8#>9^9KE_7C2sD8QTBfFqPplsT9S z)JAnzndM$3F3jy~HrY{Q%iX~Jkurjn`Qm*PXCK|Op_vj(9%{ozfjtYJFs$0FQ^W~E zSgbuSRHil(I5Q4ZXIEi0koBAAG^d=foONENH<{D~!8n1C!$b0Ex{TNfBEbYX9UeljYv~Bmg!I){2_RKRH~#Va;=cZmS+N8xEz zRsg>(z{-ARcF-<=_@TY^{w=#QL7?HbQ+D$71$zNwmuAi;Sp?B(1cZ)mt~bRyOAsCc z$Aw`-3w&T~V9M?gho+@7i{MQa7kuZW-JKb;D;S`xR3+>rMn?5`7v*l{bN(u{mZq%T zel%mlmq%?BkJWYJ1;H?l4H|GSC?c)_A+*|T>26{{0cDq)gRu;Op<{)#VGso$%F^kY zX4`0NB2GH}1>{<4`mrrMxMI^NS5_D65F}RM`M{YFie?d_Z%*8?<mKzKAHw@SD7X~&WP<@fJ^Z@8JZVoS z2kqWR_wlN2vp&vL+It9+a1_J3Yo9LJc!qP<2_Oi;xzA_4bd^!Y@NPjg;n>3ZlD1it z(}O5~y3hgCvX>V0Mm&Y^S!0p9Yure|t02o#{;QtCfG@%-E|;@FiZjawfvGdvM`>?I z5pgMCQL0P8?gt+4u2Jw9tuNZEQI4P6x))rY0E}7g!5iH^K?TCMjWc*0!F>W>7p`apb-|-vBDbQZrV6Qut!|_*oMXujF}c|OJejxz2o43r3q3!&mL`RkuyXk ziUyrAbWSOv-YET&j7=9aMpIT7`@NBo3H#N@b9Utkp1V9-RKjyUI+Zfb6E`vJ^ zH0FWJ8yHxy;vS3xi334{;OmkKu#O47QFD%oD(iLMPBL)ql)#zuA5Xe=!aw4y6`se? zkF+<6M`BfZv31sFZ1~}bJ-TuagETy}tD3D5#buoJXa;5a^*i%62+U*AX@b{wV5CDe z1kIPL^&lB3jq70mQ)Bb0-eoT9fu>;M2Pekz=$7kFZECt=v`k zuF_oj2we;GV&~Wx-g6mvO|S-GtY( zqMbJQ+F-Jlv6z)sH@O#IxjwJmN~iwRHkEV;*M7ZpT7fx8BkZdssA+90UxT`6FzrxH zx$nC)R@Q*%8UM_N!Ee4cU1jmwWA-u!?(Qz&QrzRvf(^jz#vpEw5*%{`Am6w&*=%^! zD&fRQz*10NZ^gXogLIICYkwWW_OcLDIX8w7`WEZO(`~#&N2P`QK^^#_?`oHfBbibrK_VVA4d^WQQzub!Q=bhstKaE@2BmrqA&A~^rfDd+jsOK25eH5UfaK_ zJsNu`mk>_ZqFf2rFGa4k9K)blE#d&@NKW)FM={k5z zXrwaIC|jZ^>8hzib+f1}dN5^pr}%BU=||s>O0P|ms}AY0QOmDouIa@+E~@|h^jHWh zZ-;S=XGkuV+IZqV=TdJWgvzaehwAm5NBBt?fhBbWN9FarYcDU-6RI@AHt`1zT2k9A_C#2SlBIQ(H@%wft|m#Z%k zVuf{af+@053x6*z*I_hU6BN3r9eU5=-kCy)lf}bfiw(Lq(xRNZPntCMw>XSvbRS-$ zF{?{f*lK+?TIgb0RFy{=dk7e&ZrSClP2khFStSDFVlZ_JN~?k501gUT3e#HY6kths zsnr!I^}q(byE<#1e00?!z?&>p0WrmiA&Vj?A83>s4oTA2s!nkP0kWVReL7&5-un<` z9WM6WxmLG<_2#wr?atFFTjem)($R%QWD$p9io=U%b!Ny$A7QNoBvGWQ#foZCZh?tg zlq4|klY1P_GX(iOiO6yu;LLE-xJgw0&NXrG|G ztIt1S=}xRXM?ST8Za=as>jX|~ZnHzpHP%;yqAiDm`ov4-%Hlb&hIQ)Q z2Lr^qm|(3av`_Ec#w#b~Fq369T85x37r}gtF(k_~S%0n3|05IQc5evFD`?$2hhl+~ zs++#DJkwNW?6_c{q}xK^yGoEZqNF?6B}YhxCKRDH{3bkD6b#v1J~OWUe8u9Gcq8je zvj|wT24pAjc%LCW9k%-ev>TAz&B9{hF(fTFw}C#yf)$I&YA`sWf(3- zZk5{QraUW%_F5et3sog?Ley)wK*-SL=}7Texet zZ+(bNAz~-%6&P|FMa86xc{05P#&11A2eE*tMggQbCWW$KYw~n(hX?t2OB2PvI0SE^ z$kY7<%5W)`BPeTg%7KEYnzV}asLen4xm~-sY-KrJRz%$=ZxWF6M?bN55m*jpTdnI5 z%0ws16F1-$?oF`_kCins<|eFc9jJoGAK2~78K%#EM~7`BHQyzdrP?T{>8)ramO_9ff=i1~s5uB@iPdJZ+(IJB6!cgNm+v&6EK zO$aEl@J9VGI=o;{hqs)ScrWW>c@@^iK!8=ZJ+{vF+crCR-ySeG-x7W|)}d8PcWwNW zU)qhE1LWTbzVK0NZ@^QJm>HP;Bh-hkD9nWUt8KcVE7AzxH{pewDC)dN12dcUtib~r z+9;&3$Hc85vX0<(Y|w5FCv0G&)n09Cu#<=K45v%7)_NR_TPC;2qBc9ls>UWBSytFZ z@YY#tieIz*>6`Xw7Q>B5t(`knXx&E`6E!d`#~9!(zznTCzH0X`zHRTk|CwE1!Jy!* zENjQ;g*%p?_x<*3>r47bbzpvG@WR=`qeqZB5*{fog&L+l)JM%rrAwhC%`GDK zPEVH|emY|JKS3D!;V{nKK;cVyL5ZWHj2Bft*_Hsn}Lyw07Z%LaSO}k zB%T`y)tAb+0Ey!J@TH`zWkq}VZdx7<^r!5Dvg|t|2#qs9G%nn`Z{xu7thV(srr>d` z{WU1WVG&Lksbzqs(oQv;JsbJOP+F|6EZguTLNBaaBP&l39uL|Omdc9r^Z4P4UAj7D z538!7Rf*N1P;6v;A~&|=Ds%BEp2#yZ?CG((X0F^H9I$b$t7DHpv&)yN5U}Bqh!U@c z@l{38(+F^bvqOw?6lgOM#xjN@Z3I9s$s^7S@SOKQ_{gqY9U2z)Uvd@hNYZqAKfZ zYq!akrzkJ+lKAkVT?DkGu(!w>V-t4&=4HD$f@c6;ADu0&Kw6es6Bg9D5tNPX?bgwc zR~44wv-hvqqxUm*qpaIDSpygD6HDnL&|WA)H(Kkg<48U5g6tLY=)=ZFtLsLQH8f#U z*Wa`I@bF8;XKdvVXC&f3P2=Hp<09Tvb9h{1yw=#%g{3+M7%Yhz1Cs-f?BShH@w#oq z(+cn5jvm%}JPPsB+H&i(7Z$o9p~_Y)Kc)8&@!XtxtUcOJqM z3xj(E*o;-y@d)d;l*v^X=``V8e3v!q=0{iX^jNSZr0dn-;%6~#Dnxl$Ny0o7&MDft zh>}xqt|>gYl0Xwp-hF6y#<0Q%2z}z-O?yz1u{(=pw#K+iu~*JR$ykY3HEh9+Ww(ZK zw%XJ@VJ%(5(~hMwXs{paP>SKs;D^U-0sXp)VrvC2(q$C;8#8xo_|B+38J@Mdskn_i zDYRRk$%v3c9~RW|x~if6Wt=Mts_-6eeQX^A*MLPOp4DZ}{j{O4GGY~2k}tC+56zKp ztl65`e;1;JE^Z{q=23!3-h>A}xN0|k8nL#SI@_qn&|&nRU3%-6_T#rdvm0|5PaR`! zBOG_SE_E6&R!DweEHY1u@yySeUtpf!wtIM^UR}q#h_M`3|ot8 zCwm0u!?HZN=57CNVDI zth9w^Scj5=W@VjUhYvgGS}`PEE*1yRMA8amJb*XOjD0dzZ8fbWcDR}Sp~kmza=gor zcl~m39Z=wa0)KcE_^kxvpHGf}allL*KiT)7JDf|a|IFoo+ml9LcuDxQed#x}e$QUd zFYnpszQQj-B_#OVU9`C9-tS)_uYZF_+=iTr2F>s_(3d>|@vvfgFnEMF|1tO>eB^W6 z9X!3A{x?mxU68Bvo_g=Pwf7?n6$jb$%916gIe4N?ULcTG9GBY7bc;1rVRZox>^uUX zM|W@80|X_@F)TRn2q?kIJr7O0?@j+V6#w}$KChpB``mckZu8z+sqXu!peNjKu3^u+ zyDyKuU!VD=+G%X=zSQT>n-#9)XU6gFl>0t^#X9aw^;>^+n~(jZfzbP!NjbqoynS9T z{d$#g8M(Y%(}Tn+Mc?;Q*%vP>IqkQ$Cz#7ZeG()N-t^dW({Hz7UxK~K|82j0?l@4L zwTVOkvP4j2EP4mo@Xky;wTUTQf>+8cUD}2<7Qs{zhRMG||0D)}{`ma2ZRT%Qx@f?Q zLy!)6(WPYsA6Qo*1wgdM&AFP>hsyCqm# zt&Q5+@}gxc@ql^dH9PmxS!=C;U(%W+&u3Pi+QMf)wQKiA?e1Eot)r|dj8mV@84etH zBjq<)*|F2sd#2wS%5ZT-2`T*6E!wF5cXnBPPa^TYzcxL7sQI^G>6qoQW{FQ9YG;iSbqWwy%}qbePH)*-?o382Oj2MDiHor z*M%YQWyfqV35GIOcWXe)I7`T&w}Td9*#!Rh>~;I}Lxl1}KeM+Apu;+rTw8^<*>v8H zo_o=bwKrI^EV?*ErVwP#4}N4ifg-@g96Zvy9p$CQ*02nQsB*yNzSjMen|5*|*KNkdh`KhJ;ku2*`A*|~wINGL7?}cdZV-QA{ZuT*i6KW#6Z?y*;K`L2@yER9<^UVq)kUa&tyfcO5jPwmo;x9sn(ePF*R%CT~+ z?NV6eZ9KFw>DnIaK>??^Dd+{c{Vy>wg?a8EFG3>lE&=Q&^jiTlH!ipV6nz#$ zU|f0>XsrqBDE_5gzxQMN)%P#k)enW4&$wJda5g?-Lj>+zgiiI#2zi8+9#T(z!na61 zcFfwR}xSpMB#`H&CKou@5fZv%!D7ZR5Wxw4Y%; z2=Ic

S9(JZguJqj=~sJ1lGeoEl>L9JN1sX$VWn>-N$8ckPGwZ`!-XC|5QGeKdi$ zA{MWw`|aE}PgyVXC?BsD34j#mVg==hEPNp&LNn&k8p2fx#t}?73}TIMz^+#$ut1Tw zh43nyg;!4BAcn;QTb`?=Z;x4hMLSlvSm@CbvUBHaRq9vnYJlufAiKM(@}I1Z24w zP6#4lB~?MJpd-Niow4t{(QB^~jJ_y;%ce2UOfd6KS){}4;a}>p z{dHA+^}7^sbPxhM;8<8A(##cE+iF?xY1D^20~2$B{7_aU3h`XMRa9J2)2@rAvEUlq zAvh$s6FkA8aS873?i$<@f?LqW-912XcXw#KyV1k<{r@>^>78&Vk8$p|)V$giHnhQl%C2bNU6zjx1t40X^q| zlLWeRdZdD+Vp|XJP+;S$=N2vCZ<0X>;62xn>#y^XzX6X2;aWn$L0ln;UTNaH%j4W3 zHkZTsSv(}${{C#H6_-)pymG>zs>subX!4w)dOP_jsD)mOm40#iF978{>O|3J%gPcW zWu!2(x+e<_esiam`&fqSo~T}_-DPjRAwk%)k$%0Aeh2zwmWdHON2cXO$jRLmp!FUa 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

  • HmcZf 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 Qhj_naB^4#A#f(D!52&~keE { - - private final TextTemplateEngine templateEngine; - private final HipChatService hipchatService; - - public ExecutableHipChatAction(HipChatAction action, Logger logger, HipChatService hipchatService, - TextTemplateEngine templateEngine) { - super(action, logger); - this.hipchatService = hipchatService; - this.templateEngine = templateEngine; - } - - @Override - public Action.Result execute(final String actionId, WatchExecutionContext ctx, Payload payload) throws Exception { - - HipChatAccount account = hipchatService.getAccount(action.account); - // lets validate the message again, in case the hipchat service were updated since the - // watch/action were created. - account.validateParsedTemplate(ctx.id().watchId(), actionId, action.message); - - Map model = Variables.createCtxParamsMap(ctx, payload); - HipChatMessage message = account.render(ctx.id().watchId(), actionId, templateEngine, action.message, model); - - if (ctx.simulateAction(actionId)) { - return new HipChatAction.Result.Simulated(message); - } - - SentMessages sentMessages = account.send(message, action.proxy); - return new HipChatAction.Result.Executed(sentMessages); - } - -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatAction.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatAction.java deleted file mode 100644 index 57b5bfa591e..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatAction.java +++ /dev/null @@ -1,253 +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. - */ -package org.elasticsearch.xpack.watcher.actions.hipchat; - - -import org.elasticsearch.ElasticsearchParseException; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.ParseField; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.xpack.core.watcher.actions.Action; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.text.TextTemplate; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage; -import org.elasticsearch.xpack.watcher.notification.hipchat.SentMessages; - -import java.io.IOException; -import java.util.Objects; - -public class HipChatAction implements Action { - - public static final String TYPE = "hipchat"; - - @Nullable final String account; - @Nullable final HttpProxy proxy; - final HipChatMessage.Template message; - - public HipChatAction(@Nullable String account, HipChatMessage.Template message, @Nullable HttpProxy proxy) { - this.account = account; - this.message = message; - this.proxy = proxy; - } - - @Override - public String type() { - return TYPE; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - HipChatAction that = (HipChatAction) o; - - return Objects.equals(account, that.account) && - Objects.equals(message, that.message) && - Objects.equals(proxy, that.proxy); - } - - @Override - public int hashCode() { - return Objects.hash(account, message, proxy); - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - if (account != null) { - builder.field(Field.ACCOUNT.getPreferredName(), account); - } - if (proxy != null) { - proxy.toXContent(builder, params); - } - builder.field(Field.MESSAGE.getPreferredName(), message); - return builder.endObject(); - } - - public static HipChatAction parse(String watchId, String actionId, XContentParser parser) throws IOException { - String account = null; - HipChatMessage.Template message = null; - HttpProxy proxy = null; - - String currentFieldName = null; - XContentParser.Token token; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (Field.ACCOUNT.match(currentFieldName, parser.getDeprecationHandler())) { - if (token == XContentParser.Token.VALUE_STRING) { - account = parser.text(); - } else { - throw new ElasticsearchParseException("failed to parse [{}] action [{}/{}]. expected [{}] to be of type string, but " + - "found [{}] instead", TYPE, watchId, actionId, Field.ACCOUNT.getPreferredName(), token); - } - } else if (Field.PROXY.match(currentFieldName, parser.getDeprecationHandler())) { - proxy = HttpProxy.parse(parser); - } else if (Field.MESSAGE.match(currentFieldName, parser.getDeprecationHandler())) { - try { - message = HipChatMessage.Template.parse(parser); - } catch (Exception e) { - throw new ElasticsearchParseException("failed to parse [{}] action [{}/{}]. failed to parse [{}] field", e, TYPE, - watchId, actionId, Field.MESSAGE.getPreferredName()); - } - } else { - throw new ElasticsearchParseException("failed to parse [{}] action [{}/{}]. unexpected token [{}]", TYPE, watchId, - actionId, token); - } - } - - if (message == null) { - throw new ElasticsearchParseException("failed to parse [{}] action [{}/{}]. missing required [{}] field", TYPE, watchId, - actionId, Field.MESSAGE.getPreferredName()); - } - - return new HipChatAction(account, message, proxy); - } - - public static Builder builder(String account, TextTemplate body) { - return new Builder(account, body); - } - - public interface Result { - - class Executed extends Action.Result implements Result { - - private final SentMessages sentMessages; - - public Executed(SentMessages sentMessages) { - super(TYPE, status(sentMessages)); - this.sentMessages = sentMessages; - } - - public SentMessages sentMessages() { - return sentMessages; - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - return builder.field(type, sentMessages, params); - } - - static Status status(SentMessages sentMessages) { - boolean hasSuccesses = false; - boolean hasFailures = false; - for (SentMessages.SentMessage message : sentMessages) { - if (message.isSuccess()) { - hasSuccesses = true; - } else { - hasFailures = true; - } - if (hasFailures && hasSuccesses) { - return Status.PARTIAL_FAILURE; - } - } - return hasFailures ? Status.FAILURE : Status.SUCCESS; - } - } - - class Simulated extends Action.Result implements Result { - - private final HipChatMessage message; - - protected Simulated(HipChatMessage message) { - super(TYPE, Status.SIMULATED); - this.message = message; - } - - public HipChatMessage getMessage() { - return message; - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - return builder.startObject(type) - .field(Field.MESSAGE.getPreferredName(), message, params) - .endObject(); - } - } - } - - public static class Builder implements Action.Builder { - - final String account; - final HipChatMessage.Template.Builder messageBuilder; - private HttpProxy proxy; - - public Builder(String account, TextTemplate body) { - this.account = account; - this.messageBuilder = new HipChatMessage.Template.Builder(body); - } - - public Builder addRooms(TextTemplate... rooms) { - messageBuilder.addRooms(rooms); - return this; - } - - public Builder addRooms(String... rooms) { - TextTemplate[] templates = new TextTemplate[rooms.length]; - for (int i = 0; i < rooms.length; i++) { - templates[i] = new TextTemplate(rooms[i]); - } - return addRooms(templates); - } - - - public Builder addUsers(TextTemplate... users) { - messageBuilder.addUsers(users); - return this; - } - - public Builder addUsers(String... users) { - TextTemplate[] templates = new TextTemplate[users.length]; - for (int i = 0; i < users.length; i++) { - templates[i] = new TextTemplate(users[i]); - } - return addUsers(templates); - } - - public Builder setFrom(String from) { - messageBuilder.setFrom(from); - return this; - } - - public Builder setFormat(HipChatMessage.Format format) { - messageBuilder.setFormat(format); - return this; - } - - public Builder setColor(TextTemplate color) { - messageBuilder.setColor(color); - return this; - } - - public Builder setColor(HipChatMessage.Color color) { - return setColor(color.asTemplate()); - } - - public Builder setNotify(boolean notify) { - messageBuilder.setNotify(notify); - return this; - } - - public Builder setProxy(HttpProxy proxy) { - this.proxy = proxy; - return this; - } - - @Override - public HipChatAction build() { - return new HipChatAction(account, messageBuilder.build(), proxy); - } - } - - public interface Field { - ParseField ACCOUNT = new ParseField("account"); - ParseField MESSAGE = new ParseField("message"); - ParseField PROXY = new ParseField("proxy"); - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactory.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactory.java deleted file mode 100644 index 6b9f053d1db..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactory.java +++ /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. - */ -package org.elasticsearch.xpack.watcher.actions.hipchat; - -import org.apache.logging.log4j.LogManager; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.xpack.core.watcher.actions.ActionFactory; -import org.elasticsearch.xpack.watcher.common.text.TextTemplateEngine; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatAccount; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatService; - -import java.io.IOException; - -public class HipChatActionFactory extends ActionFactory { - - private final TextTemplateEngine templateEngine; - private final HipChatService hipchatService; - - public HipChatActionFactory(TextTemplateEngine templateEngine, HipChatService hipchatService) { - super(LogManager.getLogger(ExecutableHipChatAction.class)); - this.templateEngine = templateEngine; - this.hipchatService = hipchatService; - } - - @Override - public ExecutableHipChatAction parseExecutable(String watchId, String actionId, XContentParser parser) throws IOException { - HipChatAction action = HipChatAction.parse(watchId, actionId, parser); - HipChatAccount account = hipchatService.getAccount(action.account); - account.validateParsedTemplate(watchId, actionId, action.message); - return new ExecutableHipChatAction(action, actionLogger, hipchatService, templateEngine); - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java index 654bc6b757d..e0d3129e75f 100644 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java +++ b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/common/http/HttpClient.java @@ -300,7 +300,7 @@ public class HttpClient implements Closeable { Scheme.parse(HttpSettings.PROXY_SCHEME.get(settings)) : Scheme.HTTP; int proxyPort = HttpSettings.PROXY_PORT.get(settings); if (proxyPort != 0 && Strings.hasText(proxyHost)) { - logger.info("Using default proxy for http input and slack/hipchat/pagerduty/webhook actions [{}:{}]", proxyHost, proxyPort); + logger.info("Using default proxy for http input and slack/pagerduty/webhook actions [{}:{}]", proxyHost, proxyPort); } else if (proxyPort != 0 ^ Strings.hasText(proxyHost)) { throw new IllegalArgumentException("HTTP proxy requires both settings: [" + HttpSettings.PROXY_HOST.getKey() + "] and [" + HttpSettings.PROXY_PORT.getKey() + "]"); diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccount.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccount.java deleted file mode 100644 index 67aee91f139..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccount.java +++ /dev/null @@ -1,126 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.Logger; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.settings.SecureSetting; -import org.elasticsearch.common.settings.SecureString; -import org.elasticsearch.common.settings.Setting; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.text.TextTemplateEngine; - -import java.io.IOException; -import java.util.Locale; -import java.util.Map; - -public abstract class HipChatAccount { - - public static final String ROOM_SETTING = HipChatMessage.Field.ROOM.getPreferredName(); - public static final String DEFAULT_ROOM_SETTING = "message_defaults." + HipChatMessage.Field.ROOM.getPreferredName(); - public static final String DEFAULT_USER_SETTING = "message_defaults." + HipChatMessage.Field.USER.getPreferredName(); - public static final String DEFAULT_FROM_SETTING = "message_defaults." + HipChatMessage.Field.FROM.getPreferredName(); - public static final String DEFAULT_FORMAT_SETTING = "message_defaults." + HipChatMessage.Field.FORMAT.getPreferredName(); - public static final String DEFAULT_COLOR_SETTING = "message_defaults." + HipChatMessage.Field.COLOR.getPreferredName(); - public static final String DEFAULT_NOTIFY_SETTING = "message_defaults." + HipChatMessage.Field.NOTIFY.getPreferredName(); - - static final Setting SECURE_AUTH_TOKEN_SETTING = SecureSetting.secureString("secure_auth_token", null); - - protected final Logger logger; - protected final String name; - protected final Profile profile; - protected final HipChatServer server; - protected final HttpClient httpClient; - protected final String authToken; - - protected HipChatAccount(String name, Profile profile, Settings settings, HipChatServer defaultServer, HttpClient httpClient, - Logger logger) { - this.name = name; - this.profile = profile; - this.server = new HipChatServer(settings, defaultServer); - this.httpClient = httpClient; - this.authToken = getAuthToken(name, settings); - this.logger = logger; - } - - private static String getAuthToken(String name, Settings settings) { - SecureString secureString = SECURE_AUTH_TOKEN_SETTING.get(settings); - if (secureString == null || secureString.length() < 1) { - throw new SettingsException( - "hipchat account [" + name + "] missing required [" + SECURE_AUTH_TOKEN_SETTING.getKey() + "] secure setting"); - } - return secureString.toString(); - } - - public abstract String type(); - - public abstract void validateParsedTemplate(String watchId, String actionId, HipChatMessage.Template message) throws SettingsException; - - public abstract HipChatMessage render(String watchId, String actionId, TextTemplateEngine engine, HipChatMessage.Template template, - Map model); - - public abstract SentMessages send(HipChatMessage message, @Nullable HttpProxy proxy); - - public enum Profile { - - V1() { - @Override - HipChatAccount createAccount(String name, Settings settings, HipChatServer defaultServer, HttpClient httpClient, - Logger logger) { - return new V1Account(name, settings, defaultServer, httpClient, logger); - } - }, - INTEGRATION() { - @Override - HipChatAccount createAccount(String name, Settings settings, HipChatServer defaultServer, HttpClient httpClient, - Logger logger) { - return new IntegrationAccount(name, settings, defaultServer, httpClient, logger); - } - }, - USER() { - @Override - HipChatAccount createAccount(String name, Settings settings, HipChatServer defaultServer, HttpClient httpClient, - Logger logger) { - return new UserAccount(name, settings, defaultServer, httpClient, logger); - } - }; - - abstract HipChatAccount createAccount(String name, Settings settings, HipChatServer defaultServer, HttpClient httpClient, - Logger logger); - - public String value() { - return name().toLowerCase(Locale.ROOT); - } - - public static Profile parse(XContentParser parser) throws IOException { - return Profile.valueOf(parser.text().toUpperCase(Locale.ROOT)); - } - - public static Profile resolve(String value, Profile defaultValue) { - if (value == null) { - return defaultValue; - } - return Profile.valueOf(value.toUpperCase(Locale.ROOT)); - } - - public static Profile resolve(Settings settings, String setting, Profile defaultValue) { - return resolve(settings.get(setting), defaultValue); - } - - public static boolean validate(String value) { - try { - Profile.valueOf(value.toUpperCase(Locale.ROOT)); - return true; - } catch (IllegalArgumentException ilae) { - return false; - } - } - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessage.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessage.java deleted file mode 100644 index 10eaba535ed..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessage.java +++ /dev/null @@ -1,457 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.elasticsearch.ElasticsearchParseException; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.ParseField; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.ToXContentObject; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.xpack.watcher.common.text.TextTemplate; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.Objects; - -public class HipChatMessage implements ToXContentObject { - - final String body; - @Nullable final String[] rooms; - @Nullable final String[] users; - @Nullable final String from; - @Nullable final Format format; - @Nullable final Color color; - @Nullable final Boolean notify; - - public HipChatMessage(String body, String[] rooms, String[] users, String from, Format format, Color color, Boolean notify) { - this.body = body; - this.rooms = rooms; - this.users = users; - this.from = from; - this.format = format; - this.color = color; - this.notify = notify; - } - - public String getBody() { - return body; - } - - public String[] getRooms() { - return rooms; - } - - @Nullable - public String[] getUsers() { - return users; - } - - @Nullable - public String getFrom() { - return from; - } - - @Nullable - public Format getFormat() { - return format; - } - - @Nullable - public Color getColor() { - return color; - } - - @Nullable - public Boolean getNotify() { - return notify; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - HipChatMessage that = (HipChatMessage) o; - return Objects.equals(body, that.body) && - Objects.deepEquals(rooms, that.rooms) && - Objects.deepEquals(users, that.users) && - Objects.equals(from, that.from) && - Objects.equals(format, that.format) && - Objects.equals(color, that.color) && - Objects.equals(notify, that.notify); - } - - @Override - public int hashCode() { - int result = body.hashCode(); - result = 31 * result + (rooms != null ? Arrays.hashCode(rooms) : 0); - result = 31 * result + (users != null ? Arrays.hashCode(users) : 0); - result = 31 * result + (from != null ? from.hashCode() : 0); - result = 31 * result + (format != null ? format.hashCode() : 0); - result = 31 * result + (color != null ? color.hashCode() : 0); - result = 31 * result + (notify != null ? notify.hashCode() : 0); - return result; - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - return toXContent(builder, params, true); - } - - public XContentBuilder toXContent(XContentBuilder builder, Params params, boolean includeTargets) throws IOException { - builder.startObject(); - if (from != null) { - builder.field(Field.FROM.getPreferredName(), from); - } - if (includeTargets) { - if (rooms != null && rooms.length > 0) { - builder.array(Field.ROOM.getPreferredName(), rooms); - } - if (users != null && users.length > 0) { - builder.array(Field.USER.getPreferredName(), users); - } - } - builder.field(Field.BODY.getPreferredName(), body); - if (format != null) { - builder.field(Field.FORMAT.getPreferredName(), format.value()); - } - if (color != null) { - builder.field(Field.COLOR.getPreferredName(), color.value()); - } - if (notify != null) { - builder.field(Field.NOTIFY.getPreferredName(), notify); - } - return builder.endObject(); - } - - public static class Template implements ToXContentObject { - - final TextTemplate body; - @Nullable final TextTemplate[] rooms; - @Nullable final TextTemplate[] users; - @Nullable final String from; - @Nullable final Format format; - @Nullable final TextTemplate color; - @Nullable final Boolean notify; - - public Template(TextTemplate body, - TextTemplate[] rooms, - TextTemplate[] users, - String from, - Format format, - TextTemplate color, - Boolean notify) { - this.rooms = rooms; - this.users = users; - this.body = body; - this.from = from; - this.format = format; - this.color = color; - this.notify = notify; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Template template = (Template) o; - - return Objects.equals(body, template.body) && - Objects.deepEquals(rooms, template.rooms) && - Objects.deepEquals(users, template.users) && - Objects.equals(from, template.from) && - Objects.equals(format, template.format) && - Objects.equals(color, template.color) && - Objects.equals(notify, template.notify); - } - - @Override - public int hashCode() { - return Objects.hash(body, rooms, users, from, format, color, notify); - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - if (from != null) { - builder.field(Field.FROM.getPreferredName(), from); - } - if (rooms != null && rooms.length > 0) { - builder.startArray(Field.ROOM.getPreferredName()); - for (TextTemplate room : rooms) { - room.toXContent(builder, params); - } - builder.endArray(); - } - if (users != null && users.length > 0) { - builder.startArray(Field.USER.getPreferredName()); - for (TextTemplate user : users) { - user.toXContent(builder, params); - } - builder.endArray(); - } - builder.field(Field.BODY.getPreferredName(), body, params); - if (format != null) { - builder.field(Field.FORMAT.getPreferredName(), format.value()); - } - if (color != null) { - builder.field(Field.COLOR.getPreferredName(), color, params); - } - if (notify != null) { - builder.field(Field.NOTIFY.getPreferredName(), notify); - } - return builder.endObject(); - } - - public static Template parse(XContentParser parser) throws IOException { - TextTemplate body = null; - TextTemplate[] rooms = null; - TextTemplate[] users = null; - String from = null; - TextTemplate color = null; - Boolean notify = null; - HipChatMessage.Format messageFormat = null; - - String currentFieldName = null; - XContentParser.Token token; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (Field.FROM.match(currentFieldName, parser.getDeprecationHandler())) { - from = parser.text(); - } else if (Field.ROOM.match(currentFieldName, parser.getDeprecationHandler())) { - List templates = new ArrayList<>(); - if (token == XContentParser.Token.START_ARRAY) { - while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { - try { - templates.add(TextTemplate.parse(parser)); - } catch (ElasticsearchParseException epe) { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field", epe, - Field.ROOM.getPreferredName()); - } - } - } else { - try { - templates.add(TextTemplate.parse(parser)); - } catch (ElasticsearchParseException epe) { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field", epe, - Field.ROOM.getPreferredName()); - } - } - rooms = templates.toArray(new TextTemplate[templates.size()]); - } else if (Field.USER.match(currentFieldName, parser.getDeprecationHandler())) { - List templates = new ArrayList<>(); - if (token == XContentParser.Token.START_ARRAY) { - while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { - try { - templates.add(TextTemplate.parse(parser)); - } catch (ElasticsearchParseException epe) { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field", epe, - Field.USER.getPreferredName()); - } - } - } else { - try { - templates.add(TextTemplate.parse(parser)); - } catch (ElasticsearchParseException epe) { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field", epe, - Field.USER.getPreferredName()); - } - } - users = templates.toArray(new TextTemplate[templates.size()]); - } else if (Field.COLOR.match(currentFieldName, parser.getDeprecationHandler())) { - try { - color = TextTemplate.parse(parser); - } catch (ElasticsearchParseException | IllegalArgumentException e) { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field", e, - Field.COLOR.getPreferredName()); - } - } else if (Field.NOTIFY.match(currentFieldName, parser.getDeprecationHandler())) { - if (token == XContentParser.Token.VALUE_BOOLEAN) { - notify = parser.booleanValue(); - } else { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field, expected a " + - "boolean value but found [{}]", Field.NOTIFY.getPreferredName(), token); - } - } else if (Field.BODY.match(currentFieldName, parser.getDeprecationHandler())) { - try { - body = TextTemplate.parse(parser); - } catch (ElasticsearchParseException pe) { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field", pe, - Field.BODY.getPreferredName()); - } - } else if (Field.FORMAT.match(currentFieldName, parser.getDeprecationHandler())) { - try { - messageFormat = HipChatMessage.Format.parse(parser); - } catch (IllegalArgumentException ilae) { - throw new ElasticsearchParseException("failed to parse hipchat message. failed to parse [{}] field", ilae, - Field.FORMAT.getPreferredName()); - } - } else { - throw new ElasticsearchParseException("failed to parse hipchat message. unexpected field [{}]", currentFieldName); - } - } - - if (body == null) { - throw new ElasticsearchParseException("failed to parse hipchat message. missing required [{}] field", - Field.BODY.getPreferredName()); - } - - return new HipChatMessage.Template(body, rooms, users, from, messageFormat, color, notify); - } - - public static class Builder { - - final TextTemplate body; - final List rooms = new ArrayList<>(); - final List users = new ArrayList<>(); - @Nullable String from; - @Nullable Format format; - @Nullable TextTemplate color; - @Nullable Boolean notify; - - public Builder(TextTemplate body) { - this.body = body; - } - - public Builder addRooms(TextTemplate... rooms) { - this.rooms.addAll(Arrays.asList(rooms)); - return this; - } - - public Builder addUsers(TextTemplate... users) { - this.users.addAll(Arrays.asList(users)); - return this; - } - - public Builder setFrom(String from) { - this.from = from; - return this; - } - - public Builder setFormat(Format format) { - this.format = format; - return this; - } - - public Builder setColor(TextTemplate color) { - this.color = color; - return this; - } - - public Builder setNotify(boolean notify) { - this.notify = notify; - return this; - } - - public Template build() { - return new Template( - body, - rooms.isEmpty() ? null : rooms.toArray(new TextTemplate[rooms.size()]), - users.isEmpty() ? null : users.toArray(new TextTemplate[users.size()]), - from, - format, - color, - notify); - } - } - } - - - public enum Color { - YELLOW, GREEN, RED, PURPLE, GRAY, RANDOM; - - private final TextTemplate template = new TextTemplate(name()); - - public TextTemplate asTemplate() { - return template; - } - - public String value() { - return name().toLowerCase(Locale.ROOT); - } - - public static Color parse(XContentParser parser) throws IOException { - return Color.valueOf(parser.text().toUpperCase(Locale.ROOT)); - } - - public static Color resolve(String value, Color defaultValue) { - if (value == null) { - return defaultValue; - } - return Color.valueOf(value.toUpperCase(Locale.ROOT)); - } - - public static Color resolve(Settings settings, String setting, Color defaultValue) { - return resolve(settings.get(setting), defaultValue); - } - - public static boolean validate(String value) { - try { - Color.valueOf(value.toUpperCase(Locale.ROOT)); - return true; - } catch (IllegalArgumentException ilae) { - return false; - } - } - } - - public enum Format { - - TEXT, - HTML; - - private final TextTemplate template = new TextTemplate(name()); - - public TextTemplate asTemplate() { - return template; - } - - public String value() { - return name().toLowerCase(Locale.ROOT); - } - - public static Format parse(XContentParser parser) throws IOException { - return Format.valueOf(parser.text().toUpperCase(Locale.ROOT)); - } - - public static Format resolve(String value, Format defaultValue) { - if (value == null) { - return defaultValue; - } - return Format.valueOf(value.toUpperCase(Locale.ROOT)); - } - - public static Format resolve(Settings settings, String setting, Format defaultValue) { - return resolve(settings.get(setting), defaultValue); - } - - public static boolean validate(String value) { - try { - Format.valueOf(value.toUpperCase(Locale.ROOT)); - return true; - } catch (IllegalArgumentException ilae) { - return false; - } - } - } - - public interface Field { - ParseField ROOM = new ParseField("room"); - ParseField USER = new ParseField("user"); - ParseField BODY = new ParseField("body"); - ParseField FROM = new ParseField("from"); - ParseField COLOR = new ParseField("color"); - ParseField NOTIFY = new ParseField("notify"); - ParseField FORMAT = new ParseField("format"); - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServer.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServer.java deleted file mode 100644 index 4a40a1d47fb..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServer.java +++ /dev/null @@ -1,56 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; - -public class HipChatServer { - - public static final String HOST_SETTING = "host"; - public static final String PORT_SETTING = "port"; - - public static final HipChatServer DEFAULT = new HipChatServer("api.hipchat.com", 443, null); - - private final String host; - private final int port; - private final HipChatServer fallback; - - public HipChatServer(Settings settings) { - this(settings, DEFAULT); - } - - public HipChatServer(Settings settings, HipChatServer fallback) { - this(settings.get(HOST_SETTING, null), settings.getAsInt(PORT_SETTING, -1), fallback); - } - - public HipChatServer(String host, int port, HipChatServer fallback) { - this.host = host; - this.port = port; - this.fallback = fallback; - } - - public String host() { - return host != null ? host : fallback.host(); - } - - public int port() { - return port > 0 ? port : fallback.port(); - } - - public HipChatServer fallback() { - return fallback != null ? fallback : DEFAULT; - } - - public HipChatServer rebuild(Settings settings, HipChatServer fallback) { - return new HipChatServer(settings.get(HOST_SETTING, host), settings.getAsInt(PORT_SETTING, port), fallback); - } - - public synchronized HttpRequest.Builder httpRequest() { - return HttpRequest.builder(host(), port()); - } - -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatService.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatService.java deleted file mode 100644 index efa403fd769..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatService.java +++ /dev/null @@ -1,111 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.elasticsearch.common.settings.ClusterSettings; -import org.elasticsearch.common.settings.SecureSetting; -import org.elasticsearch.common.settings.SecureString; -import org.elasticsearch.common.settings.Setting; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.notification.NotificationService; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * A component to store hipchat credentials. - */ -public class HipChatService extends NotificationService { - - private static final Setting SETTING_DEFAULT_ACCOUNT = - Setting.simpleString("xpack.notification.hipchat.default_account", Setting.Property.Dynamic, Setting.Property.NodeScope); - - static final Setting SETTING_DEFAULT_HOST = - Setting.simpleString("xpack.notification.hipchat.host", Setting.Property.Dynamic, Setting.Property.NodeScope); - - static final Setting SETTING_DEFAULT_PORT = - Setting.intSetting("xpack.notification.hipchat.port", 443, Setting.Property.Dynamic, Setting.Property.NodeScope); - - private static final Setting.AffixSetting SETTING_AUTH_TOKEN_SECURE = - Setting.affixKeySetting("xpack.notification.hipchat.account.", "secure_auth_token", - (key) -> SecureSetting.secureString(key, null)); - - private static final Setting.AffixSetting SETTING_PROFILE = - Setting.affixKeySetting("xpack.notification.hipchat.account.", "profile", - (key) -> Setting.simpleString(key, Setting.Property.Dynamic, Setting.Property.NodeScope)); - - private static final Setting.AffixSetting SETTING_ROOM = - Setting.affixKeySetting("xpack.notification.hipchat.account.", "room", - (key) -> Setting.simpleString(key, Setting.Property.Dynamic, Setting.Property.NodeScope)); - - private static final Setting.AffixSetting SETTING_HOST = - Setting.affixKeySetting("xpack.notification.hipchat.account.", "host", - (key) -> Setting.simpleString(key, Setting.Property.Dynamic, Setting.Property.NodeScope)); - - private static final Setting.AffixSetting SETTING_PORT = - Setting.affixKeySetting("xpack.notification.hipchat.account.", "port", - (key) -> Setting.intSetting(key, 443, Setting.Property.Dynamic, Setting.Property.NodeScope)); - - private static final Setting.AffixSetting SETTING_MESSAGE_DEFAULTS = - Setting.affixKeySetting("xpack.notification.hipchat.account.", "message", - (key) -> Setting.groupSetting(key + ".", Setting.Property.Dynamic, Setting.Property.NodeScope)); - - private static final Logger logger = LogManager.getLogger(HipChatService.class); - - private final HttpClient httpClient; - private HipChatServer defaultServer; - - public HipChatService(Settings settings, HttpClient httpClient, ClusterSettings clusterSettings) { - super("hipchat", settings, clusterSettings, HipChatService.getDynamicSettings(), HipChatService.getSecureSettings()); - this.httpClient = httpClient; - // ensure logging of setting changes - clusterSettings.addSettingsUpdateConsumer(SETTING_DEFAULT_ACCOUNT, (s) -> {}); - clusterSettings.addSettingsUpdateConsumer(SETTING_DEFAULT_HOST, (s) -> {}); - clusterSettings.addSettingsUpdateConsumer(SETTING_DEFAULT_PORT, (s) -> {}); - clusterSettings.addAffixUpdateConsumer(SETTING_PROFILE, (s, o) -> {}, (s, o) -> {}); - clusterSettings.addAffixUpdateConsumer(SETTING_ROOM, (s, o) -> {}, (s, o) -> {}); - clusterSettings.addAffixUpdateConsumer(SETTING_HOST, (s, o) -> {}, (s, o) -> {}); - clusterSettings.addAffixUpdateConsumer(SETTING_PORT, (s, o) -> {}, (s, o) -> {}); - clusterSettings.addAffixUpdateConsumer(SETTING_MESSAGE_DEFAULTS, (s, o) -> {}, (s, o) -> {}); - // do an initial load - reload(settings); - } - - @Override - public synchronized void reload(Settings settings) { - defaultServer = new HipChatServer(settings.getByPrefix("xpack.notification.hipchat.")); - super.reload(settings); - } - - @Override - protected HipChatAccount createAccount(String name, Settings accountSettings) { - HipChatAccount.Profile profile = HipChatAccount.Profile.resolve(accountSettings, "profile", null); - if (profile == null) { - throw new SettingsException("missing [profile] setting for hipchat account [" + name + "]"); - } - return profile.createAccount(name, accountSettings, defaultServer, httpClient, logger); - } - - private static List> getDynamicSettings() { - return Arrays.asList(SETTING_DEFAULT_ACCOUNT, SETTING_PROFILE, SETTING_ROOM, SETTING_MESSAGE_DEFAULTS, - SETTING_DEFAULT_HOST, SETTING_DEFAULT_PORT, SETTING_HOST, SETTING_PORT); - } - - private static List> getSecureSettings() { - return Arrays.asList(SETTING_AUTH_TOKEN_SECURE); - } - - public static List> getSettings() { - List> allSettings = new ArrayList>(getDynamicSettings()); - allSettings.addAll(getSecureSettings()); - return allSettings; - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccount.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccount.java deleted file mode 100644 index c33e788b614..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccount.java +++ /dev/null @@ -1,135 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.Logger; -import org.elasticsearch.ElasticsearchParseException; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.xpack.watcher.actions.hipchat.HipChatAction; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpMethod; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.http.Scheme; -import org.elasticsearch.xpack.watcher.common.text.TextTemplateEngine; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage.Color; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage.Format; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class IntegrationAccount extends HipChatAccount { - - public static final String TYPE = "integration"; - - final String room; - final Defaults defaults; - - public IntegrationAccount(String name, Settings settings, HipChatServer defaultServer, HttpClient httpClient, Logger logger) { - super(name, Profile.INTEGRATION, settings, defaultServer, httpClient, logger); - List rooms = settings.getAsList(ROOM_SETTING, null); - if (rooms == null || rooms.isEmpty()) { - throw new SettingsException("invalid hipchat account [" + name + "]. missing required [" + ROOM_SETTING + "] setting for [" + - TYPE + "] account profile"); - } - if (rooms.size() > 1) { - throw new SettingsException("invalid hipchat account [" + name + "]. [" + ROOM_SETTING + "] setting for [" + TYPE + "] " + - "account must only be set with a single value"); - } - this.room = rooms.get(0); - defaults = new Defaults(settings); - } - - @Override - public String type() { - return TYPE; - } - - @Override - public void validateParsedTemplate(String watchId, String actionId, HipChatMessage.Template template) throws SettingsException { - if (template.rooms != null) { - throw new ElasticsearchParseException("invalid [" + HipChatAction.TYPE + "] action for [" + watchId + "/" + actionId + "] " + - "action. [" + name + "] hipchat account doesn't support custom rooms"); - } - if (template.users != null) { - throw new ElasticsearchParseException("invalid [" + HipChatAction.TYPE + "] action for [" + watchId + "/" + actionId + "] " + - "action. [" + name + "] hipchat account doesn't support user private messages"); - } - if (template.from != null) { - throw new ElasticsearchParseException("invalid [" + HipChatAction.TYPE + "] action for [" + watchId + "/" + actionId + "] " + - "action. [" + name + "] hipchat account doesn't support custom `from` fields"); - } - } - - @Override - public HipChatMessage render(String watchId, String actionId, TextTemplateEngine engine, HipChatMessage.Template template, - Map model) { - String message = engine.render(template.body, model); - Color color = template.color != null ? Color.resolve(engine.render(template.color, model), defaults.color) : defaults.color; - Boolean notify = template.notify != null ? template.notify : defaults.notify; - Format messageFormat = template.format != null ? template.format : defaults.format; - return new HipChatMessage(message, null, null, null, messageFormat, color, notify); - } - - @Override - public SentMessages send(HipChatMessage message, @Nullable HttpProxy proxy) { - List sentMessages = new ArrayList<>(); - HttpRequest request = buildRoomRequest(room, message, proxy); - try { - HttpResponse response = httpClient.execute(request); - sentMessages.add(SentMessages.SentMessage.responded(room, SentMessages.SentMessage.TargetType.ROOM, message, request, - response)); - } catch (Exception e) { - sentMessages.add(SentMessages.SentMessage.error(room, SentMessages.SentMessage.TargetType.ROOM, message, e)); - } - return new SentMessages(name, sentMessages); - } - - private HttpRequest buildRoomRequest(String room, final HipChatMessage message, HttpProxy proxy) { - String urlEncodedRoom = HttpRequest.encodeUrl(room); - HttpRequest.Builder builder = server.httpRequest() - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v2/room/" + urlEncodedRoom + "/notification") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer " + authToken) - .body(Strings.toString((xbuilder, params) -> { - xbuilder.field("message", message.body); - if (message.format != null) { - xbuilder.field("message_format", message.format.value()); - } - if (message.notify != null) { - xbuilder.field("notify", message.notify); - } - if (message.color != null) { - xbuilder.field("color", String.valueOf(message.color.value())); - } - return xbuilder; - })); - if (proxy != null) { - builder.proxy(proxy); - } - return builder.build(); - } - - static class Defaults { - - @Nullable final Format format; - @Nullable final Color color; - @Nullable final Boolean notify; - - Defaults(Settings settings) { - this.format = Format.resolve(settings, DEFAULT_FORMAT_SETTING, null); - this.color = Color.resolve(settings, DEFAULT_COLOR_SETTING, null); - this.notify = settings.getAsBoolean(DEFAULT_NOTIFY_SETTING, null); - } - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/SentMessages.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/SentMessages.java deleted file mode 100644 index ed05c4fe5ad..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/SentMessages.java +++ /dev/null @@ -1,153 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.ParseField; -import org.elasticsearch.common.xcontent.ToXContentObject; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.xpack.core.watcher.support.xcontent.WatcherParams; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; - -public class SentMessages implements ToXContentObject, Iterable { - - private static final ParseField ACCOUNT = new ParseField("account"); - private static final ParseField SENT_MESSAGES = new ParseField("sent_messages"); - - private String accountName; - private List messages; - - public SentMessages(String accountName, List messages) { - this.accountName = accountName; - this.messages = messages; - } - - public String getAccountName() { - return accountName; - } - - @Override - public Iterator iterator() { - return messages.iterator(); - } - - public int count() { - return messages.size(); - } - - public List asList() { - return Collections.unmodifiableList(messages); - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - builder.field(ACCOUNT.getPreferredName(), accountName); - builder.startArray(SENT_MESSAGES.getPreferredName()); - for (SentMessage message : messages) { - message.toXContent(builder, params); - } - builder.endArray(); - return builder.endObject(); - } - - public static class SentMessage implements ToXContentObject { - - private static final ParseField STATUS = new ParseField("status"); - private static final ParseField REQUEST = new ParseField("request"); - private static final ParseField RESPONSE = new ParseField("response"); - private static final ParseField MESSAGE = new ParseField("message"); - - public enum TargetType { - ROOM, USER; - - final String fieldName = new String(name().toLowerCase(Locale.ROOT)); - } - - final String targetName; - final TargetType targetType; - final HipChatMessage message; - @Nullable final HttpRequest request; - @Nullable final HttpResponse response; - @Nullable final Exception exception; - - public static SentMessage responded(String targetName, TargetType targetType, HipChatMessage message, HttpRequest request, - HttpResponse response) { - return new SentMessage(targetName, targetType, message, request, response, null); - } - - public static SentMessage error(String targetName, TargetType targetType, HipChatMessage message, Exception e) { - return new SentMessage(targetName, targetType, message, null, null, e); - } - - private SentMessage(String targetName, TargetType targetType, HipChatMessage message, HttpRequest request, HttpResponse response, - Exception exception) { - this.targetName = targetName; - this.targetType = targetType; - this.message = message; - this.request = request; - this.response = response; - this.exception = exception; - } - - public HttpRequest getRequest() { - return request; - } - - public HttpResponse getResponse() { - return response; - } - - public Exception getException() { - return exception; - } - - public boolean isSuccess() { - return response != null && response.status() >= 200 && response.status() < 300; - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - boolean success = isSuccess(); - builder.field(STATUS.getPreferredName(), success ? "success" : "failure"); - if (success == false) { - if (request != null) { - if (WatcherParams.hideSecrets(params)) { - // this writes out the request to the byte array output stream with the correct excludes for hipchat - try (InputStream is = HttpRequest.filterToXContent(request, builder.contentType().xContent(), - params, "params.auth_token")) { - builder.rawField(REQUEST.getPreferredName(), is, builder.contentType()); - } - } else { - builder.field(REQUEST.getPreferredName()); - request.toXContent(builder, params); - } - } - if (response != null) { - builder.field(RESPONSE.getPreferredName()); - response.toXContent(builder, params); - } - if (exception != null) { - ElasticsearchException.generateFailureXContent(builder, params, exception, true); - } - } - builder.field(targetType.fieldName, targetName); - builder.field(MESSAGE.getPreferredName()); - message.toXContent(builder, params, false); - return builder.endObject(); - } - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccount.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccount.java deleted file mode 100644 index c0b89cc66ec..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccount.java +++ /dev/null @@ -1,192 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.Logger; -import org.elasticsearch.ElasticsearchParseException; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpMethod; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.http.Scheme; -import org.elasticsearch.xpack.watcher.common.text.TextTemplateEngine; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage.Color; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage.Format; -import org.elasticsearch.xpack.watcher.actions.hipchat.HipChatAction; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class UserAccount extends HipChatAccount { - - public static final String TYPE = "user"; - - final Defaults defaults; - - public UserAccount(String name, Settings settings, HipChatServer defaultServer, HttpClient httpClient, Logger logger) { - super(name, Profile.USER, settings, defaultServer, httpClient, logger); - defaults = new Defaults(settings); - } - - @Override - public String type() { - return TYPE; - } - - @Override - public void validateParsedTemplate(String watchId, String actionId, HipChatMessage.Template template) throws SettingsException { - if (template.from != null) { - throw new ElasticsearchParseException("invalid [" + HipChatAction.TYPE + "] action for [" + watchId + "/" + actionId + "]. [" - + name + "] hipchat account doesn't support custom `from` fields"); - } - } - - @Override - public HipChatMessage render(String watchId, String actionId, TextTemplateEngine engine, HipChatMessage.Template template, - Map model) { - String[] rooms = defaults.rooms; - if (template.rooms != null) { - rooms = new String[template.rooms.length]; - for (int i = 0; i < template.rooms.length; i++) { - rooms[i] = engine.render(template.rooms[i], model); - } - } - String[] users = defaults.users; - if (template.users != null) { - users = new String[template.users.length]; - for (int i = 0; i < template.users.length; i++) { - users[i] = engine.render(template.users[i], model); - } - } - String message = engine.render(template.body, model); - Color color = Color.resolve(engine.render(template.color, model), defaults.color); - Boolean notify = template.notify != null ? template.notify : defaults.notify; - Format messageFormat = template.format != null ? template.format : defaults.format; - return new HipChatMessage(message, rooms, users, null, messageFormat, color, notify); - } - - @Override - public SentMessages send(HipChatMessage message, HttpProxy proxy) { - List sentMessages = new ArrayList<>(); - if (message.rooms != null) { - for (String room : message.rooms) { - HttpRequest request = buildRoomRequest(room, message, proxy); - try { - HttpResponse response = httpClient.execute(request); - sentMessages.add(SentMessages.SentMessage.responded(room, SentMessages.SentMessage.TargetType.ROOM, message, request, - response)); - } catch (IOException e) { - logger.error("failed to execute hipchat api http request", e); - sentMessages.add(SentMessages.SentMessage.error(room, SentMessages.SentMessage.TargetType.ROOM, message, e)); - } - } - } - if (message.users != null) { - for (String user : message.users) { - HttpRequest request = buildUserRequest(user, message, proxy); - try { - HttpResponse response = httpClient.execute(request); - sentMessages.add(SentMessages.SentMessage.responded(user, SentMessages.SentMessage.TargetType.USER, message, request, - response)); - } catch (Exception e) { - logger.error("failed to execute hipchat api http request", e); - sentMessages.add(SentMessages.SentMessage.error(user, SentMessages.SentMessage.TargetType.USER, message, e)); - } - } - } - return new SentMessages(name, sentMessages); - } - - public HttpRequest buildRoomRequest(String room, final HipChatMessage message, HttpProxy proxy) { - String urlEncodedRoom = encodeRoom(room); - HttpRequest.Builder builder = server.httpRequest() - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v2/room/" + urlEncodedRoom + "/notification") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer " + authToken) - .body(Strings.toString((xbuilder, params) -> { - xbuilder.field("message", message.body); - if (message.format != null) { - xbuilder.field("message_format", message.format.value()); - } - if (message.notify != null) { - xbuilder.field("notify", message.notify); - } - if (message.color != null) { - xbuilder.field("color", String.valueOf(message.color.value())); - } - return xbuilder; - })); - if (proxy != null) { - builder.proxy(proxy); - } - return builder.build(); - } - - // this specific hipchat API does not accept application-form encoding, but requires real URL encoding - // spaces must not be replaced with a plus, but rather with %20 - // this workaround ensures, that this happens - private String encodeRoom(String text) { - try { - return new URI("//", "", "", text, null).getRawQuery(); - } catch (URISyntaxException e) { - throw new IllegalArgumentException("failed to URL encode text [" + text + "]", e); - } - - } - - public HttpRequest buildUserRequest(String user, final HipChatMessage message, HttpProxy proxy) { - HttpRequest.Builder builder = server.httpRequest() - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v2/user/" + user + "/message") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer " + authToken) - .body(Strings.toString((xbuilder, params) -> { - xbuilder.field("message", message.body); - if (message.format != null) { - xbuilder.field("message_format", message.format.value()); - } - if (message.notify != null) { - xbuilder.field("notify", message.notify); - } - return xbuilder; - })); - if (proxy != null) { - builder.proxy(proxy); - } - return builder.build(); - } - - static class Defaults { - - @Nullable final String[] rooms; - @Nullable final String[] users; - @Nullable final Format format; - @Nullable final Color color; - @Nullable final Boolean notify; - - Defaults(Settings settings) { - List rooms = settings.getAsList(DEFAULT_ROOM_SETTING, null); - this.rooms = rooms == null ? null : rooms.toArray(Strings.EMPTY_ARRAY); - List users = settings.getAsList(DEFAULT_USER_SETTING, null); - this.users = users == null ? null : users.toArray(Strings.EMPTY_ARRAY); - this.format = Format.resolve(settings, DEFAULT_FORMAT_SETTING, null); - this.color = Color.resolve(settings, DEFAULT_COLOR_SETTING, null); - this.notify = settings.getAsBoolean(DEFAULT_NOTIFY_SETTING, null); - } - } -} diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1Account.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1Account.java deleted file mode 100644 index 084cff2d094..00000000000 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1Account.java +++ /dev/null @@ -1,139 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.Logger; -import org.elasticsearch.ElasticsearchParseException; -import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpMethod; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.http.Scheme; -import org.elasticsearch.xpack.watcher.common.text.TextTemplateEngine; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage.Color; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage.Format; -import org.elasticsearch.xpack.watcher.actions.hipchat.HipChatAction; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class V1Account extends HipChatAccount { - - public static final String TYPE = "v1"; - - final Defaults defaults; - - public V1Account(String name, Settings settings, HipChatServer defaultServer, HttpClient httpClient, Logger logger) { - super(name, Profile.V1, settings, defaultServer, httpClient, logger); - defaults = new Defaults(settings); - } - - @Override - public String type() { - return TYPE; - } - - @Override - public void validateParsedTemplate(String watchId, String actionId, - HipChatMessage.Template template) throws ElasticsearchParseException { - if (template.users != null) { - throw new ElasticsearchParseException("invalid [" + HipChatAction.TYPE + "] action for [" + watchId + "/" + actionId + "]. [" - + name + "] hipchat account doesn't support user private messaging"); - } - if ((template.rooms == null || template.rooms.length == 0) && (defaults.rooms == null || defaults.rooms.length == 0)) { - throw new ElasticsearchParseException("invalid [" + HipChatAction.TYPE + "] action for [" + watchId + "/" + actionId + "]. " + - "missing required [" + HipChatMessage.Field.ROOM + "] field for [" + name + "] hipchat account"); - } - } - - @Override - public HipChatMessage render(String watchId, String actionId, TextTemplateEngine engine, HipChatMessage.Template template, - Map model) { - String message = engine.render(template.body, model); - String[] rooms = defaults.rooms; - if (template.rooms != null) { - rooms = new String[template.rooms.length]; - for (int i = 0; i < template.rooms.length; i++) { - rooms[i] = engine.render(template.rooms[i], model); - } - } - String from = template.from != null ? template.from : defaults.from != null ? defaults.from : watchId; - Color color = Color.resolve(engine.render(template.color, model), defaults.color); - Boolean notify = template.notify != null ? template.notify : defaults.notify; - Format messageFormat = template.format != null ? template.format : defaults.format; - return new HipChatMessage(message, rooms, null, from, messageFormat, color, notify); - } - - @Override - public SentMessages send(HipChatMessage message, @Nullable HttpProxy proxy) { - List sentMessages = new ArrayList<>(); - if (message.rooms != null) { - for (String room : message.rooms) { - HttpRequest request = buildRoomRequest(room, message, proxy); - try { - HttpResponse response = httpClient.execute(request); - sentMessages.add(SentMessages.SentMessage.responded(room, SentMessages.SentMessage.TargetType.ROOM, message, request, - response)); - } catch (Exception e) { - logger.error("failed to execute hipchat api http request", e); - sentMessages.add(SentMessages.SentMessage.error(room, SentMessages.SentMessage.TargetType.ROOM, message, e)); - } - } - } - return new SentMessages(name, sentMessages); - } - - public HttpRequest buildRoomRequest(String room, HipChatMessage message, HttpProxy proxy) { - HttpRequest.Builder builder = server.httpRequest(); - builder.method(HttpMethod.POST); - builder.scheme(Scheme.HTTPS); - builder.path("/v1/rooms/message"); - builder.setHeader("Content-Type", "application/x-www-form-urlencoded"); - builder.setParam("format", "json"); - builder.setParam("auth_token", authToken); - if (proxy != null) { - builder.proxy(proxy); - } - StringBuilder body = new StringBuilder(); - body.append("room_id=").append(HttpRequest.encodeUrl(room)); - body.append("&from=").append(HttpRequest.encodeUrl(message.from)); - body.append("&message=").append(HttpRequest.encodeUrl(message.body)); - if (message.format != null) { - body.append("&message_format=").append(message.format.value()); - } - if (message.color != null) { - body.append("&color=").append(message.color.value()); - } - if (message.notify != null) { - body.append("¬ify=").append(message.notify ? "1" : "0"); - } - builder.body(body.toString()); - return builder.build(); - } - - static class Defaults { - - @Nullable final String[] rooms; - @Nullable final String from; - @Nullable final Format format; - @Nullable final Color color; - @Nullable final Boolean notify; - - Defaults(Settings settings) { - List rooms = settings.getAsList(DEFAULT_ROOM_SETTING, null); - this.rooms = rooms == null ? null : rooms.toArray(Strings.EMPTY_ARRAY); - this.from = settings.get(DEFAULT_FROM_SETTING); - this.format = Format.resolve(settings, DEFAULT_FORMAT_SETTING, null); - this.color = Color.resolve(settings, DEFAULT_COLOR_SETTING, null); - this.notify = settings.getAsBoolean(DEFAULT_NOTIFY_SETTING, null); - } - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactoryTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactoryTests.java deleted file mode 100644 index 02b7dec72aa..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionFactoryTests.java +++ /dev/null @@ -1,63 +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. - */ -package org.elasticsearch.xpack.watcher.actions.hipchat; - -import org.elasticsearch.common.settings.ClusterSettings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.watcher.common.text.TextTemplateEngine; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatAccount; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatService; -import org.junit.Before; - -import java.util.HashSet; - -import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; -import static org.elasticsearch.xpack.watcher.actions.ActionBuilders.hipchatAction; -import static org.hamcrest.Matchers.is; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class HipChatActionFactoryTests extends ESTestCase { - private HipChatActionFactory factory; - private HipChatService hipchatService; - - @Before - public void init() throws Exception { - hipchatService = mock(HipChatService.class); - factory = new HipChatActionFactory(mock(TextTemplateEngine.class), hipchatService); - } - - public void testParseAction() throws Exception { - HipChatAccount account = mock(HipChatAccount.class); - when(hipchatService.getAccount("_account1")).thenReturn(account); - - HipChatAction action = hipchatAction("_account1", "_body").build(); - XContentBuilder jsonBuilder = jsonBuilder().value(action); - XContentParser parser = createParser(jsonBuilder); - parser.nextToken(); - - ExecutableHipChatAction parsedAction = factory.parseExecutable("_w1", "_a1", parser); - assertThat(parsedAction.action(), is(action)); - - verify(account, times(1)).validateParsedTemplate("_w1", "_a1", action.message); - } - - public void testParseActionUnknownAccount() throws Exception { - hipchatService = new HipChatService(Settings.EMPTY, null, new ClusterSettings(Settings.EMPTY, - new HashSet<>(HipChatService.getSettings()))); - factory = new HipChatActionFactory(mock(TextTemplateEngine.class), hipchatService); - HipChatAction action = hipchatAction("_unknown", "_body").build(); - XContentBuilder jsonBuilder = jsonBuilder().value(action); - XContentParser parser = createParser(jsonBuilder); - parser.nextToken(); - expectThrows(IllegalArgumentException.class, () -> factory.parseExecutable("_w1", "_a1", parser)); - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionTests.java deleted file mode 100644 index f36f00b54dd..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/actions/hipchat/HipChatActionTests.java +++ /dev/null @@ -1,296 +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. - */ -package org.elasticsearch.xpack.watcher.actions.hipchat; - -import org.elasticsearch.ElasticsearchParseException; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.collect.MapBuilder; -import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; -import org.elasticsearch.common.xcontent.NamedXContentRegistry; -import org.elasticsearch.common.xcontent.ToXContent; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.common.xcontent.json.JsonXContent; -import org.elasticsearch.script.JodaCompatibleZonedDateTime; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.core.watcher.actions.Action; -import org.elasticsearch.xpack.core.watcher.execution.WatchExecutionContext; -import org.elasticsearch.xpack.core.watcher.execution.Wid; -import org.elasticsearch.xpack.core.watcher.watch.Payload; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.text.TextTemplate; -import org.elasticsearch.xpack.watcher.common.text.TextTemplateEngine; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatAccount; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatMessage; -import org.elasticsearch.xpack.watcher.notification.hipchat.HipChatService; -import org.elasticsearch.xpack.watcher.notification.hipchat.SentMessages; -import org.junit.Before; - -import java.io.IOException; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import static java.util.Collections.singletonMap; -import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; -import static org.elasticsearch.xpack.watcher.test.WatcherTestUtils.mockExecutionContextBuilder; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.sameInstance; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class HipChatActionTests extends ESTestCase { - private HipChatService service; - - @Before - public void init() throws Exception { - service = mock(HipChatService.class); - } - - public void testExecute() throws Exception { - final String accountName = "account1"; - - TextTemplateEngine templateEngine = mock(TextTemplateEngine.class); - - TextTemplate body = new TextTemplate("_body"); - HipChatMessage.Template.Builder messageBuilder = new HipChatMessage.Template.Builder(body); - - HipChatMessage.Template messageTemplate = messageBuilder.build(); - - HipChatAction action = new HipChatAction(accountName, messageTemplate, null); - ExecutableHipChatAction executable = new ExecutableHipChatAction(action, logger, service, templateEngine); - - Map data = new HashMap<>(); - Payload payload = new Payload.Simple(data); - - Map metadata = MapBuilder.newMapBuilder().put("_key", "_val").map(); - - ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC); - JodaCompatibleZonedDateTime jodaJavaNow = new JodaCompatibleZonedDateTime(now.toInstant(), ZoneOffset.UTC); - - Wid wid = new Wid(randomAlphaOfLength(5), now); - WatchExecutionContext ctx = mockExecutionContextBuilder(wid.watchId()) - .wid(wid) - .payload(payload) - .time(wid.watchId(), now) - .metadata(metadata) - .buildMock(); - - Map triggerModel = new HashMap<>(); - triggerModel.put("triggered_time", jodaJavaNow); - triggerModel.put("scheduled_time", jodaJavaNow); - Map ctxModel = new HashMap<>(); - ctxModel.put("id", ctx.id().value()); - ctxModel.put("watch_id", wid.watchId()); - ctxModel.put("payload", data); - ctxModel.put("metadata", metadata); - ctxModel.put("execution_time", jodaJavaNow); - ctxModel.put("trigger", triggerModel); - ctxModel.put("vars", Collections.emptyMap()); - Map expectedModel = singletonMap("ctx", ctxModel); - - if (body != null) { - when(templateEngine.render(body, expectedModel)).thenReturn(body.getTemplate()); - } - - String[] rooms = new String[] { "_r1" }; - HipChatMessage message = new HipChatMessage(body.getTemplate(), rooms, null, null, null, null, null); - HipChatAccount account = mock(HipChatAccount.class); - when(account.render(wid.watchId(), "_id", templateEngine, messageTemplate, expectedModel)).thenReturn(message); - boolean responseFailure = randomBoolean(); - HttpResponse response = new HttpResponse(responseFailure ? 404 : 200); - HttpRequest request = HttpRequest.builder("localhost", 12345).path("/").build(); - SentMessages sentMessages = new SentMessages(accountName, Arrays.asList( - SentMessages.SentMessage.responded("_r1", SentMessages.SentMessage.TargetType.ROOM, message, request, response) - )); - when(account.send(message, null)).thenReturn(sentMessages); - when(service.getAccount(accountName)).thenReturn(account); - - Action.Result result = executable.execute("_id", ctx, payload); - - assertThat(result, notNullValue()); - assertThat(result, instanceOf(HipChatAction.Result.Executed.class)); - if (responseFailure) { - assertThat(result.status(), equalTo(Action.Result.Status.FAILURE)); - } else { - assertThat(result.status(), equalTo(Action.Result.Status.SUCCESS)); - } - assertThat(((HipChatAction.Result.Executed) result).sentMessages(), sameInstance(sentMessages)); - assertValidToXContent(result); - } - - public void testParser() throws Exception { - XContentBuilder builder = jsonBuilder().startObject(); - - String accountName = randomAlphaOfLength(10); - builder.field("account", accountName); - builder.startObject("message"); - - TextTemplate body = new TextTemplate("_body"); - builder.field("body", body); - - TextTemplate[] rooms = null; - if (randomBoolean()) { - TextTemplate r1 = new TextTemplate("_r1"); - TextTemplate r2 = new TextTemplate("_r2"); - rooms = new TextTemplate[] { r1, r2 }; - builder.array("room", r1, r2); - } - TextTemplate[] users = null; - if (randomBoolean()) { - TextTemplate u1 = new TextTemplate("_u1"); - TextTemplate u2 = new TextTemplate("_u2"); - users = new TextTemplate[] { u1, u2 }; - builder.array("user", u1, u2); - } - String from = null; - if (randomBoolean()) { - from = randomAlphaOfLength(10); - builder.field("from", from); - } - HipChatMessage.Format format = null; - if (randomBoolean()) { - format = randomFrom(HipChatMessage.Format.values()); - builder.field("format", format.value()); - } - TextTemplate color = null; - if (randomBoolean()) { - color = new TextTemplate(randomFrom(HipChatMessage.Color.values()).value()); - builder.field("color", color); - } - Boolean notify = null; - if (randomBoolean()) { - notify = randomBoolean(); - builder.field("notify", notify); - } - builder.endObject(); - HttpProxy proxy = null; - if (randomBoolean()) { - proxy = new HttpProxy("localhost", 8080); - builder.startObject("proxy").field("host", "localhost").field("port", 8080).endObject(); - } - builder.endObject(); - - BytesReference bytes = BytesReference.bytes(builder); - logger.info("hipchat action json [{}]", bytes.utf8ToString()); - XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); - parser.nextToken(); - - HipChatAction action = HipChatAction.parse("_watch", "_action", parser); - - assertThat(action, notNullValue()); - assertThat(action.account, is(accountName)); - assertThat(action.proxy, is(proxy)); - assertThat(action.message, notNullValue()); - assertThat(action.message, is(new HipChatMessage.Template(body, rooms, users, from, format, color, notify))); - } - - public void testParserSelfGenerated() throws Exception { - String accountName = randomAlphaOfLength(10); - TextTemplate body = new TextTemplate("_body"); - HipChatMessage.Template.Builder templateBuilder = new HipChatMessage.Template.Builder(body); - - XContentBuilder builder = jsonBuilder().startObject(); - builder.field("account", accountName); - - HttpProxy proxy = null; - if (randomBoolean()) { - proxy = new HttpProxy("localhost", 8080); - builder.startObject("proxy").field("host", "localhost").field("port", 8080).endObject(); - } - - builder.startObject("message"); - builder.field("body", body); - - if (randomBoolean()) { - TextTemplate r1 = new TextTemplate("_r1"); - TextTemplate r2 = new TextTemplate("_r2"); - templateBuilder.addRooms(r1, r2); - builder.array("room", r1, r2); - } - if (randomBoolean()) { - TextTemplate u1 = new TextTemplate("_u1"); - TextTemplate u2 = new TextTemplate("_u2"); - templateBuilder.addUsers(u1, u2); - builder.array("user", u1, u2); - } - if (randomBoolean()) { - String from = randomAlphaOfLength(10); - templateBuilder.setFrom(from); - builder.field("from", from); - } - if (randomBoolean()) { - HipChatMessage.Format format = randomFrom(HipChatMessage.Format.values()); - templateBuilder.setFormat(format); - builder.field("format", format.value()); - } - if (randomBoolean()) { - TextTemplate color = new TextTemplate(randomFrom(HipChatMessage.Color.values()).value()); - templateBuilder.setColor(color); - builder.field("color", color); - } - if (randomBoolean()) { - boolean notify = randomBoolean(); - templateBuilder.setNotify(notify); - builder.field("notify", notify); - } - - builder.endObject(); - builder.endObject(); - - HipChatMessage.Template template = templateBuilder.build(); - - HipChatAction action = new HipChatAction(accountName, template, proxy); - - XContentBuilder jsonBuilder = jsonBuilder(); - action.toXContent(jsonBuilder, ToXContent.EMPTY_PARAMS); - BytesReference bytes = BytesReference.bytes(builder); - logger.info("{}", bytes.utf8ToString()); - XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); - parser.nextToken(); - - HipChatAction parsedAction = HipChatAction.parse("_watch", "_action", parser); - - assertThat(parsedAction, notNullValue()); - assertThat(parsedAction, is(action)); - } - - public void testParserInvalid() throws Exception { - XContentBuilder builder = jsonBuilder().startObject().field("unknown_field", "value").endObject(); - XContentParser parser = createParser(builder); - parser.nextToken(); - try { - HipChatAction.parse("_watch", "_action", parser); - fail("Expected ElasticsearchParseException"); - } catch (ElasticsearchParseException e) { - assertThat(e.getMessage(), is("failed to parse [hipchat] action [_watch/_action]. unexpected token [VALUE_STRING]")); - } - } - - // ensure that toXContent can be serialized and read again - private void assertValidToXContent(Action.Result result) throws IOException { - try (XContentBuilder builder = jsonBuilder()) { - builder.startObject(); - result.toXContent(builder, ToXContent.EMPTY_PARAMS); - builder.endObject(); - Strings.toString(builder); - try (XContentParser parser = XContentType.JSON.xContent() - .createParser(NamedXContentRegistry.EMPTY, LoggingDeprecationHandler.INSTANCE, Strings.toString(builder))) { - parser.map(); - } - } - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccountsTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccountsTests.java deleted file mode 100644 index 3057d935d71..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatAccountsTests.java +++ /dev/null @@ -1,63 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.elasticsearch.common.settings.ClusterSettings; -import org.elasticsearch.common.settings.MockSecureSettings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.junit.Before; -import org.mockito.ArgumentCaptor; - -import java.util.HashSet; - -import static org.hamcrest.Matchers.is; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class HipChatAccountsTests extends ESTestCase { - private HttpClient httpClient; - - @Before - public void init() throws Exception { - httpClient = mock(HttpClient.class); - } - - public void testProxy() throws Exception { - Settings.Builder builder = Settings.builder() - .put("xpack.notification.hipchat.default_account", "account1"); - addAccountSettings("account1", builder); - HipChatService service = new HipChatService(builder.build(), httpClient, new ClusterSettings(Settings.EMPTY, - new HashSet<>(HipChatService.getSettings()))); - HipChatAccount account = service.getAccount("account1"); - - HipChatMessage hipChatMessage = new HipChatMessage("body", new String[]{"rooms"}, null, "from", null, null, null); - - ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(HttpRequest.class); - when(httpClient.execute(argumentCaptor.capture())).thenReturn(new HttpResponse(200)); - - HttpProxy proxy = new HttpProxy("localhost", 8080); - account.send(hipChatMessage, proxy); - - HttpRequest request = argumentCaptor.getValue(); - assertThat(request.proxy(), is(proxy)); - } - - private void addAccountSettings(String name, Settings.Builder builder) { - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString("xpack.notification.hipchat.account." + name + ".secure_auth_token", randomAlphaOfLength(50)); - HipChatAccount.Profile profile = randomFrom(HipChatAccount.Profile.values()); - builder.put("xpack.notification.hipchat.account." + name + ".profile", profile.value()); - builder.setSecureSettings(secureSettings); - if (profile == HipChatAccount.Profile.INTEGRATION) { - builder.put("xpack.notification.hipchat.account." + name + ".room", randomAlphaOfLength(10)); - } - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessageTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessageTests.java deleted file mode 100644 index 96890e5629a..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatMessageTests.java +++ /dev/null @@ -1,325 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.xcontent.DeprecationHandler; -import org.elasticsearch.common.xcontent.NamedXContentRegistry; -import org.elasticsearch.common.xcontent.ToXContent; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.json.JsonXContent; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.core.watcher.support.xcontent.WatcherParams; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.text.TextTemplate; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.Matchers.arrayContaining; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.notNullValue; - -public class HipChatMessageTests extends ESTestCase { - - public void testToXContent() throws Exception { - String message = randomAlphaOfLength(10); - String[] rooms = generateRandomStringArray(3, 10, true); - String[] users = generateRandomStringArray(3, 10, true); - String from = randomBoolean() ? null : randomAlphaOfLength(10); - HipChatMessage.Format format = rarely() ? null : randomFrom(HipChatMessage.Format.values()); - HipChatMessage.Color color = rarely() ? null : randomFrom(HipChatMessage.Color.values()); - Boolean notify = rarely() ? null : randomBoolean(); - HipChatMessage msg = new HipChatMessage(message, rooms, users, from, format, color, notify); - - XContentBuilder builder = jsonBuilder(); - boolean includeTarget = randomBoolean(); - if (includeTarget && randomBoolean()) { - msg.toXContent(builder, ToXContent.EMPTY_PARAMS); - } else { - msg.toXContent(builder, ToXContent.EMPTY_PARAMS, includeTarget); - } - BytesReference bytes = BytesReference.bytes(builder); - - XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); - parser.nextToken(); - - assertThat(parser.currentToken(), is(XContentParser.Token.START_OBJECT)); - - message = null; - rooms = null; - users = null; - from = null; - format = null; - color = null; - notify = null; - XContentParser.Token token = null; - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if ("body".equals(currentFieldName)) { - message = parser.text(); - } else if ("room".equals(currentFieldName)) { - rooms = parser.list().stream().map(Object::toString).toArray(String[]::new); - } else if ("user".equals(currentFieldName)) { - users = parser.list().stream().map(Object::toString).toArray(String[]::new); - } else if ("from".equals(currentFieldName)) { - from = parser.text(); - } else if ("format".equals(currentFieldName)) { - format = HipChatMessage.Format.parse(parser); - } else if ("color".equals(currentFieldName)) { - color = HipChatMessage.Color.parse(parser); - } else if ("notify".equals(currentFieldName)) { - notify = parser.booleanValue(); - } else { - fail("unexpected xcontent field [" + currentFieldName + "] in hipchat message"); - } - } - - assertThat(message, notNullValue()); - assertThat(message, is(msg.body)); - if (includeTarget) { - if (msg.rooms == null || msg.rooms.length == 0) { - assertThat(rooms, nullValue()); - } else { - assertThat(rooms, arrayContaining(msg.rooms)); - } - if (msg.users == null || msg.users.length == 0) { - assertThat(users, nullValue()); - } else { - assertThat(users, arrayContaining(msg.users)); - } - } - assertThat(from, is(msg.from)); - assertThat(format, is(msg.format)); - assertThat(color, is(msg.color)); - assertThat(notify, is(msg.notify)); - } - - public void testEquals() throws Exception { - String message = randomAlphaOfLength(10); - String[] rooms = generateRandomStringArray(3, 10, true); - String[] users = generateRandomStringArray(3, 10, true); - String from = randomBoolean() ? null : randomAlphaOfLength(10); - HipChatMessage.Format format = rarely() ? null : randomFrom(HipChatMessage.Format.values()); - HipChatMessage.Color color = rarely() ? null : randomFrom(HipChatMessage.Color.values()); - Boolean notify = rarely() ? null : randomBoolean(); - HipChatMessage msg1 = new HipChatMessage(message, rooms, users, from, format, color, notify); - - boolean equals = randomBoolean(); - if (!equals) { - equals = true; - if (rarely()) { - equals = false; - message = "another message"; - } - if (rarely()) { - equals = false; - rooms = rooms == null ? new String[] { "roomX" } : randomBoolean() ? null : new String[] { "roomX" , "roomY"}; - } - if (rarely()) { - equals = false; - users = users == null ? new String[] { "userX" } : randomBoolean() ? null : new String[] { "userX", "userY" }; - } - if (rarely()) { - equals = false; - from = from == null ? "fromX" : randomBoolean() ? null : "fromY"; - } - if (rarely()) { - equals = false; - format = format == null ? - randomFrom(HipChatMessage.Format.values()) : - randomBoolean() ? - null : - randomFromWithExcludes(HipChatMessage.Format.values(), format); - } - if (rarely()) { - equals = false; - color = color == null ? - randomFrom(HipChatMessage.Color.values()) : - randomBoolean() ? - null : - randomFromWithExcludes(HipChatMessage.Color.values(), color); - } - if (rarely()) { - equals = false; - notify = notify == null ? (Boolean) randomBoolean() : randomBoolean() ? null : !notify; - } - } - - HipChatMessage msg2 = new HipChatMessage(message, rooms, users, from, format, color, notify); - assertThat(msg1.equals(msg2), is(equals)); - } - - public void testTemplateParse() throws Exception { - XContentBuilder jsonBuilder = jsonBuilder(); - jsonBuilder.startObject(); - - TextTemplate body = new TextTemplate(randomAlphaOfLength(200)); - jsonBuilder.field("body", body, ToXContent.EMPTY_PARAMS); - TextTemplate[] rooms = null; - if (randomBoolean()) { - jsonBuilder.startArray("room"); - rooms = new TextTemplate[randomIntBetween(1, 3)]; - for (int i = 0; i < rooms.length; i++) { - rooms[i] = new TextTemplate(randomAlphaOfLength(10)); - rooms[i].toXContent(jsonBuilder, ToXContent.EMPTY_PARAMS); - } - jsonBuilder.endArray(); - } - TextTemplate[] users = null; - if (randomBoolean()) { - jsonBuilder.startArray("user"); - users = new TextTemplate[randomIntBetween(1, 3)]; - for (int i = 0; i < users.length; i++) { - users[i] = new TextTemplate(randomAlphaOfLength(10)); - users[i].toXContent(jsonBuilder, ToXContent.EMPTY_PARAMS); - } - jsonBuilder.endArray(); - } - String from = null; - if (randomBoolean()) { - from = randomAlphaOfLength(10); - jsonBuilder.field("from", from); - } - TextTemplate color = null; - if (randomBoolean()) { - color = new TextTemplate(randomAlphaOfLength(10)); - jsonBuilder.field("color", color, ToXContent.EMPTY_PARAMS); - } - HipChatMessage.Format format = null; - if (randomBoolean()) { - format = randomFrom(HipChatMessage.Format.values()); - jsonBuilder.field("format", format.value()); - } - Boolean notify = null; - if (randomBoolean()) { - notify = randomBoolean(); - jsonBuilder.field("notify", notify); - } - - BytesReference bytes = BytesReference.bytes(jsonBuilder.endObject()); - XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); - parser.nextToken(); - - HipChatMessage.Template template = HipChatMessage.Template.parse(parser); - - assertThat(template, notNullValue()); - assertThat(template.body, is(body)); - if (rooms == null) { - assertThat(template.rooms, nullValue()); - } else { - assertThat(template.rooms, arrayContaining(rooms)); - } - if (users == null) { - assertThat(template.users, nullValue()); - } else { - assertThat(template.users, arrayContaining(users)); - } - assertThat(template.from, is(from)); - assertThat(template.color, is(color)); - assertThat(template.format, is(format)); - assertThat(template.notify, is(notify)); - } - - public void testTemplateParseSelfGenerated() throws Exception { - TextTemplate body = new TextTemplate(randomAlphaOfLength(10)); - HipChatMessage.Template.Builder templateBuilder = new HipChatMessage.Template.Builder(body); - - if (randomBoolean()) { - int count = randomIntBetween(1, 3); - for (int i = 0; i < count; i++) { - templateBuilder.addRooms(new TextTemplate(randomAlphaOfLength(10))); - } - } - if (randomBoolean()) { - int count = randomIntBetween(1, 3); - for (int i = 0; i < count; i++) { - templateBuilder.addUsers(new TextTemplate(randomAlphaOfLength(10))); - } - } - if (randomBoolean()) { - templateBuilder.setFrom(randomAlphaOfLength(10)); - } - if (randomBoolean()) { - templateBuilder.setColor(new TextTemplate(randomAlphaOfLength(5))); - } - if (randomBoolean()) { - templateBuilder.setFormat(randomFrom(HipChatMessage.Format.values())); - } - if (randomBoolean()) { - templateBuilder.setNotify(randomBoolean()); - } - HipChatMessage.Template template = templateBuilder.build(); - - XContentBuilder jsonBuilder = jsonBuilder(); - template.toXContent(jsonBuilder, ToXContent.EMPTY_PARAMS); - BytesReference bytes = BytesReference.bytes(jsonBuilder); - - XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); - parser.nextToken(); - - HipChatMessage.Template parsed = HipChatMessage.Template.parse(parser); - - assertThat(parsed, equalTo(template)); - } - - public void testAuthTokenParamIsFiltered() throws Exception { - HttpResponse response = new HttpResponse(500); - String token = randomAlphaOfLength(20); - HttpRequest request = HttpRequest.builder("localhost", 1234).setParam("auth_token", token).build(); - - // String body, String[] rooms, String[] users, String from, Format format, Color color, Boolean notify - HipChatMessage hipChatMessage = new HipChatMessage("body", new String[]{"room"}, null, "from", - HipChatMessage.Format.TEXT, HipChatMessage.Color.RED, false); - SentMessages.SentMessage sentMessage = SentMessages.SentMessage.responded("targetName", SentMessages.SentMessage.TargetType.ROOM, - hipChatMessage, request, response); - - - try (XContentBuilder builder = jsonBuilder()) { - WatcherParams params = WatcherParams.builder().hideSecrets(false).build(); - sentMessage.toXContent(builder, params); - assertThat(Strings.toString(builder), containsString(token)); - - try (XContentParser parser = builder.contentType().xContent() - .createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, - Strings.toString(builder))) { - parser.map(); - } - } - try (XContentBuilder builder = jsonBuilder()) { - sentMessage.toXContent(builder, ToXContent.EMPTY_PARAMS); - assertThat(Strings.toString(builder), not(containsString(token))); - - try (XContentParser parser = builder.contentType().xContent() - .createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, - Strings.toString(builder))) { - parser.map(); - } - } - } - - static E randomFromWithExcludes(E[] values, E... exclude) { - List excludes = Arrays.asList(exclude); - List includes = new ArrayList<>(); - for (E value : values) { - if (!excludes.contains(value)) { - includes.add(value); - } - } - return randomFrom(includes); - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServiceTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServiceTests.java deleted file mode 100644 index a10a102e414..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/HipChatServiceTests.java +++ /dev/null @@ -1,279 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.elasticsearch.common.settings.ClusterSettings; -import org.elasticsearch.common.settings.MockSecureSettings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.junit.Before; - -import java.util.HashSet; - -import static org.hamcrest.Matchers.arrayContaining; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.Matchers.sameInstance; -import static org.mockito.Mockito.mock; - -public class HipChatServiceTests extends ESTestCase { - private HttpClient httpClient; - - @Before - public void init() throws Exception { - httpClient = mock(HttpClient.class); - } - - public void testSingleAccountV1() throws Exception { - String accountName = randomAlphaOfLength(10); - String host = randomBoolean() ? null : "_host"; - int port = randomBoolean() ? -1 : randomIntBetween(300, 400); - String defaultRoom = randomBoolean() ? null : "_r1, _r2"; - String defaultFrom = randomBoolean() ? null : "_from"; - HipChatMessage.Color defaultColor = randomBoolean() ? null : randomFrom(HipChatMessage.Color.values()); - HipChatMessage.Format defaultFormat = randomBoolean() ? null : randomFrom(HipChatMessage.Format.values()); - Boolean defaultNotify = randomBoolean() ? null : (Boolean) randomBoolean(); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString("xpack.notification.hipchat.account." + accountName + ".secure_auth_token", "_token"); - Settings.Builder settingsBuilder = Settings.builder() - .put("xpack.notification.hipchat.account." + accountName + ".profile", HipChatAccount.Profile.V1.value()) - .setSecureSettings(secureSettings); - if (host != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + accountName + ".host", host); - } - if (port > 0) { - settingsBuilder.put("xpack.notification.hipchat.account." + accountName + ".port", port); - } - buildMessageDefaults(accountName, settingsBuilder, defaultRoom, null, defaultFrom, defaultColor, defaultFormat, defaultNotify); - HipChatService service = new HipChatService(settingsBuilder.build(), httpClient, - new ClusterSettings(settingsBuilder.build(), new HashSet<>(HipChatService.getSettings()))); - - HipChatAccount account = service.getAccount(accountName); - assertThat(account, notNullValue()); - assertThat(account.name, is(accountName)); - assertThat(account.authToken, is("_token")); - assertThat(account.profile, is(HipChatAccount.Profile.V1)); - assertThat(account.httpClient, is(httpClient)); - assertThat(account.server, notNullValue()); - assertThat(account.server.host(), is(host != null ? host : HipChatServer.DEFAULT.host())); - assertThat(account.server.port(), is(port > 0 ? port : HipChatServer.DEFAULT.port())); - assertThat(account, instanceOf(V1Account.class)); - if (defaultRoom == null) { - assertThat(((V1Account) account).defaults.rooms, nullValue()); - } else { - assertThat(((V1Account) account).defaults.rooms, arrayContaining("_r1", "_r2")); - } - assertThat(((V1Account) account).defaults.from, is(defaultFrom)); - assertThat(((V1Account) account).defaults.color, is(defaultColor)); - assertThat(((V1Account) account).defaults.format, is(defaultFormat)); - assertThat(((V1Account) account).defaults.notify, is(defaultNotify)); - - // with a single account defined, making sure that that account is set to the default one. - assertThat(service.getAccount(null), sameInstance(account)); - } - - public void testSingleAccountIntegration() throws Exception { - String accountName = randomAlphaOfLength(10); - String host = randomBoolean() ? null : "_host"; - int port = randomBoolean() ? -1 : randomIntBetween(300, 400); - String room = randomAlphaOfLength(10); - String defaultFrom = randomBoolean() ? null : "_from"; - HipChatMessage.Color defaultColor = randomBoolean() ? null : randomFrom(HipChatMessage.Color.values()); - HipChatMessage.Format defaultFormat = randomBoolean() ? null : randomFrom(HipChatMessage.Format.values()); - Boolean defaultNotify = randomBoolean() ? null : (Boolean) randomBoolean(); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString("xpack.notification.hipchat.account." + accountName + ".secure_auth_token", "_token"); - Settings.Builder settingsBuilder = Settings.builder() - .put("xpack.notification.hipchat.account." + accountName + ".profile", - HipChatAccount.Profile.INTEGRATION.value()) - .setSecureSettings(secureSettings) - .put("xpack.notification.hipchat.account." + accountName + ".room", room); - if (host != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + accountName + ".host", host); - } - if (port > 0) { - settingsBuilder.put("xpack.notification.hipchat.account." + accountName + ".port", port); - } - buildMessageDefaults(accountName, settingsBuilder, null, null, defaultFrom, defaultColor, defaultFormat, defaultNotify); - HipChatService service = new HipChatService(settingsBuilder.build(), httpClient, - new ClusterSettings(settingsBuilder.build(), new HashSet<>(HipChatService.getSettings()))); - - HipChatAccount account = service.getAccount(accountName); - assertThat(account, notNullValue()); - assertThat(account.name, is(accountName)); - assertThat(account.authToken, is("_token")); - assertThat(account.profile, is(HipChatAccount.Profile.INTEGRATION)); - assertThat(account.httpClient, is(httpClient)); - assertThat(account.server, notNullValue()); - assertThat(account.server.host(), is(host != null ? host : HipChatServer.DEFAULT.host())); - assertThat(account.server.port(), is(port > 0 ? port : HipChatServer.DEFAULT.port())); - assertThat(account, instanceOf(IntegrationAccount.class)); - assertThat(((IntegrationAccount) account).room, is(room)); - assertThat(((IntegrationAccount) account).defaults.color, is(defaultColor)); - assertThat(((IntegrationAccount) account).defaults.format, is(defaultFormat)); - assertThat(((IntegrationAccount) account).defaults.notify, is(defaultNotify)); - - // with a single account defined, making sure that that account is set to the default one. - assertThat(service.getAccount(null), sameInstance(account)); - } - - public void testSingleAccountIntegrationNoRoomSetting() throws Exception { - String accountName = randomAlphaOfLength(10); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString("xpack.notification.hipchat.account." + accountName + ".secure_auth_token", "_token"); - Settings.Builder settingsBuilder = Settings.builder() - .put("xpack.notification.hipchat.account." + accountName + ".profile", - HipChatAccount.Profile.INTEGRATION.value()) - .setSecureSettings(secureSettings); - SettingsException e = expectThrows(SettingsException.class, () -> - new HipChatService(settingsBuilder.build(), httpClient, - new ClusterSettings(settingsBuilder.build(), new HashSet<>(HipChatService.getSettings()))).getAccount(null)); - assertThat(e.getMessage(), containsString("missing required [room] setting for [integration] account profile")); - } - - public void testSingleAccountUser() throws Exception { - String accountName = randomAlphaOfLength(10); - String host = randomBoolean() ? null : "_host"; - int port = randomBoolean() ? -1 : randomIntBetween(300, 400); - String defaultRoom = randomBoolean() ? null : "_r1, _r2"; - String defaultUser = randomBoolean() ? null : "_u1, _u2"; - HipChatMessage.Color defaultColor = randomBoolean() ? null : randomFrom(HipChatMessage.Color.values()); - HipChatMessage.Format defaultFormat = randomBoolean() ? null : randomFrom(HipChatMessage.Format.values()); - Boolean defaultNotify = randomBoolean() ? null : (Boolean) randomBoolean(); - - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString("xpack.notification.hipchat.account." + accountName + ".secure_auth_token", "_token"); - Settings.Builder settingsBuilder = Settings.builder() - .put("xpack.notification.hipchat.account." + accountName + ".profile", HipChatAccount.Profile.USER.value()) - .setSecureSettings(secureSettings); - if (host != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + accountName + ".host", host); - } - if (port > 0) { - settingsBuilder.put("xpack.notification.hipchat.account." + accountName + ".port", port); - } - buildMessageDefaults(accountName, settingsBuilder, defaultRoom, defaultUser, null, defaultColor, defaultFormat, defaultNotify); - HipChatService service = new HipChatService(settingsBuilder.build(), httpClient, - new ClusterSettings(settingsBuilder.build(), new HashSet<>(HipChatService.getSettings()))); - - HipChatAccount account = service.getAccount(accountName); - assertThat(account, notNullValue()); - assertThat(account.name, is(accountName)); - assertThat(account.authToken, is("_token")); - assertThat(account.profile, is(HipChatAccount.Profile.USER)); - assertThat(account.httpClient, is(httpClient)); - assertThat(account.server, notNullValue()); - assertThat(account.server.host(), is(host != null ? host : HipChatServer.DEFAULT.host())); - assertThat(account.server.port(), is(port > 0 ? port : HipChatServer.DEFAULT.port())); - assertThat(account, instanceOf(UserAccount.class)); - if (defaultRoom == null) { - assertThat(((UserAccount) account).defaults.rooms, nullValue()); - } else { - assertThat(((UserAccount) account).defaults.rooms, arrayContaining("_r1", "_r2")); - } - if (defaultUser == null) { - assertThat(((UserAccount) account).defaults.users, nullValue()); - } else { - assertThat(((UserAccount) account).defaults.users, arrayContaining("_u1", "_u2")); - } - assertThat(((UserAccount) account).defaults.color, is(defaultColor)); - assertThat(((UserAccount) account).defaults.format, is(defaultFormat)); - assertThat(((UserAccount) account).defaults.notify, is(defaultNotify)); - - // with a single account defined, making sure that that account is set to the default one. - assertThat(service.getAccount(null), sameInstance(account)); - } - - public void testMultipleAccounts() throws Exception { - HipChatMessage.Color defaultColor = randomBoolean() ? null : randomFrom(HipChatMessage.Color.values()); - HipChatMessage.Format defaultFormat = randomBoolean() ? null : randomFrom(HipChatMessage.Format.values()); - Boolean defaultNotify = randomBoolean() ? null : (Boolean) randomBoolean(); - Settings.Builder settingsBuilder = Settings.builder(); - String defaultAccount = "_a" + randomIntBetween(0, 4); - settingsBuilder.put("xpack.notification.hipchat.default_account", defaultAccount); - final MockSecureSettings secureSettings = new MockSecureSettings(); - settingsBuilder.setSecureSettings(secureSettings); - - final boolean customGlobalServer = randomBoolean(); - if (customGlobalServer) { - settingsBuilder.put("xpack.notification.hipchat.host", "_host_global"); - settingsBuilder.put("xpack.notification.hipchat.port", 299); - } - - for (int i = 0; i < 5; i++) { - String name = "_a" + i; - String prefix = "xpack.notification.hipchat.account." + name; - HipChatAccount.Profile profile = randomFrom(HipChatAccount.Profile.values()); - settingsBuilder.put(prefix + ".profile", profile); - secureSettings.setString(prefix + ".secure_auth_token", "_token" + i); - if (profile == HipChatAccount.Profile.INTEGRATION) { - settingsBuilder.put(prefix + ".room", "_room" + i); - } - if (i % 2 == 0) { - settingsBuilder.put(prefix + ".host", "_host" + i); - settingsBuilder.put(prefix + ".port", 300 + i); - } - buildMessageDefaults(name, settingsBuilder, null, null, null, defaultColor, defaultFormat, defaultNotify); - } - - HipChatService service = new HipChatService(settingsBuilder.build(), httpClient, - new ClusterSettings(settingsBuilder.build(), new HashSet<>(HipChatService.getSettings()))); - - for (int i = 0; i < 5; i++) { - String name = "_a" + i; - HipChatAccount account = service.getAccount(name); - assertThat(account, notNullValue()); - assertThat(account.name, is(name)); - assertThat(account.authToken, is("_token" + i)); - assertThat(account.profile, notNullValue()); - if (account.profile == HipChatAccount.Profile.INTEGRATION) { - assertThat(account, instanceOf(IntegrationAccount.class)); - assertThat(((IntegrationAccount) account).room, is("_room" + i)); - } - assertThat(account.httpClient, is(httpClient)); - assertThat(account.server, notNullValue()); - if (i % 2 == 0) { - assertThat(account.server.host(), is("_host" + i)); - assertThat(account.server.port(), is(300 + i)); - } else if (customGlobalServer) { - assertThat(account.server.host(), is("_host_global")); - assertThat(account.server.port(), is(299)); - } else { - assertThat(account.server.host(), is(HipChatServer.DEFAULT.host())); - assertThat(account.server.port(), is(HipChatServer.DEFAULT.port())); - } - } - - assertThat(service.getAccount(null), sameInstance(service.getAccount(defaultAccount))); - } - - private void buildMessageDefaults(String account, Settings.Builder settingsBuilder, String room, String user, String from, - HipChatMessage.Color color, HipChatMessage.Format format, Boolean notify) { - if (room != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + account + ".message_defaults.room", room); - } - if (user != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + account + ".message_defaults.user", user); - } - if (from != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + account + ".message_defaults.from", from); - } - if (color != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + account + ".message_defaults.color", color.value()); - } - if (format != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + account + ".message_defaults.format", format); - } - if (notify != null) { - settingsBuilder.put("xpack.notification.hipchat.account." + account + ".message_defaults.notify", notify); - } - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccountTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccountTests.java deleted file mode 100644 index df1f5d3f472..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/IntegrationAccountTests.java +++ /dev/null @@ -1,181 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.Logger; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.settings.MockSecureSettings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.common.xcontent.ToXContent; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpMethod; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.http.Scheme; - -import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class IntegrationAccountTests extends ESTestCase { - - public void testSettings() throws Exception { - String accountName = "_name"; - - Settings.Builder sb = Settings.builder(); - - String authToken = randomAlphaOfLength(50); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), authToken); - sb.setSecureSettings(secureSettings); - - String host = HipChatServer.DEFAULT.host(); - if (randomBoolean()) { - host = randomAlphaOfLength(10); - sb.put("host", host); - } - int port = HipChatServer.DEFAULT.port(); - if (randomBoolean()) { - port = randomIntBetween(300, 400); - sb.put("port", port); - } - - String room = randomAlphaOfLength(10); - sb.put(IntegrationAccount.ROOM_SETTING, room); - - HipChatMessage.Format defaultFormat = null; - if (randomBoolean()) { - defaultFormat = randomFrom(HipChatMessage.Format.values()); - sb.put(HipChatAccount.DEFAULT_FORMAT_SETTING, defaultFormat); - } - HipChatMessage.Color defaultColor = null; - if (randomBoolean()) { - defaultColor = randomFrom(HipChatMessage.Color.values()); - sb.put(HipChatAccount.DEFAULT_COLOR_SETTING, defaultColor); - } - Boolean defaultNotify = null; - if (randomBoolean()) { - defaultNotify = randomBoolean(); - sb.put(HipChatAccount.DEFAULT_NOTIFY_SETTING, defaultNotify); - } - Settings settings = sb.build(); - - IntegrationAccount account = new IntegrationAccount(accountName, settings, HipChatServer.DEFAULT, mock(HttpClient.class), - mock(Logger.class)); - - assertThat(account.profile, is(HipChatAccount.Profile.INTEGRATION)); - assertThat(account.name, equalTo(accountName)); - assertThat(account.server.host(), is(host)); - assertThat(account.server.port(), is(port)); - assertThat(account.authToken, is(authToken)); - assertThat(account.room, is(room)); - assertThat(account.defaults.format, is(defaultFormat)); - assertThat(account.defaults.color, is(defaultColor)); - assertThat(account.defaults.notify, is(defaultNotify)); - } - - public void testSettingsNoAuthToken() throws Exception { - Settings.Builder sb = Settings.builder(); - sb.put(IntegrationAccount.ROOM_SETTING, randomAlphaOfLength(10)); - try { - new IntegrationAccount("_name", sb.build(), HipChatServer.DEFAULT, mock(HttpClient.class), mock(Logger.class)); - fail("Expected SettingsException"); - } catch (SettingsException e) { - assertThat(e.getMessage(), is("hipchat account [_name] missing required [secure_auth_token] secure setting")); - } - } - - public void testSettingsWithoutRoom() throws Exception { - Settings.Builder sb = Settings.builder(); - String authToken = randomAlphaOfLength(50); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), authToken); - sb.setSecureSettings(secureSettings); - try { - new IntegrationAccount("_name", sb.build(), HipChatServer.DEFAULT, mock(HttpClient.class), mock(Logger.class)); - fail("Expected SettingsException"); - } catch (SettingsException e) { - assertThat(e.getMessage(), containsString("missing required [room] setting for [integration] account profile")); - } - } - - public void testSettingsWithoutMultipleRooms() throws Exception { - Settings.Builder sb = Settings.builder(); - String authToken = randomAlphaOfLength(50); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), authToken); - sb.setSecureSettings(secureSettings); - sb.put(IntegrationAccount.ROOM_SETTING, "_r1,_r2"); - try { - new IntegrationAccount("_name", sb.build(), HipChatServer.DEFAULT, mock(HttpClient.class), mock(Logger.class)); - fail("Expected SettingsException"); - } catch (SettingsException e) { - assertThat(e.getMessage(), containsString("[room] setting for [integration] account must only be set with a single value")); - } - } - - public void testSend() throws Exception { - String token = randomAlphaOfLength(10); - HttpClient httpClient = mock(HttpClient.class); - String room = "Room with Spaces"; - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), token); - IntegrationAccount account = new IntegrationAccount("_name", Settings.builder() - .put("host", "_host") - .put("port", "443") - .setSecureSettings(secureSettings) - .put("room", room) - .build(), HipChatServer.DEFAULT, httpClient, mock(Logger.class)); - - HipChatMessage.Format format = randomFrom(HipChatMessage.Format.values()); - HipChatMessage.Color color = randomFrom(HipChatMessage.Color.values()); - Boolean notify = randomBoolean(); - final HipChatMessage message = new HipChatMessage("_body", null, null, null, format, color, notify); - - HttpRequest req = HttpRequest.builder("_host", 443) - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - // url encoded already - .path("/v2/room/Room+with+Spaces/notification") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer " + token) - .body(Strings.toString((builder, params) -> { - builder.field("message", message.body); - if (message.format != null) { - builder.field("message_format", message.format.value()); - } - if (message.notify != null) { - builder.field("notify", message.notify); - } - if (message.color != null) { - builder.field("color", String.valueOf(message.color.value())); - } - return builder; - })) - .build(); - - HttpResponse res = mock(HttpResponse.class); - when(res.status()).thenReturn(200); - when(httpClient.execute(req)).thenReturn(res); - - SentMessages sentMessages = account.send(message, null); - verify(httpClient).execute(req); - assertThat(sentMessages.asList(), hasSize(1)); - try (XContentBuilder builder = jsonBuilder()) { - sentMessages.asList().get(0).toXContent(builder, ToXContent.EMPTY_PARAMS); - assertThat(Strings.toString(builder), not(containsString(token))); - } - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccountTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccountTests.java deleted file mode 100644 index 6893999776b..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/UserAccountTests.java +++ /dev/null @@ -1,313 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.Logger; -import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.settings.MockSecureSettings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpMethod; -import org.elasticsearch.xpack.watcher.common.http.HttpProxy; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.http.Scheme; -import org.elasticsearch.xpack.watcher.common.text.TextTemplate; -import org.elasticsearch.xpack.watcher.test.MockTextTemplateEngine; -import org.mockito.ArgumentCaptor; - -import java.util.HashMap; - -import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; -import static org.hamcrest.Matchers.arrayContaining; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class UserAccountTests extends ESTestCase { - - public void testSettings() throws Exception { - String accountName = "_name"; - - Settings.Builder sb = Settings.builder(); - - String authToken = randomAlphaOfLength(50); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(UserAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), authToken); - sb.setSecureSettings(secureSettings); - - String host = HipChatServer.DEFAULT.host(); - if (randomBoolean()) { - host = randomAlphaOfLength(10); - sb.put("host", host); - } - int port = HipChatServer.DEFAULT.port(); - if (randomBoolean()) { - port = randomIntBetween(300, 400); - sb.put("port", port); - } - - String[] defaultRooms = null; - if (randomBoolean()) { - defaultRooms = new String[] { "_r1", "_r2" }; - sb.put(HipChatAccount.DEFAULT_ROOM_SETTING, "_r1,_r2"); - } - String[] defaultUsers = null; - if (randomBoolean()) { - defaultUsers = new String[] { "_u1", "_u2" }; - sb.put(HipChatAccount.DEFAULT_USER_SETTING, "_u1,_u2"); - } - HipChatMessage.Format defaultFormat = null; - if (randomBoolean()) { - defaultFormat = randomFrom(HipChatMessage.Format.values()); - sb.put(HipChatAccount.DEFAULT_FORMAT_SETTING, defaultFormat); - } - HipChatMessage.Color defaultColor = null; - if (randomBoolean()) { - defaultColor = randomFrom(HipChatMessage.Color.values()); - sb.put(HipChatAccount.DEFAULT_COLOR_SETTING, defaultColor); - } - Boolean defaultNotify = null; - if (randomBoolean()) { - defaultNotify = randomBoolean(); - sb.put(HipChatAccount.DEFAULT_NOTIFY_SETTING, defaultNotify); - } - Settings settings = sb.build(); - - UserAccount account = new UserAccount(accountName, settings, HipChatServer.DEFAULT, mock(HttpClient.class), mock(Logger.class)); - - assertThat(account.profile, is(HipChatAccount.Profile.USER)); - assertThat(account.name, equalTo(accountName)); - assertThat(account.server.host(), is(host)); - assertThat(account.server.port(), is(port)); - assertThat(account.authToken, is(authToken)); - if (defaultRooms != null) { - assertThat(account.defaults.rooms, arrayContaining(defaultRooms)); - } else { - assertThat(account.defaults.rooms, nullValue()); - } - if (defaultUsers != null) { - assertThat(account.defaults.users, arrayContaining(defaultUsers)); - } else { - assertThat(account.defaults.users, nullValue()); - } - assertThat(account.defaults.format, is(defaultFormat)); - assertThat(account.defaults.color, is(defaultColor)); - assertThat(account.defaults.notify, is(defaultNotify)); - } - - public void testSettingsNoAuthToken() throws Exception { - Settings.Builder sb = Settings.builder(); - try { - new UserAccount("_name", sb.build(), HipChatServer.DEFAULT, mock(HttpClient.class), mock(Logger.class)); - fail("Expected SettingsException"); - } catch (SettingsException e) { - assertThat(e.getMessage(), is("hipchat account [_name] missing required [secure_auth_token] secure setting")); - } - } - - public void testSend() throws Exception { - HttpClient httpClient = mock(HttpClient.class); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), "_token"); - UserAccount account = new UserAccount("_name", Settings.builder() - .put("host", "_host") - .put("port", "443") - .setSecureSettings(secureSettings) - .build(), HipChatServer.DEFAULT, httpClient, mock(Logger.class)); - - HipChatMessage.Format format = randomFrom(HipChatMessage.Format.values()); - HipChatMessage.Color color = randomFrom(HipChatMessage.Color.values()); - Boolean notify = randomBoolean(); - final HipChatMessage message = new HipChatMessage("_body", new String[] { "_r1", "_r2" }, new String[] { "_u1", "_u2" }, null, - format, color, notify); - - HttpRequest reqR1 = HttpRequest.builder("_host", 443) - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v2/room/_r1/notification") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer _token") - .body(Strings.toString((builder, params) -> { - builder.field("message", message.body); - if (message.format != null) { - builder.field("message_format", message.format.value()); - } - if (message.notify != null) { - builder.field("notify", message.notify); - } - if (message.color != null) { - builder.field("color", String.valueOf(message.color.value())); - } - return builder; - })) - .build(); - - logger.info("expected (r1): {}", BytesReference.bytes(jsonBuilder().value(reqR1)).utf8ToString()); - - HttpResponse resR1 = mock(HttpResponse.class); - when(resR1.status()).thenReturn(200); - when(httpClient.execute(reqR1)).thenReturn(resR1); - - HttpRequest reqR2 = HttpRequest.builder("_host", 443) - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v2/room/_r2/notification") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer _token") - .body(Strings.toString((builder, params) -> { - builder.field("message", message.body); - if (message.format != null) { - builder.field("message_format", message.format.value()); - } - if (message.notify != null) { - builder.field("notify", message.notify); - } - if (message.color != null) { - builder.field("color", String.valueOf(message.color.value())); - } - return builder; - })) - .build(); - - logger.info("expected (r2): {}", BytesReference.bytes(jsonBuilder().value(reqR1)).utf8ToString()); - - HttpResponse resR2 = mock(HttpResponse.class); - when(resR2.status()).thenReturn(200); - when(httpClient.execute(reqR2)).thenReturn(resR2); - - HttpRequest reqU1 = HttpRequest.builder("_host", 443) - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v2/user/_u1/message") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer _token") - .body(Strings.toString((builder, params) -> { - builder.field("message", message.body); - if (message.format != null) { - builder.field("message_format", message.format.value()); - } - if (message.notify != null) { - builder.field("notify", message.notify); - } - return builder; - })) - .build(); - - logger.info("expected (u1): {}", BytesReference.bytes(jsonBuilder().value(reqU1)).utf8ToString()); - - HttpResponse resU1 = mock(HttpResponse.class); - when(resU1.status()).thenReturn(200); - when(httpClient.execute(reqU1)).thenReturn(resU1); - - HttpRequest reqU2 = HttpRequest.builder("_host", 443) - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v2/user/_u2/message") - .setHeader("Content-Type", "application/json") - .setHeader("Authorization", "Bearer _token") - .body(Strings.toString((builder, params) -> { - builder.field("message", message.body); - if (message.format != null) { - builder.field("message_format", message.format.value()); - } - if (message.notify != null) { - builder.field("notify", message.notify); - } - return builder; - })) - .build(); - - logger.info("expected (u2): {}", BytesReference.bytes(jsonBuilder().value(reqU2)).utf8ToString()); - - HttpResponse resU2 = mock(HttpResponse.class); - when(resU2.status()).thenReturn(200); - when(httpClient.execute(reqU2)).thenReturn(resU2); - - account.send(message, null); - - verify(httpClient).execute(reqR1); - verify(httpClient).execute(reqR2); - verify(httpClient).execute(reqU2); - verify(httpClient).execute(reqU2); - } - - public void testColorIsOptional() throws Exception { - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), "awesome-auth-token"); - Settings settings = Settings.builder() - .put("user", "testuser") - .setSecureSettings(secureSettings) - .build(); - UserAccount userAccount = createUserAccount(settings); - - TextTemplate body = new TextTemplate("body"); - TextTemplate[] rooms = new TextTemplate[] { new TextTemplate("room")}; - HipChatMessage.Template template = - new HipChatMessage.Template(body, rooms, null, "sender", HipChatMessage.Format.TEXT, null, true); - - HipChatMessage message = userAccount.render("watchId", "actionId", new MockTextTemplateEngine(), template, new HashMap<>()); - assertThat(message.color, is(nullValue())); - } - - public void testFormatIsOptional() throws Exception { - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), "awesome-auth-token"); - Settings settings = Settings.builder() - .put("user", "testuser") - .setSecureSettings(secureSettings) - .build(); - UserAccount userAccount = createUserAccount(settings); - - TextTemplate body = new TextTemplate("body"); - TextTemplate[] rooms = new TextTemplate[] { new TextTemplate("room") }; - HipChatMessage.Template template = new HipChatMessage.Template(body, rooms, null, "sender", null, - new TextTemplate("yellow"), true); - - HipChatMessage message = userAccount.render("watchId", "actionId", new MockTextTemplateEngine(), template, new HashMap<>()); - assertThat(message.format, is(nullValue())); - } - - public void testRoomNameIsUrlEncoded() throws Exception { - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), "awesome-auth-token"); - Settings settings = Settings.builder() - .put("user", "testuser") - .setSecureSettings(secureSettings) - .build(); - HipChatServer hipChatServer = mock(HipChatServer.class); - HttpClient httpClient = mock(HttpClient.class); - UserAccount account = new UserAccount("notify-monitoring", settings, hipChatServer, httpClient, logger); - - TextTemplate[] rooms = new TextTemplate[] { new TextTemplate("Room with Spaces")}; - HipChatMessage.Template template = - new HipChatMessage.Template(new TextTemplate("body"), rooms, null, "sender", HipChatMessage.Format.TEXT, null, true); - - HipChatMessage message = account.render("watchId", "actionId", new MockTextTemplateEngine(), template, new HashMap<>()); - account.send(message, HttpProxy.NO_PROXY); - - ArgumentCaptor captor = ArgumentCaptor.forClass(HttpRequest.class); - verify(httpClient).execute(captor.capture()); - assertThat(captor.getAllValues(), hasSize(1)); - assertThat(captor.getValue().path(), not(containsString("Room with Spaces"))); - assertThat(captor.getValue().path(), containsString("Room%20with%20Spaces")); - } - - private UserAccount createUserAccount(Settings settings) { - HipChatServer hipChatServer = mock(HipChatServer.class); - HttpClient httpClient = mock(HttpClient.class); - return new UserAccount("notify-monitoring", settings, hipChatServer, httpClient, logger); - } -} diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1AccountTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1AccountTests.java deleted file mode 100644 index 105965539f6..00000000000 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/notification/hipchat/V1AccountTests.java +++ /dev/null @@ -1,174 +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. - */ -package org.elasticsearch.xpack.watcher.notification.hipchat; - -import org.apache.logging.log4j.Logger; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.settings.MockSecureSettings; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.settings.SettingsException; -import org.elasticsearch.test.ESTestCase; -import org.elasticsearch.xpack.watcher.common.http.HttpClient; -import org.elasticsearch.xpack.watcher.common.http.HttpMethod; -import org.elasticsearch.xpack.watcher.common.http.HttpRequest; -import org.elasticsearch.xpack.watcher.common.http.HttpResponse; -import org.elasticsearch.xpack.watcher.common.http.Scheme; - -import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; -import static org.hamcrest.Matchers.arrayContaining; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class V1AccountTests extends ESTestCase { - public void testSettings() throws Exception { - String accountName = "_name"; - - Settings.Builder sb = Settings.builder(); - - String authToken = randomAlphaOfLength(50); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(V1Account.SECURE_AUTH_TOKEN_SETTING.getKey(), authToken); - sb.setSecureSettings(secureSettings); - - String host = HipChatServer.DEFAULT.host(); - if (randomBoolean()) { - host = randomAlphaOfLength(10); - sb.put("host", host); - } - int port = HipChatServer.DEFAULT.port(); - if (randomBoolean()) { - port = randomIntBetween(300, 400); - sb.put("port", port); - } - - String[] defaultRooms = null; - if (randomBoolean()) { - defaultRooms = new String[] { "_r1", "_r2" }; - sb.put(HipChatAccount.DEFAULT_ROOM_SETTING, "_r1,_r2"); - } - String defaultFrom = null; - if (randomBoolean()) { - defaultFrom = randomAlphaOfLength(10); - sb.put(HipChatAccount.DEFAULT_FROM_SETTING, defaultFrom); - } - HipChatMessage.Format defaultFormat = null; - if (randomBoolean()) { - defaultFormat = randomFrom(HipChatMessage.Format.values()); - sb.put(HipChatAccount.DEFAULT_FORMAT_SETTING, defaultFormat); - } - HipChatMessage.Color defaultColor = null; - if (randomBoolean()) { - defaultColor = randomFrom(HipChatMessage.Color.values()); - sb.put(HipChatAccount.DEFAULT_COLOR_SETTING, defaultColor); - } - Boolean defaultNotify = null; - if (randomBoolean()) { - defaultNotify = randomBoolean(); - sb.put(HipChatAccount.DEFAULT_NOTIFY_SETTING, defaultNotify); - } - Settings settings = sb.build(); - - V1Account account = new V1Account(accountName, settings, HipChatServer.DEFAULT, mock(HttpClient.class), mock(Logger.class)); - - assertThat(account.profile, is(HipChatAccount.Profile.V1)); - assertThat(account.name, equalTo(accountName)); - assertThat(account.server.host(), is(host)); - assertThat(account.server.port(), is(port)); - assertThat(account.authToken, is(authToken)); - if (defaultRooms != null) { - assertThat(account.defaults.rooms, arrayContaining(defaultRooms)); - } else { - assertThat(account.defaults.rooms, nullValue()); - } - assertThat(account.defaults.from, is(defaultFrom)); - assertThat(account.defaults.format, is(defaultFormat)); - assertThat(account.defaults.color, is(defaultColor)); - assertThat(account.defaults.notify, is(defaultNotify)); - } - - public void testSettingsNoAuthToken() throws Exception { - Settings.Builder sb = Settings.builder(); - try { - new V1Account("_name", sb.build(), HipChatServer.DEFAULT, mock(HttpClient.class), mock(Logger.class)); - fail("Expected SettingsException"); - } catch (SettingsException e) { - assertThat(e.getMessage(), is("hipchat account [_name] missing required [secure_auth_token] secure setting")); - } - } - - public void testSend() throws Exception { - HttpClient httpClient = mock(HttpClient.class); - String authToken = randomAlphaOfLength(50); - final MockSecureSettings secureSettings = new MockSecureSettings(); - secureSettings.setString(IntegrationAccount.SECURE_AUTH_TOKEN_SETTING.getKey(), "_token"); - V1Account account = new V1Account("_name", Settings.builder() - .put("host", "_host") - .put("port", "443") - .setSecureSettings(secureSettings) - .build(), HipChatServer.DEFAULT, httpClient, mock(Logger.class)); - - HipChatMessage.Format format = randomFrom(HipChatMessage.Format.values()); - HipChatMessage.Color color = randomFrom(HipChatMessage.Color.values()); - Boolean notify = randomBoolean(); - HipChatMessage message = new HipChatMessage("_body", new String[] { "Room with Spaces", "_r2" }, null, "_from", format, - color, notify); - - HttpRequest req1 = HttpRequest.builder("_host", 443) - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v1/rooms/message") - .setHeader("Content-Type", "application/x-www-form-urlencoded") - .setParam("format", "json") - .setParam("auth_token", "_token") - .body(new StringBuilder() - .append("room_id=").append("Room+with+Spaces&") - .append("from=").append("_from&") - .append("message=").append("_body&") - .append("message_format=").append(format.value()).append("&") - .append("color=").append(color.value()).append("&") - .append("notify=").append(notify ? "1" : "0") - .toString()) - .build(); - - logger.info("expected (r1): {}", BytesReference.bytes(jsonBuilder().value(req1)).utf8ToString()); - - HttpResponse res1 = mock(HttpResponse.class); - when(res1.status()).thenReturn(200); - when(httpClient.execute(req1)).thenReturn(res1); - - HttpRequest req2 = HttpRequest.builder("_host", 443) - .method(HttpMethod.POST) - .scheme(Scheme.HTTPS) - .path("/v1/rooms/message") - .setHeader("Content-Type", "application/x-www-form-urlencoded") - .setParam("format", "json") - .setParam("auth_token", "_token") - .body(new StringBuilder() - .append("room_id=").append("_r2&") - .append("from=").append("_from&") - .append("message=").append("_body&") - .append("message_format=").append(format.value()).append("&") - .append("color=").append(color.value()).append("&") - .append("notify=").append(notify ? "1" : "0") - .toString()) - .build(); - - logger.info("expected (r2): {}", BytesReference.bytes(jsonBuilder().value(req2)).utf8ToString()); - - HttpResponse res2 = mock(HttpResponse.class); - when(res2.status()).thenReturn(200); - when(httpClient.execute(req2)).thenReturn(res2); - - account.send(message, null); - - verify(httpClient).execute(req1); - verify(httpClient).execute(req2); - } -} diff --git a/x-pack/qa/third-party/hipchat/build.gradle b/x-pack/qa/third-party/hipchat/build.gradle deleted file mode 100644 index f864fb62398..00000000000 --- a/x-pack/qa/third-party/hipchat/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -apply plugin: 'elasticsearch.standalone-rest-test' -apply plugin: 'elasticsearch.rest-test' - -dependencies { - testCompile "org.elasticsearch.plugin:x-pack-core:${version}" - testCompile project(path: xpackModule('watcher'), configuration: 'runtime') -} - -String integrationAccount = System.getenv('hipchat_auth_token_integration') -String userAccount = System.getenv('hipchat_auth_token_user') -String v1Account = System.getenv('hipchat_auth_token_v1') - -integTestCluster { - setting 'xpack.security.enabled', 'false' - setting 'xpack.monitoring.enabled', 'false' - setting 'xpack.ml.enabled', 'false' - setting 'xpack.license.self_generated.type', 'trial' - setting 'logger.org.elasticsearch.xpack.watcher', 'DEBUG' - setting 'xpack.notification.hipchat.account.integration_account.profile', 'integration' - setting 'xpack.notification.hipchat.account.integration_account.room', 'test-watcher' - setting 'xpack.notification.hipchat.account.user_account.profile', 'user' - setting 'xpack.notification.hipchat.account.v1_account.profile', 'v1' - keystoreSetting 'xpack.notification.hipchat.account.integration_account.secure_auth_token', integrationAccount - keystoreSetting 'xpack.notification.hipchat.account.user_account.secure_auth_token', userAccount - keystoreSetting 'xpack.notification.hipchat.account.v1_account.secure_auth_token', v1Account -} - -if (!integrationAccount && !userAccount && !v1Account) { - integTest.enabled = false - testingConventions.enabled = false -} diff --git a/x-pack/qa/third-party/hipchat/src/test/java/org/elasticsearch/smoketest/WatcherHipchatYamlTestSuiteIT.java b/x-pack/qa/third-party/hipchat/src/test/java/org/elasticsearch/smoketest/WatcherHipchatYamlTestSuiteIT.java deleted file mode 100644 index b5cb43ebc28..00000000000 --- a/x-pack/qa/third-party/hipchat/src/test/java/org/elasticsearch/smoketest/WatcherHipchatYamlTestSuiteIT.java +++ /dev/null @@ -1,75 +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. - */ -package org.elasticsearch.smoketest; - -import com.carrotsearch.randomizedtesting.annotations.Name; -import com.carrotsearch.randomizedtesting.annotations.ParametersFactory; -import org.elasticsearch.test.rest.yaml.ClientYamlTestCandidate; -import org.elasticsearch.test.rest.yaml.ClientYamlTestResponse; -import org.elasticsearch.test.rest.yaml.ESClientYamlSuiteTestCase; -import org.elasticsearch.xpack.core.watcher.support.WatcherIndexTemplateRegistryField; -import org.junit.After; -import org.junit.Before; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -import static java.util.Collections.emptyList; -import static java.util.Collections.emptyMap; -import static java.util.Collections.singletonMap; -import static org.hamcrest.Matchers.is; - -/** Runs rest tests against external cluster */ -public class WatcherHipchatYamlTestSuiteIT extends ESClientYamlSuiteTestCase { - - public WatcherHipchatYamlTestSuiteIT(@Name("yaml") ClientYamlTestCandidate testCandidate) { - super(testCandidate); - } - - @ParametersFactory - public static Iterable parameters() throws Exception { - return ESClientYamlSuiteTestCase.createParameters(); - } - - @Before - public void startWatcher() throws Exception { - final List watcherTemplates = Arrays.asList(WatcherIndexTemplateRegistryField.TEMPLATE_NAMES); - assertBusy(() -> { - try { - getAdminExecutionContext().callApi("watcher.start", emptyMap(), emptyList(), emptyMap()); - - for (String template : watcherTemplates) { - ClientYamlTestResponse templateExistsResponse = getAdminExecutionContext().callApi("indices.exists_template", - singletonMap("name", template), emptyList(), emptyMap()); - assertThat(templateExistsResponse.getStatusCode(), is(200)); - } - - ClientYamlTestResponse response = - getAdminExecutionContext().callApi("watcher.stats", emptyMap(), emptyList(), emptyMap()); - String state = (String) response.evaluate("stats.0.watcher_state"); - assertThat(state, is("started")); - } catch (IOException e) { - throw new AssertionError(e); - } - }); - } - - @After - public void stopWatcher() throws Exception { - assertBusy(() -> { - try { - getAdminExecutionContext().callApi("watcher.stop", emptyMap(), emptyList(), emptyMap()); - ClientYamlTestResponse response = - getAdminExecutionContext().callApi("watcher.stats", emptyMap(), emptyList(), emptyMap()); - String state = (String) response.evaluate("stats.0.watcher_state"); - assertThat(state, is("stopped")); - } catch (IOException e) { - throw new AssertionError(e); - } - }); - } -} diff --git a/x-pack/qa/third-party/hipchat/src/test/resources/rest-api-spec/test/hipchat/10_hipchat.yml b/x-pack/qa/third-party/hipchat/src/test/resources/rest-api-spec/test/hipchat/10_hipchat.yml deleted file mode 100644 index be4874b8d42..00000000000 --- a/x-pack/qa/third-party/hipchat/src/test/resources/rest-api-spec/test/hipchat/10_hipchat.yml +++ /dev/null @@ -1,279 +0,0 @@ ---- -"Test Hipchat v1 account Action": - - do: - cluster.health: - wait_for_status: yellow - - - do: - watcher.put_watch: - id: "hipchat_v1_watch" - body: > - { - "trigger": { - "schedule": { - "interval": "1d" - } - }, - "input": { - "simple": { - "foo": "something from input" - } - }, - "actions": { - "my_hipchat_action": { - "hipchat": { - "account": "v1_account", - "message": { - "from" : "watcher-tests", - "room" : ["test-watcher", "test-watcher-2", "test watcher with spaces"], - "body": "From input {{ctx.payload.foo}}, and some tests (facepalm) in the v1 account", - "format": "text", - "color": "red", - "notify": true - } - } - } - } - } - - - do: - watcher.execute_watch: - id: "hipchat_v1_watch" - body: > - { - "record_execution": true - } - - - match: { watch_record.trigger_event.type: "manual" } - - match: { watch_record.state: "executed" } - - match: { watch_record.result.actions.0.id: "my_hipchat_action" } - - match: { watch_record.result.actions.0.type: "hipchat" } - - match: { watch_record.result.actions.0.status: "success" } - - match: { watch_record.result.actions.0.hipchat.account: "v1_account" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.0.room: "test-watcher" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.1.room: "test-watcher-2" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.2.room: "test watcher with spaces" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.0.status: "success" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.1.status: "success" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.2.status: "success" } - - # Waits for the watcher history index to be available - - do: - cluster.health: - index: ".watcher-history-*" - wait_for_no_relocating_shards: true - timeout: 60s - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: ".watcher-history-*" - body: > - { - "query" : { - "term" : { - "watch_id" : "hipchat_v1_watch" - } - } - } - - - match: { hits.total: 1 } - - match: { hits.hits.0._source.state: "executed" } - - match: { hits.hits.0._source.result.actions.0.id: "my_hipchat_action" } - - match: { hits.hits.0._source.result.actions.0.type: "hipchat" } - - match: { hits.hits.0._source.result.actions.0.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.account: "v1_account" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.0.room: "test-watcher" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.1.room: "test-watcher-2" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.2.room: "test watcher with spaces" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.0.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.1.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.2.status: "success" } - ---- -"Test Hipchat integration account Action": - - do: - cluster.health: - wait_for_status: yellow - - # custom rooms, custom users and custom from are not allowed for this account type to be configured - - do: - watcher.put_watch: - id: "hipchat_integration_account_watch" - body: > - { - "trigger": { - "schedule": { - "interval": "1d" - } - }, - "input": { - "simple": { - "foo": "something from input" - } - }, - "actions": { - "my_hipchat_action": { - "hipchat": { - "account": "integration_account", - "message": { - "body": "From input {{ctx.payload.foo}}, and some tests (facepalm) in the integration account", - "format": "text", - "color": "red", - "notify": true - } - } - } - } - } - - - do: - watcher.execute_watch: - id: "hipchat_integration_account_watch" - body: > - { - "record_execution": true - } - - - match: { watch_record.trigger_event.type: "manual" } - - match: { watch_record.state: "executed" } - - match: { watch_record.result.actions.0.id: "my_hipchat_action" } - - match: { watch_record.result.actions.0.type: "hipchat" } - - match: { watch_record.result.actions.0.status: "success" } - - match: { watch_record.result.actions.0.hipchat.account: "integration_account" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.0.status: "success" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.0.room: "test-watcher" } - - # Waits for the watcher history index to be available - - do: - cluster.health: - index: ".watcher-history-*" - wait_for_no_relocating_shards: true - timeout: 60s - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: ".watcher-history-*" - body: > - { - "query" : { - "term" : { - "watch_id" : "hipchat_integration_account_watch" - } - } - } - - - match: { hits.total: 1 } - - match: { hits.hits.0._source.state: "executed" } - - match: { hits.hits.0._source.result.actions.0.id: "my_hipchat_action" } - - match: { hits.hits.0._source.result.actions.0.type: "hipchat" } - - match: { hits.hits.0._source.result.actions.0.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.account: "integration_account" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.0.room: "test-watcher" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.0.status: "success" } - ---- -"Test Hipchat user account Action": - - do: - cluster.health: - wait_for_status: yellow - - - do: - watcher.put_watch: - id: "hipchat_user_account_watch" - body: > - { - "trigger": { - "schedule": { - "interval": "1d" - } - }, - "input": { - "simple": { - "foo": "something from input" - } - }, - "actions": { - "my_hipchat_action": { - "hipchat": { - "account": "user_account", - "message": { - "user" : [ "watcher@elastic.co" ], - "room" : ["test-watcher", "test-watcher-2", "test watcher with spaces"], - "body": "From input {{ctx.payload.foo}}, and some tests (facepalm) in the user_account test. bold", - "format": "html" - } - } - } - } - } - - - do: - watcher.execute_watch: - id: "hipchat_user_account_watch" - body: > - { - "record_execution": true - } - - - match: { watch_record.trigger_event.type: "manual" } - - match: { watch_record.state: "executed" } - - match: { watch_record.result.actions.0.id: "my_hipchat_action" } - - match: { watch_record.result.actions.0.type: "hipchat" } - - match: { watch_record.result.actions.0.status: "success" } - - match: { watch_record.result.actions.0.hipchat.account: "user_account" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.0.room: "test-watcher" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.1.room: "test-watcher-2" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.2.room: "test watcher with spaces" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.3.user: "watcher@elastic.co" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.0.status: "success" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.1.status: "success" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.2.status: "success" } - - match: { watch_record.result.actions.0.hipchat.sent_messages.3.status: "success" } - - # Waits for the watcher history index to be available - - do: - cluster.health: - index: ".watcher-history-*" - wait_for_no_relocating_shards: true - timeout: 60s - - - do: - indices.refresh: {} - - - do: - search: - rest_total_hits_as_int: true - index: ".watcher-history-*" - body: > - { - "query" : { - "term" : { - "watch_id" : "hipchat_user_account_watch" - } - } - } - - - match: { hits.total: 1 } - - match: { hits.hits.0._source.state: "executed" } - - match: { hits.hits.0._source.result.actions.0.id: "my_hipchat_action" } - - match: { hits.hits.0._source.result.actions.0.type: "hipchat" } - - match: { hits.hits.0._source.result.actions.0.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.account: "user_account" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.0.room: "test-watcher" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.1.room: "test-watcher-2" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.2.room: "test watcher with spaces" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.3.user: "watcher@elastic.co" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.0.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.1.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.2.status: "success" } - - match: { hits.hits.0._source.result.actions.0.hipchat.sent_messages.1.status: "success" } - -