{"action":"created","comment":{"url":"https://api.github.com/repos/hawkular/hawkular/pulls/comments/30874584","id":30874584,"diff_hunk":"@@ -16,114 +16,189 @@\n  */\n package org.hawkular.component.pinger;\n \n-import org.hawkular.metrics.client.common.SingleMetric;\n-\n-import javax.annotation.PostConstruct;\n-import javax.ejb.EJB;\n-import javax.ejb.Lock;\n-import javax.ejb.LockType;\n-import javax.ejb.Schedule;\n-import javax.ejb.Singleton;\n-import javax.ejb.Startup;\n-import javax.ws.rs.client.Client;\n-import javax.ws.rs.client.ClientBuilder;\n-import javax.ws.rs.client.WebTarget;\n-import javax.ws.rs.core.Response;\n import java.util.ArrayList;\n+import java.util.Collections;\n import java.util.HashMap;\n import java.util.HashSet;\n import java.util.Iterator;\n import java.util.List;\n import java.util.Map;\n import java.util.Set;\n+import java.util.UUID;\n import java.util.concurrent.ExecutionException;\n import java.util.concurrent.Future;\n \n+import javax.annotation.PostConstruct;\n+import javax.ejb.EJB;\n+import javax.ejb.Lock;\n+import javax.ejb.LockType;\n+import javax.ejb.Schedule;\n+import javax.ejb.Singleton;\n+import javax.ejb.Startup;\n+import javax.inject.Inject;\n+\n+import org.hawkular.inventory.api.Action;\n+import org.hawkular.inventory.api.EntityAlreadyExistsException;\n+import org.hawkular.inventory.api.Interest;\n+import org.hawkular.inventory.api.Inventory;\n+import org.hawkular.inventory.api.Tenants.Single;\n+import org.hawkular.inventory.api.filters.With;\n+import org.hawkular.inventory.api.model.Environment;\n+import org.hawkular.inventory.api.model.Resource;\n+import org.hawkular.inventory.api.model.ResourceType;\n+import org.hawkular.inventory.api.model.Tenant;\n+import org.hawkular.inventory.cdi.Observable;\n+\n+import rx.functions.Action1;\n+\n /**\n  * A SLSB that coordinates the pinging of resources\n  *\n  * @author Heiko W. Rupp\n+ * @author <a href=\"https://github.com/ppalaga\">Peter Palaga</a>\n  */\n @Startup\n @Singleton\n public class PingManager {\n+\n+    /**\n+     * Collects new URLs reported by {@link PingManager#inventory} and synchronizes the various threads reporting the\n+     * new URLs and those ones consuming them.\n+     *\n+     * @author <a href=\"https://github.com/ppalaga\">Peter Palaga</a>\n+     */\n+    static class NewUrlsCollector implements Action1<Resource> {\n+        private List<PingDestination> newUrls = new ArrayList<>();\n+\n+        /**\n+         * A callback for the {@link Inventory} that collects newly added URLs. It is safe to call this method\n+         * concurrently from any random thread.\n+         *\n+         * @see rx.functions.Action1#call(java.lang.Object)\n+         */\n+        @Override\n+        public void call(Resource r) {\n+            if (PingDestination.isUrl(r)) {\n+                synchronized (this) {\n+                    newUrls.add(PingDestination.from(r));\n+                }\n+            }\n+        }\n+\n+        /**\n+         * Returns the list of {@link PingDestination}s collected by this {@link NewUrlsCollector}. It is safe to call\n+         * this method concurrently from any random thread.\n+         *\n+         * @return the list of {@link PingDestination}s\n+         */\n+        public List<PingDestination> getNewUrls() {\n+            synchronized (this) {\n+                if (this.newUrls.isEmpty()) {\n+                    return Collections.emptyList();\n+                } else {\n+                    List<PingDestination> result = this.newUrls;\n+                    this.newUrls = new ArrayList<>();\n+                    return result;\n+                }\n+            }\n+        }\n+    }\n+\n     /** How many rounds a WAIT_MILLIS do we wait for results to come in? */\n     private static final int ROUNDS = 15;\n     /** How long do we wait between each round in milliseconds */\n     private static final int WAIT_MILLIS = 500;\n-    /** Rough timeout in milliseconds for the pings afher which the pings are cancelled and reported as timeouted.\n-     * Note that in practice, the real time given to pings can be longer. */\n+    /**\n+     * Rough timeout in milliseconds for the pings after which the pings are cancelled and reported as timeouted. Note\n+     * that in practice, the real time given to pings can be longer.\n+     */\n     private static final int TIMEOUT_MILLIS = ROUNDS * WAIT_MILLIS;\n \n-    private final String tenantId = \"test\";\n-\n     @EJB\n-    public Pinger pinger;\n+    Pinger pinger;\n \n-    Set<PingDestination> destinations = new HashSet<>();\n+    private final Set<PingDestination> destinations = new HashSet<>();\n \n     @EJB\n-    public MetricPublisher metricPublisher;\n+    MetricPublisher metricPublisher;\n+\n+    @EJB\n+    TraitsPublisher traitsPublisher;\n+\n+    @Inject\n+    @Observable\n+    private Inventory.Mixin.Observable inventory;\n+\n+    final NewUrlsCollector newUrlsCollector = new NewUrlsCollector();\n \n-    private final PingerConfiguration configuration = PingerConfiguration.defaults();\n+    private void addUrl(String tenantId, String envId, String url) {\n+        Log.LOG.infof(\"Putting url to inventory: %s\", url);\n+\n+        Single tenant = null;\n+        try {\n+            tenant = inventory.tenants().create(Tenant.Blueprint.builder().withId(tenantId).build());\n+        } catch (EntityAlreadyExistsException e) {\n+            tenant = inventory.tenants().get(tenantId);\n+        }\n+        try {\n+            tenant.resourceTypes().create(ResourceType.Blueprint.builder().withId(\"URL\").withVersion(\"1\").build());\n+        } catch (EntityAlreadyExistsException e) {\n+        }\n+        org.hawkular.inventory.api.Environments.Single env = null;\n+        try {\n+            env = tenant.environments().create(\n+            Environment.Blueprint.builder().withId(envId).build());\n+        } catch (EntityAlreadyExistsException e) {\n+            env = tenant.environments().get(envId);\n+        }\n+        env.feedlessResources().create(\n+                Resource.Blueprint.builder().withId(UUID.randomUUID().toString()).withResourceType(\"URL\")\n+                        .withProperty(\"url\", url).build());\n+\n+    }\n \n     @PostConstruct\n     public void startUp() {\n-        int attempts = 0;\n-        while (attempts++ < 10) {\n-            try {\n-                Client client = ClientBuilder.newClient();\n-                final String inventoryUrl = configuration.getInventoryBaseUri();\n-                WebTarget target = client.target(inventoryUrl +\"/\"+ tenantId + \"/resourceTypes/URL/resources\");\n-                Response response = target.request().get();\n-\n-                if (isResponseOk(response.getStatus())) {\n-                    List<?> list = response.readEntity(List.class);\n-                    if (list.isEmpty()) {\n-                    } else {\n-                        for (Object o : list) {\n-                            if (o instanceof Map) {\n-                                Map<?, ?> m = (Map<?, ?>) o;\n-                                String id = (String) m.get(\"id\");\n-                                @SuppressWarnings(\"unchecked\")\n-                                Map<String, String> params = (Map<String, String>) m.get(\"properties\");\n-                                String url = params.get(\"url\");\n-                                String method = params.get(\"method\");\n-                                destinations.add(new PingDestination(id, url, method));\n-                            }\n-                        }\n-                    }\n-                    response.close();\n-                    client.close();\n-                    return;\n-                } else {\n-                    Log.LOG.wNoInventoryFound(response.getStatus(), response.getStatusInfo().getReasonPhrase());\n-                }\n-            } catch (Exception e) {\n-                Log.LOG.wNoInventoryFound(-1, \"Exception while trying to reach or read response of inventory: \"\n-                        + e.getMessage());\n-            }\n \n-            try {\n-                Thread.sleep(2000);\n-            } catch (InterruptedException e) {\n-                Thread.currentThread().interrupt();\n-                return;\n-            }\n+        /*\n+         * Add the observer before reading the existing URLs from the inventory so that we do not loose the URLs that\n+         * could have been added between those two calls.\n+         */\n+        inventory.observable(Interest.in(Resource.class).being(Action.created())).subscribe(newUrlsCollector);\n+\n+        Set<Resource> urls = inventory.tenants().getAll().resourceTypes().getAll(With.id(PingDestination.URL_TYPE))","path":"modules/pinger/src/main/java/org/hawkular/component/pinger/PingManager.java","position":215,"original_position":215,"commit_id":"2c422054a9eabc0e67ee4793ead28f26708f29d7","original_commit_id":"2c422054a9eabc0e67ee4793ead28f26708f29d7","user":{"login":"metlos","id":19999,"avatar_url":"https://avatars.githubusercontent.com/u/19999?v=3","gravatar_id":"","url":"https://api.github.com/users/metlos","html_url":"https://github.com/metlos","followers_url":"https://api.github.com/users/metlos/followers","following_url":"https://api.github.com/users/metlos/following{/other_user}","gists_url":"https://api.github.com/users/metlos/gists{/gist_id}","starred_url":"https://api.github.com/users/metlos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/metlos/subscriptions","organizations_url":"https://api.github.com/users/metlos/orgs","repos_url":"https://api.github.com/users/metlos/repos","events_url":"https://api.github.com/users/metlos/events{/privacy}","received_events_url":"https://api.github.com/users/metlos/received_events","type":"User","site_admin":false},"body":"Nope, this is a straight API call with no remote communication.","created_at":"2015-05-22T07:35:42Z","updated_at":"2015-05-22T07:35:42Z","html_url":"https://github.com/hawkular/hawkular/pull/113#discussion_r30874584","pull_request_url":"https://api.github.com/repos/hawkular/hawkular/pulls/113","_links":{"self":{"href":"https://api.github.com/repos/hawkular/hawkular/pulls/comments/30874584"},"html":{"href":"https://github.com/hawkular/hawkular/pull/113#discussion_r30874584"},"pull_request":{"href":"https://api.github.com/repos/hawkular/hawkular/pulls/113"}}},"pull_request":{"url":"https://api.github.com/repos/hawkular/hawkular/pulls/113","id":35951319,"html_url":"https://github.com/hawkular/hawkular/pull/113","diff_url":"https://github.com/hawkular/hawkular/pull/113.diff","patch_url":"https://github.com/hawkular/hawkular/pull/113.patch","issue_url":"https://api.github.com/repos/hawkular/hawkular/issues/113","number":113,"state":"open","locked":false,"title":"HAWKULAR-173 Collect traits from a URL","user":{"login":"ppalaga","id":1826249,"avatar_url":"https://avatars.githubusercontent.com/u/1826249?v=3","gravatar_id":"","url":"https://api.github.com/users/ppalaga","html_url":"https://github.com/ppalaga","followers_url":"https://api.github.com/users/ppalaga/followers","following_url":"https://api.github.com/users/ppalaga/following{/other_user}","gists_url":"https://api.github.com/users/ppalaga/gists{/gist_id}","starred_url":"https://api.github.com/users/ppalaga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ppalaga/subscriptions","organizations_url":"https://api.github.com/users/ppalaga/orgs","repos_url":"https://api.github.com/users/ppalaga/repos","events_url":"https://api.github.com/users/ppalaga/events{/privacy}","received_events_url":"https://api.github.com/users/ppalaga/received_events","type":"User","site_admin":false},"body":null,"created_at":"2015-05-21T16:18:46Z","updated_at":"2015-05-22T07:35:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a22ca5c97b0a7ba34c87d2dc6914fc7e37cfa142","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/hawkular/hawkular/pulls/113/commits","review_comments_url":"https://api.github.com/repos/hawkular/hawkular/pulls/113/comments","review_comment_url":"https://api.github.com/repos/hawkular/hawkular/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hawkular/hawkular/issues/113/comments","statuses_url":"https://api.github.com/repos/hawkular/hawkular/statuses/2c422054a9eabc0e67ee4793ead28f26708f29d7","head":{"label":"ppalaga:HAWKULAR-173","ref":"HAWKULAR-173","sha":"2c422054a9eabc0e67ee4793ead28f26708f29d7","user":{"login":"ppalaga","id":1826249,"avatar_url":"https://avatars.githubusercontent.com/u/1826249?v=3","gravatar_id":"","url":"https://api.github.com/users/ppalaga","html_url":"https://github.com/ppalaga","followers_url":"https://api.github.com/users/ppalaga/followers","following_url":"https://api.github.com/users/ppalaga/following{/other_user}","gists_url":"https://api.github.com/users/ppalaga/gists{/gist_id}","starred_url":"https://api.github.com/users/ppalaga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ppalaga/subscriptions","organizations_url":"https://api.github.com/users/ppalaga/orgs","repos_url":"https://api.github.com/users/ppalaga/repos","events_url":"https://api.github.com/users/ppalaga/events{/privacy}","received_events_url":"https://api.github.com/users/ppalaga/received_events","type":"User","site_admin":false},"repo":{"id":29863909,"name":"hawkular","full_name":"ppalaga/hawkular","owner":{"login":"ppalaga","id":1826249,"avatar_url":"https://avatars.githubusercontent.com/u/1826249?v=3","gravatar_id":"","url":"https://api.github.com/users/ppalaga","html_url":"https://github.com/ppalaga","followers_url":"https://api.github.com/users/ppalaga/followers","following_url":"https://api.github.com/users/ppalaga/following{/other_user}","gists_url":"https://api.github.com/users/ppalaga/gists{/gist_id}","starred_url":"https://api.github.com/users/ppalaga/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ppalaga/subscriptions","organizations_url":"https://api.github.com/users/ppalaga/orgs","repos_url":"https://api.github.com/users/ppalaga/repos","events_url":"https://api.github.com/users/ppalaga/events{/privacy}","received_events_url":"https://api.github.com/users/ppalaga/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ppalaga/hawkular","description":"The Hawkular integration project","fork":true,"url":"https://api.github.com/repos/ppalaga/hawkular","forks_url":"https://api.github.com/repos/ppalaga/hawkular/forks","keys_url":"https://api.github.com/repos/ppalaga/hawkular/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ppalaga/hawkular/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ppalaga/hawkular/teams","hooks_url":"https://api.github.com/repos/ppalaga/hawkular/hooks","issue_events_url":"https://api.github.com/repos/ppalaga/hawkular/issues/events{/number}","events_url":"https://api.github.com/repos/ppalaga/hawkular/events","assignees_url":"https://api.github.com/repos/ppalaga/hawkular/assignees{/user}","branches_url":"https://api.github.com/repos/ppalaga/hawkular/branches{/branch}","tags_url":"https://api.github.com/repos/ppalaga/hawkular/tags","blobs_url":"https://api.github.com/repos/ppalaga/hawkular/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ppalaga/hawkular/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ppalaga/hawkular/git/refs{/sha}","trees_url":"https://api.github.com/repos/ppalaga/hawkular/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ppalaga/hawkular/statuses/{sha}","languages_url":"https://api.github.com/repos/ppalaga/hawkular/languages","stargazers_url":"https://api.github.com/repos/ppalaga/hawkular/stargazers","contributors_url":"https://api.github.com/repos/ppalaga/hawkular/contributors","subscribers_url":"https://api.github.com/repos/ppalaga/hawkular/subscribers","subscription_url":"https://api.github.com/repos/ppalaga/hawkular/subscription","commits_url":"https://api.github.com/repos/ppalaga/hawkular/commits{/sha}","git_commits_url":"https://api.github.com/repos/ppalaga/hawkular/git/commits{/sha}","comments_url":"https://api.github.com/repos/ppalaga/hawkular/comments{/number}","issue_comment_url":"https://api.github.com/repos/ppalaga/hawkular/issues/comments{/number}","contents_url":"https://api.github.com/repos/ppalaga/hawkular/contents/{+path}","compare_url":"https://api.github.com/repos/ppalaga/hawkular/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ppalaga/hawkular/merges","archive_url":"https://api.github.com/repos/ppalaga/hawkular/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ppalaga/hawkular/downloads","issues_url":"https://api.github.com/repos/ppalaga/hawkular/issues{/number}","pulls_url":"https://api.github.com/repos/ppalaga/hawkular/pulls{/number}","milestones_url":"https://api.github.com/repos/ppalaga/hawkular/milestones{/number}","notifications_url":"https://api.github.com/repos/ppalaga/hawkular/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ppalaga/hawkular/labels{/name}","releases_url":"https://api.github.com/repos/ppalaga/hawkular/releases{/id}","created_at":"2015-01-26T14:15:06Z","updated_at":"2015-01-24T12:13:40Z","pushed_at":"2015-05-21T17:11:03Z","git_url":"git://github.com/ppalaga/hawkular.git","ssh_url":"git@github.com:ppalaga/hawkular.git","clone_url":"https://github.com/ppalaga/hawkular.git","svn_url":"https://github.com/ppalaga/hawkular","homepage":null,"size":822,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"hawkular:master","ref":"master","sha":"cbccf999ffb631e965f9bad9a6cb1ee4f4769b04","user":{"login":"hawkular","id":10179627,"avatar_url":"https://avatars.githubusercontent.com/u/10179627?v=3","gravatar_id":"","url":"https://api.github.com/users/hawkular","html_url":"https://github.com/hawkular","followers_url":"https://api.github.com/users/hawkular/followers","following_url":"https://api.github.com/users/hawkular/following{/other_user}","gists_url":"https://api.github.com/users/hawkular/gists{/gist_id}","starred_url":"https://api.github.com/users/hawkular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hawkular/subscriptions","organizations_url":"https://api.github.com/users/hawkular/orgs","repos_url":"https://api.github.com/users/hawkular/repos","events_url":"https://api.github.com/users/hawkular/events{/privacy}","received_events_url":"https://api.github.com/users/hawkular/received_events","type":"Organization","site_admin":false},"repo":{"id":29146289,"name":"hawkular","full_name":"hawkular/hawkular","owner":{"login":"hawkular","id":10179627,"avatar_url":"https://avatars.githubusercontent.com/u/10179627?v=3","gravatar_id":"","url":"https://api.github.com/users/hawkular","html_url":"https://github.com/hawkular","followers_url":"https://api.github.com/users/hawkular/followers","following_url":"https://api.github.com/users/hawkular/following{/other_user}","gists_url":"https://api.github.com/users/hawkular/gists{/gist_id}","starred_url":"https://api.github.com/users/hawkular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hawkular/subscriptions","organizations_url":"https://api.github.com/users/hawkular/orgs","repos_url":"https://api.github.com/users/hawkular/repos","events_url":"https://api.github.com/users/hawkular/events{/privacy}","received_events_url":"https://api.github.com/users/hawkular/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hawkular/hawkular","description":"The Hawkular integration project","fork":false,"url":"https://api.github.com/repos/hawkular/hawkular","forks_url":"https://api.github.com/repos/hawkular/hawkular/forks","keys_url":"https://api.github.com/repos/hawkular/hawkular/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hawkular/hawkular/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hawkular/hawkular/teams","hooks_url":"https://api.github.com/repos/hawkular/hawkular/hooks","issue_events_url":"https://api.github.com/repos/hawkular/hawkular/issues/events{/number}","events_url":"https://api.github.com/repos/hawkular/hawkular/events","assignees_url":"https://api.github.com/repos/hawkular/hawkular/assignees{/user}","branches_url":"https://api.github.com/repos/hawkular/hawkular/branches{/branch}","tags_url":"https://api.github.com/repos/hawkular/hawkular/tags","blobs_url":"https://api.github.com/repos/hawkular/hawkular/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hawkular/hawkular/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hawkular/hawkular/git/refs{/sha}","trees_url":"https://api.github.com/repos/hawkular/hawkular/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hawkular/hawkular/statuses/{sha}","languages_url":"https://api.github.com/repos/hawkular/hawkular/languages","stargazers_url":"https://api.github.com/repos/hawkular/hawkular/stargazers","contributors_url":"https://api.github.com/repos/hawkular/hawkular/contributors","subscribers_url":"https://api.github.com/repos/hawkular/hawkular/subscribers","subscription_url":"https://api.github.com/repos/hawkular/hawkular/subscription","commits_url":"https://api.github.com/repos/hawkular/hawkular/commits{/sha}","git_commits_url":"https://api.github.com/repos/hawkular/hawkular/git/commits{/sha}","comments_url":"https://api.github.com/repos/hawkular/hawkular/comments{/number}","issue_comment_url":"https://api.github.com/repos/hawkular/hawkular/issues/comments{/number}","contents_url":"https://api.github.com/repos/hawkular/hawkular/contents/{+path}","compare_url":"https://api.github.com/repos/hawkular/hawkular/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hawkular/hawkular/merges","archive_url":"https://api.github.com/repos/hawkular/hawkular/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hawkular/hawkular/downloads","issues_url":"https://api.github.com/repos/hawkular/hawkular/issues{/number}","pulls_url":"https://api.github.com/repos/hawkular/hawkular/pulls{/number}","milestones_url":"https://api.github.com/repos/hawkular/hawkular/milestones{/number}","notifications_url":"https://api.github.com/repos/hawkular/hawkular/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hawkular/hawkular/labels{/name}","releases_url":"https://api.github.com/repos/hawkular/hawkular/releases{/id}","created_at":"2015-01-12T17:01:45Z","updated_at":"2015-05-15T16:31:09Z","pushed_at":"2015-05-21T21:21:39Z","git_url":"git://github.com/hawkular/hawkular.git","ssh_url":"git@github.com:hawkular/hawkular.git","clone_url":"https://github.com/hawkular/hawkular.git","svn_url":"https://github.com/hawkular/hawkular","homepage":null,"size":2562,"stargazers_count":8,"watchers_count":8,"language":"TypeScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":19,"mirror_url":null,"open_issues_count":3,"forks":19,"open_issues":3,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/hawkular/hawkular/pulls/113"},"html":{"href":"https://github.com/hawkular/hawkular/pull/113"},"issue":{"href":"https://api.github.com/repos/hawkular/hawkular/issues/113"},"comments":{"href":"https://api.github.com/repos/hawkular/hawkular/issues/113/comments"},"review_comments":{"href":"https://api.github.com/repos/hawkular/hawkular/pulls/113/comments"},"review_comment":{"href":"https://api.github.com/repos/hawkular/hawkular/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hawkular/hawkular/pulls/113/commits"},"statuses":{"href":"https://api.github.com/repos/hawkular/hawkular/statuses/2c422054a9eabc0e67ee4793ead28f26708f29d7"}}}}