Received: from maia.hub.org (maia-2.hub.org [200.46.204.251]) by mail.postgresql.org (Postfix) with ESMTP id 8DB346328D4 for ; Wed, 14 Jul 2010 09:20:01 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.251]) (amavisd-maia, port 10024) with ESMTP id 92531-01 for ; Wed, 14 Jul 2010 12:19:52 +0000 (UTC) X-Greylist: delayed 00:14:15.860313 by SQLgrey-1.7.6 Received: from mail-gw0-f46.google.com (mail-gw0-f46.google.com [74.125.83.46]) by mail.postgresql.org (Postfix) with ESMTP id 51EB263282B for ; Wed, 14 Jul 2010 09:19:53 -0300 (ADT) Received: by gwj18 with SMTP id 18so3292711gwj.19 for ; Wed, 14 Jul 2010 05:19:52 -0700 (PDT) MIME-Version: 1.0 Received: by 10.151.33.9 with SMTP id l9mr4160644ybj.383.1279108691150; Wed, 14 Jul 2010 04:58:11 -0700 (PDT) Received: by 10.220.162.78 with HTTP; Wed, 14 Jul 2010 04:58:10 -0700 (PDT) Date: Wed, 14 Jul 2010 21:58:10 +1000 Message-ID: Subject: Question on COUNT performance From: =?ISO-8859-1?Q?Anders_=D8stergaard_Jensen?= To: pgsql-sql@postgresql.org Content-Type: multipart/alternative; boundary=000e0cd72b262a47d4048b57b3ed X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0.801 tagged_above=-5 required=5 tests=BAYES_50=0.8, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001 X-Spam-Level: X-Archive-Number: 201007/61 X-Sequence-Number: 34374 --000e0cd72b262a47d4048b57b3ed Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hello mailing list, I have a performance problem with my postgres 8.4.4 database. The query is the following: SELECT count(*) AS count_all FROM "plan_events" WHERE (f_plan_event_acl(17, plan_events.id)) QUERY PLAN ---------------------------------------------------------------------------= --------------------------------------------- Aggregate (cost=3D2859.77..2859.78 rows=3D1 width=3D0) (actual time=3D4641.720..4641.720 rows=3D1 loops=3D1) -> Seq Scan on plan_events (cost=3D0.00..2851.44 rows=3D3331 width=3D0= ) (actual time=3D32.821..4640.116 rows=3D2669 loops=3D1) Filter: f_plan_event_acl(17, id) Total runtime: 4641.753 ms (4 rows) What can I do to improve the performance? The table has around 3000+ rows, so the data size is really limited. The table has the following definition: ----- metabase=3D# \d plan_events; Table "public.plan_events" Column | Type | Modifiers ------------------+--------------------------+-----------------------------= -------------------------------------- id | integer | not null default nextval(('"plan_event_id_seq"'::text)::regclass) description | text | not null status | text | not null pct_completed | integer | default 0 due | timestamp with time zone | not null due_to | timestamp with time zone | not null priority | integer | not null default 1 created | timestamp with time zone | not null user_id_created | integer | not null plan_type_id | integer | not null finished | boolean | not null default false duration | double precision | not null default 0.0 search_idx | tsvector | org_id | integer | not null default 1 personal_user_id | integer | place | text | contact_log_id | integer | Indexes: "plan_events_pkey" PRIMARY KEY, btree (id) "plan_event_contact_log_idx" btree (contact_log_id) "plan_event_search_idx" gin (search_idx) "plan_events_created_idx" btree (created) "plan_events_due_idx" btree (due) "plan_events_org_idx" btree (org_id) "plan_events_personal_user_idx" btree (personal_user_id) "plan_events_plan_type_id_idx" btree (plan_type_id) "plan_events_user_id_created_idx" btree (user_id_created) Foreign-key constraints: "plan_events_contact_log_id_fkey" FOREIGN KEY (contact_log_id) REFERENCES contact_logs(id) "plan_events_org_id_fkey" FOREIGN KEY (org_id) REFERENCES orgs(id) "plan_events_personal_user_id_fkey" FOREIGN KEY (personal_user_id) REFERENCES users(id) "plan_events_plan_type_id_fkey" FOREIGN KEY (plan_type_id) REFERENCES plan_types(id) "plan_events_user_id_created_fkey" FOREIGN KEY (user_id_created) REFERENCES users(id) Referenced by: TABLE "contact_plan_events" CONSTRAINT "contact_plan_events_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCES plan_events(id) TABLE "custom_values" CONSTRAINT "custom_values_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCES plan_events(id) TABLE "customer_plan_events" CONSTRAINT "customer_plan_events_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCES plan_events(id) TABLE "generic_comments" CONSTRAINT "generic_comments_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCE= S plan_events(id) TABLE "mail_queue_items" CONSTRAINT "mail_queue_items_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCE= S plan_events(id) TABLE "plan_event_notifications" CONSTRAINT "plan_event_notifications_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCES plan_events(id) TABLE "project_plan_events" CONSTRAINT "project_plan_events_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCES plan_events(id) TABLE "to_do_list_events" CONSTRAINT "to_do_list_events_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCES plan_events(id) TABLE "user_plan_events" CONSTRAINT "user_plan_events_plan_event_id_fkey" FOREIGN KEY (plan_event_id) REFERENCE= S plan_events(id) Triggers: plan_events_update BEFORE INSERT OR UPDATE ON plan_events FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('search_idx', 'pg_catalog.danish'= , 'description', 'status') ------ And the f_plan_event function has the following definition: metabase=3D# \df+ f_plan_event_acl List o= f functions Schema | Name | Result data type | Argument data types | Type | Volatility | Owner | Language | Source code | Description --------+------------------+------------------+----------------------------= --+--------+------------+----------+----------+----------------------------= ---------------------------------------------------------------------------= ----------------------------------------------------------------------+----= --------- public | f_plan_event_acl | boolean | uid integer, plan_id intege= r | normal | volatile | postgres | plpgsql | | : declare : user record; : customer record; : project record; : pcount_rel record; : ccount_rel record; : begin : select into user * from users where id =3D uid; : select into pcount_re= l COUNT(*) as acl_count FROM project_plan_events ppe WHERE ppe.plan_event_id = =3D plan_id; : if (pcount_rel.acl_count > 0) then : SELECT INTO project * FROM projects WHERE id IN (SELECT project_id FROM project_plan_events ppe2 WHERE ppe2.plan_event_id =3D plan_id) OFFSET 0 LIM= IT 1; : return f_project_acl(uid, project.id); : end if; : select into ccount_re= l COUNT(*) as acl_count FROM customer_plan_events cpe WHERE cpe.plan_event_id =3D plan_id; : if (ccount_rel.acl_count > 0) then : select into customer * from customers where id in (select customer_id from customer_plan_events cpe2 where cpe2.plan_event_id =3D plan_id) offset 0 li= mit 1; : return f_customer_acl(uid, customer.id); : end if; : return true; : end; : --=20 Best Regards, Anders =D8stergaard Jensen, B.Sc. Technical Director & Managing Partner Meeho! ApS Meeho! Australia 5/28 Onslow Ave Elizabeth Bay 2011 NSW E-mail: aj@itersys.dk / aj@meeho.dk Phone: +61 406 880 313 Web (Intl): http://www.meeho.net/ Web (DK): http:/www.meeho.dk/ --000e0cd72b262a47d4048b57b3ed Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: base64 SGVsbG8gbWFpbGluZyBsaXN0LKA8ZGl2Pjxicj48L2Rpdj48ZGl2PkkgaGF2ZSBhIHBlcmZvcm1h bmNlIHByb2JsZW0gd2l0aCBteSBwb3N0Z3JlcyA4LjQuNCBkYXRhYmFzZS4gVGhlIHF1ZXJ5IGlz IHRoZSBmb2xsb3dpbmc6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48c3BhbiBjbGFzcz0iQXBw bGUtc3R5bGUtc3BhbiIgc3R5bGU9ImZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsgZm9u dC1zaXplOiAxM3B4OyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyAtd2Via2l0LWJvcmRlci1o b3Jpem9udGFsLXNwYWNpbmc6IDJweDsgLXdlYmtpdC1ib3JkZXItdmVydGljYWwtc3BhY2luZzog MnB4OyAiPlNFTEVDVCBjb3VudCgqKSBBUyBjb3VudF9hbGwgRlJPTSAmcXVvdDtwbGFuX2V2ZW50 cyZxdW90OyBXSEVSRSAoZl9wbGFuX2V2ZW50X2FjbCgxNywgPGEgaHJlZj0iaHR0cDovL3BsYW5f ZXZlbnRzLmlkIj5wbGFuX2V2ZW50cy5pZDwvYT4pKSCgoDwvc3Bhbj48L2Rpdj4KPGRpdj48Zm9u dCBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPjxzcGFu IGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBz ZTsgLXdlYmtpdC1ib3JkZXItaG9yaXpvbnRhbC1zcGFjaW5nOiAycHg7IC13ZWJraXQtYm9yZGVy LXZlcnRpY2FsLXNwYWNpbmc6IDJweDsiPjxicj48L3NwYW4+PC9mb250PjwvZGl2Pgo8ZGl2Pjxm b250IGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+PHNw YW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxh cHNlOyAtd2Via2l0LWJvcmRlci1ob3Jpem9udGFsLXNwYWNpbmc6IDJweDsgLXdlYmtpdC1ib3Jk ZXItdmVydGljYWwtc3BhY2luZzogMnB4OyI+PGRpdj6goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgUVVFUlkgUExBTiCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoKA8L2Rpdj4KPGRpdj4tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08 L2Rpdj48ZGl2PqBBZ2dyZWdhdGUgoChjb3N0PTI4NTkuNzcuLjI4NTkuNzggcm93cz0xIHdpZHRo PTApIChhY3R1YWwgdGltZT00NjQxLjcyMC4uNDY0MS43MjAgcm93cz0xIGxvb3BzPTEpPC9kaXY+ CjxkaXY+oKAgLSZndDsgoFNlcSBTY2FuIG9uIHBsYW5fZXZlbnRzIKAoY29zdD0wLjAwLi4yODUx LjQ0IHJvd3M9MzMzMSB3aWR0aD0wKSAoYWN0dWFsIHRpbWU9MzIuODIxLi40NjQwLjExNiByb3dz PTI2NjkgbG9vcHM9MSk8L2Rpdj48ZGl2PqCgIKAgoCCgIEZpbHRlcjogZl9wbGFuX2V2ZW50X2Fj bCgxNywgaWQpPC9kaXY+PGRpdj6gVG90YWwgcnVudGltZTogNDY0MS43NTMgbXM8L2Rpdj4KPGRp dj4oNCByb3dzKTwvZGl2PjxkaXY+PGJyPjwvZGl2Pjwvc3Bhbj48L2ZvbnQ+PC9kaXY+PGRpdj48 Zm9udCBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPjxz cGFuIGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xs YXBzZTsgLXdlYmtpdC1ib3JkZXItaG9yaXpvbnRhbC1zcGFjaW5nOiAycHg7IC13ZWJraXQtYm9y ZGVyLXZlcnRpY2FsLXNwYWNpbmc6IDJweDsgIj48YnI+Cjwvc3Bhbj48L2ZvbnQ+PC9kaXY+PGRp dj48Zm9udCBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYi PjxzcGFuIGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBj b2xsYXBzZTsgLXdlYmtpdC1ib3JkZXItaG9yaXpvbnRhbC1zcGFjaW5nOiAycHg7IC13ZWJraXQt Ym9yZGVyLXZlcnRpY2FsLXNwYWNpbmc6IDJweDsiPjxicj4KPC9zcGFuPjwvZm9udD48L2Rpdj48 ZGl2Pjxmb250IGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBmYWNlPSJhcmlhbCwgc2Fucy1zZXJp ZiI+PHNwYW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJib3JkZXItY29sbGFwc2U6 IGNvbGxhcHNlOyAtd2Via2l0LWJvcmRlci1ob3Jpem9udGFsLXNwYWNpbmc6IDJweDsgLXdlYmtp dC1ib3JkZXItdmVydGljYWwtc3BhY2luZzogMnB4OyI+V2hhdCBjYW4gSSBkbyB0byBpbXByb3Zl IHRoZSBwZXJmb3JtYW5jZT8gVGhlIHRhYmxlIGhhcyBhcm91bmQgMzAwMCsgcm93cywgc28gdGhl IGRhdGEgc2l6ZSBpcyByZWFsbHkgbGltaXRlZC48L3NwYW4+PC9mb250PjwvZGl2Pgo8ZGl2Pjxm b250IGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+PHNw YW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxh cHNlOyAtd2Via2l0LWJvcmRlci1ob3Jpem9udGFsLXNwYWNpbmc6IDJweDsgLXdlYmtpdC1ib3Jk ZXItdmVydGljYWwtc3BhY2luZzogMnB4OyI+PGJyPjwvc3Bhbj48L2ZvbnQ+PC9kaXY+CjxkaXY+ PGZvbnQgY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIGZhY2U9ImFyaWFsLCBzYW5zLXNlcmlmIj48 c3BhbiBjbGFzcz0iQXBwbGUtc3R5bGUtc3BhbiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29s bGFwc2U7IC13ZWJraXQtYm9yZGVyLWhvcml6b250YWwtc3BhY2luZzogMnB4OyAtd2Via2l0LWJv cmRlci12ZXJ0aWNhbC1zcGFjaW5nOiAycHg7Ij5UaGUgdGFibGUgaGFzIHRoZSBmb2xsb3dpbmcg ZGVmaW5pdGlvbjqgPC9zcGFuPjwvZm9udD48L2Rpdj4KPGRpdj48Zm9udCBjbGFzcz0iQXBwbGUt c3R5bGUtc3BhbiIgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPjxzcGFuIGNsYXNzPSJBcHBsZS1z dHlsZS1zcGFuIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgLXdlYmtpdC1ib3Jk ZXItaG9yaXpvbnRhbC1zcGFjaW5nOiAycHg7IC13ZWJraXQtYm9yZGVyLXZlcnRpY2FsLXNwYWNp bmc6IDJweDsiPjxicj48L3NwYW4+PC9mb250PjwvZGl2Pgo8ZGl2Pjxmb250IGNsYXNzPSJBcHBs ZS1zdHlsZS1zcGFuIiBmYWNlPSJhcmlhbCwgc2Fucy1zZXJpZiI+PHNwYW4gY2xhc3M9IkFwcGxl LXN0eWxlLXNwYW4iIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyAtd2Via2l0LWJv cmRlci1ob3Jpem9udGFsLXNwYWNpbmc6IDJweDsgLXdlYmtpdC1ib3JkZXItdmVydGljYWwtc3Bh Y2luZzogMnB4OyI+PGJyPjwvc3Bhbj48L2ZvbnQ+PC9kaXY+CjxkaXY+PGZvbnQgY2xhc3M9IkFw cGxlLXN0eWxlLXNwYW4iIGZhY2U9ImFyaWFsLCBzYW5zLXNlcmlmIj48c3BhbiBjbGFzcz0iQXBw bGUtc3R5bGUtc3BhbiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IC13ZWJraXQt Ym9yZGVyLWhvcml6b250YWwtc3BhY2luZzogMnB4OyAtd2Via2l0LWJvcmRlci12ZXJ0aWNhbC1z cGFjaW5nOiAycHg7Ij4tLS0tLTwvc3Bhbj48L2ZvbnQ+PC9kaXY+CjxkaXY+PGZvbnQgY2xhc3M9 IkFwcGxlLXN0eWxlLXNwYW4iIGZhY2U9ImFyaWFsLCBzYW5zLXNlcmlmIj48c3BhbiBjbGFzcz0i QXBwbGUtc3R5bGUtc3BhbiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IC13ZWJr aXQtYm9yZGVyLWhvcml6b250YWwtc3BhY2luZzogMnB4OyAtd2Via2l0LWJvcmRlci12ZXJ0aWNh bC1zcGFjaW5nOiAycHg7Ij48YnI+PC9zcGFuPjwvZm9udD48L2Rpdj4KPGRpdj48Zm9udCBjbGFz cz0iQXBwbGUtc3R5bGUtc3BhbiIgZmFjZT0iYXJpYWwsIHNhbnMtc2VyaWYiPjxzcGFuIGNsYXNz PSJBcHBsZS1zdHlsZS1zcGFuIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgLXdl YmtpdC1ib3JkZXItaG9yaXpvbnRhbC1zcGFjaW5nOiAycHg7IC13ZWJraXQtYm9yZGVyLXZlcnRp Y2FsLXNwYWNpbmc6IDJweDsiPjxkaXY+bWV0YWJhc2U9IyBcZCBwbGFuX2V2ZW50czugPC9kaXY+ CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIFRhYmxlICZx dW90O3B1YmxpYy5wbGFuX2V2ZW50cyZxdW90OzwvZGl2PjxkaXY+oKAgoCCgQ29sdW1uIKAgoCCg fCCgIKAgoCCgIKAgVHlwZSCgIKAgoCCgIKAgfCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg TW9kaWZpZXJzIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoKA8L2Rpdj48ZGl2Pi0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9kaXY+Cjxk aXY+oGlkIKAgoCCgIKAgoCCgIKAgfCBpbnRlZ2VyIKAgoCCgIKAgoCCgIKAgoCCgfCBub3QgbnVs bCBkZWZhdWx0IG5leHR2YWwoKCYjMzk7JnF1b3Q7cGxhbl9ldmVudF9pZF9zZXEmcXVvdDsmIzM5 Ozo6dGV4dCk6OnJlZ2NsYXNzKTwvZGl2PjxkaXY+oGRlc2NyaXB0aW9uIKAgoCCgfCB0ZXh0IKAg oCCgIKAgoCCgIKAgoCCgIKAgfCBub3QgbnVsbDwvZGl2PjxkaXY+oHN0YXR1cyCgIKAgoCCgIKAg fCB0ZXh0IKAgoCCgIKAgoCCgIKAgoCCgIKAgfCBub3QgbnVsbDwvZGl2Pgo8ZGl2PqBwY3RfY29t cGxldGVkIKAgoHwgaW50ZWdlciCgIKAgoCCgIKAgoCCgIKAgoHwgZGVmYXVsdCAwPC9kaXY+PGRp dj6gZHVlIKAgoCCgIKAgoCCgIKB8IHRpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSB8IG5vdCBudWxs PC9kaXY+PGRpdj6gZHVlX3RvIKAgoCCgIKAgoCB8IHRpbWVzdGFtcCB3aXRoIHRpbWUgem9uZSB8 IG5vdCBudWxsPC9kaXY+PGRpdj6gcHJpb3JpdHkgoCCgIKAgoCB8IGludGVnZXIgoCCgIKAgoCCg IKAgoCCgIKB8IG5vdCBudWxsIGRlZmF1bHQgMTwvZGl2Pgo8ZGl2PqBjcmVhdGVkIKAgoCCgIKAg oHwgdGltZXN0YW1wIHdpdGggdGltZSB6b25lIHwgbm90IG51bGw8L2Rpdj48ZGl2PqB1c2VyX2lk X2NyZWF0ZWQgoHwgaW50ZWdlciCgIKAgoCCgIKAgoCCgIKAgoHwgbm90IG51bGw8L2Rpdj48ZGl2 PqBwbGFuX3R5cGVfaWQgoCCgIHwgaW50ZWdlciCgIKAgoCCgIKAgoCCgIKAgoHwgbm90IG51bGw8 L2Rpdj48ZGl2PqBmaW5pc2hlZCCgIKAgoCCgIHwgYm9vbGVhbiCgIKAgoCCgIKAgoCCgIKAgoHwg bm90IG51bGwgZGVmYXVsdCBmYWxzZTwvZGl2Pgo8ZGl2PqBkdXJhdGlvbiCgIKAgoCCgIHwgZG91 YmxlIHByZWNpc2lvbiCgIKAgoCCgIHwgbm90IG51bGwgZGVmYXVsdCAwLjA8L2Rpdj48ZGl2PqBz ZWFyY2hfaWR4IKAgoCCgIHwgdHN2ZWN0b3IgoCCgIKAgoCCgIKAgoCCgIHygPC9kaXY+PGRpdj6g b3JnX2lkIKAgoCCgIKAgoCB8IGludGVnZXIgoCCgIKAgoCCgIKAgoCCgIKB8IG5vdCBudWxsIGRl ZmF1bHQgMTwvZGl2PjxkaXY+oHBlcnNvbmFsX3VzZXJfaWQgfCBpbnRlZ2VyIKAgoCCgIKAgoCCg IKAgoCCgfKA8L2Rpdj4KPGRpdj6gcGxhY2UgoCCgIKAgoCCgIKB8IHRleHQgoCCgIKAgoCCgIKAg oCCgIKAgoCB8oDwvZGl2PjxkaXY+oGNvbnRhY3RfbG9nX2lkIKAgfCBpbnRlZ2VyIKAgoCCgIKAg oCCgIKAgoCCgfKA8L2Rpdj48ZGl2PkluZGV4ZXM6PC9kaXY+PGRpdj6goCCgJnF1b3Q7cGxhbl9l dmVudHNfcGtleSZxdW90OyBQUklNQVJZIEtFWSwgYnRyZWUgKGlkKTwvZGl2PjxkaXY+oKAgoCZx dW90O3BsYW5fZXZlbnRfY29udGFjdF9sb2dfaWR4JnF1b3Q7IGJ0cmVlIChjb250YWN0X2xvZ19p ZCk8L2Rpdj4KPGRpdj6goCCgJnF1b3Q7cGxhbl9ldmVudF9zZWFyY2hfaWR4JnF1b3Q7IGdpbiAo c2VhcmNoX2lkeCk8L2Rpdj48ZGl2PqCgIKAmcXVvdDtwbGFuX2V2ZW50c19jcmVhdGVkX2lkeCZx dW90OyBidHJlZSAoY3JlYXRlZCk8L2Rpdj48ZGl2PqCgIKAmcXVvdDtwbGFuX2V2ZW50c19kdWVf aWR4JnF1b3Q7IGJ0cmVlIChkdWUpPC9kaXY+PGRpdj6goCCgJnF1b3Q7cGxhbl9ldmVudHNfb3Jn X2lkeCZxdW90OyBidHJlZSAob3JnX2lkKTwvZGl2Pgo8ZGl2PqCgIKAmcXVvdDtwbGFuX2V2ZW50 c19wZXJzb25hbF91c2VyX2lkeCZxdW90OyBidHJlZSAocGVyc29uYWxfdXNlcl9pZCk8L2Rpdj48 ZGl2PqCgIKAmcXVvdDtwbGFuX2V2ZW50c19wbGFuX3R5cGVfaWRfaWR4JnF1b3Q7IGJ0cmVlIChw bGFuX3R5cGVfaWQpPC9kaXY+PGRpdj6goCCgJnF1b3Q7cGxhbl9ldmVudHNfdXNlcl9pZF9jcmVh dGVkX2lkeCZxdW90OyBidHJlZSAodXNlcl9pZF9jcmVhdGVkKTwvZGl2Pgo8ZGl2PkZvcmVpZ24t a2V5IGNvbnN0cmFpbnRzOjwvZGl2PjxkaXY+oKAgoCZxdW90O3BsYW5fZXZlbnRzX2NvbnRhY3Rf bG9nX2lkX2ZrZXkmcXVvdDsgRk9SRUlHTiBLRVkgKGNvbnRhY3RfbG9nX2lkKSBSRUZFUkVOQ0VT IGNvbnRhY3RfbG9ncyhpZCk8L2Rpdj48ZGl2PqCgIKAmcXVvdDtwbGFuX2V2ZW50c19vcmdfaWRf ZmtleSZxdW90OyBGT1JFSUdOIEtFWSAob3JnX2lkKSBSRUZFUkVOQ0VTIG9yZ3MoaWQpPC9kaXY+ CjxkaXY+oKAgoCZxdW90O3BsYW5fZXZlbnRzX3BlcnNvbmFsX3VzZXJfaWRfZmtleSZxdW90OyBG T1JFSUdOIEtFWSAocGVyc29uYWxfdXNlcl9pZCkgUkVGRVJFTkNFUyB1c2VycyhpZCk8L2Rpdj48 ZGl2PqCgIKAmcXVvdDtwbGFuX2V2ZW50c19wbGFuX3R5cGVfaWRfZmtleSZxdW90OyBGT1JFSUdO IEtFWSAocGxhbl90eXBlX2lkKSBSRUZFUkVOQ0VTIHBsYW5fdHlwZXMoaWQpPC9kaXY+CjxkaXY+ oKAgoCZxdW90O3BsYW5fZXZlbnRzX3VzZXJfaWRfY3JlYXRlZF9ma2V5JnF1b3Q7IEZPUkVJR04g S0VZICh1c2VyX2lkX2NyZWF0ZWQpIFJFRkVSRU5DRVMgdXNlcnMoaWQpPC9kaXY+PGRpdj5SZWZl cmVuY2VkIGJ5OjwvZGl2PjxkaXY+oKAgoFRBQkxFICZxdW90O2NvbnRhY3RfcGxhbl9ldmVudHMm cXVvdDsgQ09OU1RSQUlOVCAmcXVvdDtjb250YWN0X3BsYW5fZXZlbnRzX3BsYW5fZXZlbnRfaWRf ZmtleSZxdW90OyBGT1JFSUdOIEtFWSAocGxhbl9ldmVudF9pZCkgUkVGRVJFTkNFUyBwbGFuX2V2 ZW50cyhpZCk8L2Rpdj4KPGRpdj6goCCgVEFCTEUgJnF1b3Q7Y3VzdG9tX3ZhbHVlcyZxdW90OyBD T05TVFJBSU5UICZxdW90O2N1c3RvbV92YWx1ZXNfcGxhbl9ldmVudF9pZF9ma2V5JnF1b3Q7IEZP UkVJR04gS0VZIChwbGFuX2V2ZW50X2lkKSBSRUZFUkVOQ0VTIHBsYW5fZXZlbnRzKGlkKTwvZGl2 PjxkaXY+oKAgoFRBQkxFICZxdW90O2N1c3RvbWVyX3BsYW5fZXZlbnRzJnF1b3Q7IENPTlNUUkFJ TlQgJnF1b3Q7Y3VzdG9tZXJfcGxhbl9ldmVudHNfcGxhbl9ldmVudF9pZF9ma2V5JnF1b3Q7IEZP UkVJR04gS0VZIChwbGFuX2V2ZW50X2lkKSBSRUZFUkVOQ0VTIHBsYW5fZXZlbnRzKGlkKTwvZGl2 Pgo8ZGl2PqCgIKBUQUJMRSAmcXVvdDtnZW5lcmljX2NvbW1lbnRzJnF1b3Q7IENPTlNUUkFJTlQg JnF1b3Q7Z2VuZXJpY19jb21tZW50c19wbGFuX2V2ZW50X2lkX2ZrZXkmcXVvdDsgRk9SRUlHTiBL RVkgKHBsYW5fZXZlbnRfaWQpIFJFRkVSRU5DRVMgcGxhbl9ldmVudHMoaWQpPC9kaXY+PGRpdj6g oCCgVEFCTEUgJnF1b3Q7bWFpbF9xdWV1ZV9pdGVtcyZxdW90OyBDT05TVFJBSU5UICZxdW90O21h aWxfcXVldWVfaXRlbXNfcGxhbl9ldmVudF9pZF9ma2V5JnF1b3Q7IEZPUkVJR04gS0VZIChwbGFu X2V2ZW50X2lkKSBSRUZFUkVOQ0VTIHBsYW5fZXZlbnRzKGlkKTwvZGl2Pgo8ZGl2PqCgIKBUQUJM RSAmcXVvdDtwbGFuX2V2ZW50X25vdGlmaWNhdGlvbnMmcXVvdDsgQ09OU1RSQUlOVCAmcXVvdDtw bGFuX2V2ZW50X25vdGlmaWNhdGlvbnNfcGxhbl9ldmVudF9pZF9ma2V5JnF1b3Q7IEZPUkVJR04g S0VZIChwbGFuX2V2ZW50X2lkKSBSRUZFUkVOQ0VTIHBsYW5fZXZlbnRzKGlkKTwvZGl2PjxkaXY+ oKAgoFRBQkxFICZxdW90O3Byb2plY3RfcGxhbl9ldmVudHMmcXVvdDsgQ09OU1RSQUlOVCAmcXVv dDtwcm9qZWN0X3BsYW5fZXZlbnRzX3BsYW5fZXZlbnRfaWRfZmtleSZxdW90OyBGT1JFSUdOIEtF WSAocGxhbl9ldmVudF9pZCkgUkVGRVJFTkNFUyBwbGFuX2V2ZW50cyhpZCk8L2Rpdj4KPGRpdj6g oCCgVEFCTEUgJnF1b3Q7dG9fZG9fbGlzdF9ldmVudHMmcXVvdDsgQ09OU1RSQUlOVCAmcXVvdDt0 b19kb19saXN0X2V2ZW50c19wbGFuX2V2ZW50X2lkX2ZrZXkmcXVvdDsgRk9SRUlHTiBLRVkgKHBs YW5fZXZlbnRfaWQpIFJFRkVSRU5DRVMgcGxhbl9ldmVudHMoaWQpPC9kaXY+PGRpdj6goCCgVEFC TEUgJnF1b3Q7dXNlcl9wbGFuX2V2ZW50cyZxdW90OyBDT05TVFJBSU5UICZxdW90O3VzZXJfcGxh bl9ldmVudHNfcGxhbl9ldmVudF9pZF9ma2V5JnF1b3Q7IEZPUkVJR04gS0VZIChwbGFuX2V2ZW50 X2lkKSBSRUZFUkVOQ0VTIHBsYW5fZXZlbnRzKGlkKTwvZGl2Pgo8ZGl2PlRyaWdnZXJzOjwvZGl2 PjxkaXY+oKAgoHBsYW5fZXZlbnRzX3VwZGF0ZSBCRUZPUkUgSU5TRVJUIE9SIFVQREFURSBPTiBw bGFuX2V2ZW50cyBGT1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURVUkUgdHN2ZWN0b3JfdXBkYXRl X3RyaWdnZXIoJiMzOTtzZWFyY2hfaWR4JiMzOTssICYjMzk7cGdfY2F0YWxvZy5kYW5pc2gmIzM5 OywgJiMzOTtkZXNjcmlwdGlvbiYjMzk7LCAmIzM5O3N0YXR1cyYjMzk7KTwvZGl2Pgo8ZGl2Pi0t LS0tLTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+QW5kIHRoZSBmX3BsYW5fZXZlbnQgZnVuY3Rp b24gaGFzIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbjqgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp dj48ZGl2Pm1ldGFiYXNlPSMgXGRmKyBmX3BsYW5fZXZlbnRfYWNsPC9kaXY+PGRpdj6goCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoExpc3Qgb2YgZnVuY3Rpb25zPC9kaXY+CjxkaXY+oFNj aGVtYSB8IKAgoCCgIE5hbWUgoCCgIKAgfCBSZXN1bHQgZGF0YSB0eXBlIHwgoCCgIEFyZ3VtZW50 IGRhdGEgdHlwZXMgoCCgIKB8IKBUeXBlIKB8IFZvbGF0aWxpdHkgfCCgT3duZXIgoCB8IExhbmd1 YWdlIHwgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCBTb3VyY2UgY29kZSCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIHwgRGVzY3JpcHRpb26gPC9kaXY+CjxkaXY+LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t PC9kaXY+CjxkaXY+oHB1YmxpYyB8IGZfcGxhbl9ldmVudF9hY2wgfCBib29sZWFuIKAgoCCgIKAg oHwgdWlkIGludGVnZXIsIHBsYW5faWQgaW50ZWdlciB8IG5vcm1hbCB8IHZvbGF0aWxlIKAgfCBw b3N0Z3JlcyB8IHBscGdzcWwgoHwgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIHygPC9kaXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIDogZGVjbGFyZSCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKCgPC9kaXY+Cjxk aXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIDogoCCgIKAgoCB1c2VyIHJlY29yZDsgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgPC9kaXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIDogoCCgIKAgoCBjdXN0b21lciByZWNv cmQ7IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgPC9kaXY+CjxkaXY+oKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IDogoCCgIKAgoCBwcm9qZWN0IHJlY29yZDsgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKCgPC9kaXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIDogoCCgIKAgoCBwY291bnRfcmVsIHJlY29yZDsgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgPC9kaXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIDogoCCgIKAg oCBjY291bnRfcmVsIHJlY29yZDsgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgPC9k aXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIDogYmVnaW4goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKCgPC9kaXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIDogoCCgIKAgoCBzZWxlY3Qg aW50byB1c2VyICogZnJvbSB1c2VycyB3aGVyZSBpZCA9IHVpZDsgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKCgPC9kaXY+CjxkaXY+ oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIDogoCCgIKAgoCBzZWxlY3QgaW50byBwY291bnRfcmVsIENPVU5UKCopIGFzIGFjbF9j b3VudCBGUk9NIHByb2plY3RfcGxhbl9ldmVudHMgcHBlIFdIRVJFIHBwZS5wbGFuX2V2ZW50X2lk ID0gcGxhbl9pZDsgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgPC9kaXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIDogoCCgIKAgoCBpZiAocGNvdW50X3JlbC5h Y2xfY291bnQgJmd0OyAwKSB0aGVuIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgPC9kaXY+CjxkaXY+oKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IDogoCCgIKAgoCCgIKAgoCCgIFNFTEVDVCBJTlRPIHByb2plY3QgKiBGUk9NIHByb2plY3RzIFdI RVJFIGlkIElOIChTRUxFQ1QgcHJvamVjdF9pZCBGUk9NIHByb2plY3RfcGxhbl9ldmVudHMgcHBl MiBXSEVSRSBwcGUyLnBsYW5fZXZlbnRfaWQgPSBwbGFuX2lkKSBPRkZTRVQgMCBMSU1JVCAxOyCg IKAgoCCgPC9kaXY+CjxkaXY+oKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIDogoCCgIKAgoCCgIKAgoCCgIHJldHVybiBmX3Byb2pl Y3RfYWNsKHVpZCwgPGEgaHJlZj0iaHR0cDovL3Byb2plY3QuaWQiPnByb2plY3QuaWQ8L2E+KTsg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKA8L2Rpdj4KPGRpdj6goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgOiCgIKAgoCCgIGVuZCBpZjsgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoKA8L2Rpdj4KPGRpdj6goCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgOiCgIKAgoCCg IHNlbGVjdCBpbnRvIGNjb3VudF9yZWwgQ09VTlQoKikgYXMgYWNsX2NvdW50IEZST00gY3VzdG9t ZXJfcGxhbl9ldmVudHMgY3BlIFdIRVJFIGNwZS5wbGFuX2V2ZW50X2lkID0gcGxhbl9pZDsgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoKA8L2Rp dj4KPGRpdj6goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgOiCgIKAgoCCgIGlmIChjY291bnRfcmVsLmFjbF9jb3VudCAmZ3Q7IDAp IHRoZW4goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKA8L2Rpdj4KPGRpdj6goCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgOiCgIKAgoCCgIKAgoCCg IKAgc2VsZWN0IGludG8gY3VzdG9tZXIgKiBmcm9tIGN1c3RvbWVycyB3aGVyZSBpZCBpbiAoc2Vs ZWN0IGN1c3RvbWVyX2lkIGZyb20gY3VzdG9tZXJfcGxhbl9ldmVudHMgY3BlMiB3aGVyZSBjcGUy LnBsYW5fZXZlbnRfaWQgPSBwbGFuX2lkKSBvZmZzZXQgMCBsaW1pdCAxOyCgIKA8L2Rpdj4KPGRp dj6goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgOiCgIKAgoCCgIKAgoCCgIKAgcmV0dXJuIGZfY3VzdG9tZXJfYWNsKHVpZCwgPGEg aHJlZj0iaHR0cDovL2N1c3RvbWVyLmlkIj5jdXN0b21lci5pZDwvYT4pOyCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKA8L2Rpdj4KPGRp dj6goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgOiCgIKAgoCCgIGVuZCBpZjsgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoKA8L2Rpdj4KPGRpdj6goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgOiCgIKAgoCCgIHJldHVybiB0cnVlOyCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKA8L2Rpdj4KPGRpdj6goCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg OiBlbmQ7IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKA8L2Rpdj4KPGRpdj6goCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCg IKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAg oCCgIKAgoCCgIKAgoCCgIKAgoCCgIKAgOiCgIKCgPC9kaXY+PC9kaXY+PC9zcGFuPjwvZm9udD48 L2Rpdj48ZGl2Pjxmb250IGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBmYWNlPSJhcmlhbCwgc2Fu cy1zZXJpZiI+PHNwYW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJib3JkZXItY29s bGFwc2U6IGNvbGxhcHNlOyAtd2Via2l0LWJvcmRlci1ob3Jpem9udGFsLXNwYWNpbmc6IDJweDsg LXdlYmtpdC1ib3JkZXItdmVydGljYWwtc3BhY2luZzogMnB4OyAiPjxicj4KPC9zcGFuPjwvZm9u dD48L2Rpdj48ZGl2Pjxmb250IGNsYXNzPSJBcHBsZS1zdHlsZS1zcGFuIiBmYWNlPSJhcmlhbCwg c2Fucy1zZXJpZiI+PHNwYW4gY2xhc3M9IkFwcGxlLXN0eWxlLXNwYW4iIHN0eWxlPSJib3JkZXIt Y29sbGFwc2U6IGNvbGxhcHNlOyAtd2Via2l0LWJvcmRlci1ob3Jpem9udGFsLXNwYWNpbmc6IDJw eDsgLXdlYmtpdC1ib3JkZXItdmVydGljYWwtc3BhY2luZzogMnB4OyI+PGJyIGNsZWFyPSJhbGwi Pgo8L3NwYW4+PC9mb250Pjxicj4tLSA8YnI+QmVzdCBSZWdhcmRzLCA8YnI+PGJyPkFuZGVycyDY c3RlcmdhYXJkIEplbnNlbiwgQi5TYy48YnI+VGVjaG5pY2FsIERpcmVjdG9yICZhbXA7IE1hbmFn aW5nIFBhcnRuZXI8YnI+TWVlaG8hIEFwUzxicj48YnI+TWVlaG8hIEF1c3RyYWxpYTxicj41LzI4 IE9uc2xvdyBBdmU8YnI+RWxpemFiZXRoIEJheTxicj4yMDExIE5TVzxicj48YnI+RS1tYWlsOiA8 YSBocmVmPSJtYWlsdG86YWpAaXRlcnN5cy5kayI+YWpAaXRlcnN5cy5kazwvYT4gLyA8YSBocmVm PSJtYWlsdG86YWpAbWVlaG8uZGsiPmFqQG1lZWhvLmRrPC9hPjxicj4KUGhvbmU6ICs2MSA0MDYg ODgwIDMxMzxicj5XZWIgKEludGwpOiA8YSBocmVmPSJodHRwOi8vd3d3Lm1lZWhvLm5ldC8iPmh0 dHA6Ly93d3cubWVlaG8ubmV0LzwvYT48YnI+V2ViIChESyk6IGh0dHA6LzxhIGhyZWY9Imh0dHA6 Ly93d3cubWVlaG8uZGsvIj53d3cubWVlaG8uZGsvPC9hPjxicj4KPC9kaXY+Cg== --000e0cd72b262a47d4048b57b3ed--