From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from emea01-db3-obe.outbound.protection.outlook.com (mail-db3on0056.outbound.protection.outlook.com [157.55.234.56]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client CN "mail.protection.outlook.com", Issuer "MSIT Machine Auth CA 2" (verified OK)) by huchra.bufferbloat.net (Postfix) with ESMTPS id 1172F21F60A for ; Sun, 4 Oct 2015 10:24:00 -0700 (PDT) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kevin@darbyshire-bryant.me.uk; Received: from [10.102.59.163] (109.159.227.69) by VI1PR07MB0943.eurprd07.prod.outlook.com (10.161.110.148) with Microsoft SMTP Server (TLS) id 15.1.286.20; Sun, 4 Oct 2015 17:23:54 +0000 To: Sebastian Moeller References: <56102F88.8070201@darbyshire-bryant.me.uk> <01DFDB5B-04E1-4DF9-B540-FE090111E3A6@gmx.de> From: Kevin Darbyshire-Bryant Message-ID: <561160A5.7030405@darbyshire-bryant.me.uk> Date: Sun, 4 Oct 2015 18:23:49 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <01DFDB5B-04E1-4DF9-B540-FE090111E3A6@gmx.de> Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-512; boundary="------------ms000607010508030608060301" X-Originating-IP: [109.159.227.69] X-ClientProxiedBy: DB3PR08CA0029.eurprd08.prod.outlook.com (25.161.51.167) To VI1PR07MB0943.eurprd07.prod.outlook.com (25.161.110.148) X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB0943; 2:SaSpuUsKuFLFwL/o38JLTXew+U56NGkrPCeQR7RiAlJt7f3FJKV2u9QmI8gkna1jVNYVHg0X5j3Jr2a4Uei2szokyFpRDE9YujPqq4Q9BbVLXOsfY46KdRQFaby85MhmaoDuBtvkudG2fy5oOiHRCDdHdaAAAXFr5RGpS84O+Vw=; 3:KSJXtdZ/506eTiSfXM/JJ/UgIvCACVoqiNJ1Lrrys2OgZ40SFeQHQJTUrH1GK5bVqVpk72DTjdqG4L+S/G9TKhp6/bbaxGPIYaNv3qfrEyLBdW5gd9SZlu4MbJ698TvNfNXrOzG1CFqjKvChvC20jzU0D4SP2crB5x7YeTagHlc=; 25:8nC/KPqr9MIkww5VnegKEm6a3inB49NSCsXO/4+F9sq7Bc9jzjAhCz8FCUl6KqXr7jq0UA2tCIZUOizMVm6WWpgqjBCqoBVAnYqa2XQe5rwMHO6jVpvrzFSxoK4P/uHM5gcEQxaKJ+NXDXwR99gNwuuRz96VmAHyR9ODeWZLECvPN7+qqBlNiY5z5Yjp1r8K3Z01eucvqq9nmjdliGT9C0OoCLIQr5BRucaYw69el6YMUfA4HQHw5ngOBDEZ7e4cv0bbI+jBhvFt+B3rFnr0Zw== X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(42139001); SRVR:VI1PR07MB0943; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001); SRVR:VI1PR07MB0943; BCL:0; PCL:0; RULEID:; SRVR:VI1PR07MB0943; X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB0943; 4:hmMFFm48ttlP/UchgQK3AhjG51+SQhypmDDqREzCQRDMkdwPNngId9mSi1VhSHLja+p+08YsBK1UfZEp1NJLqQjDiembNCR8Ru3g2Q2Az46PrsrqLRh5CLACzups/5WZwBXjeNSgjYZNpK6c+VwUUgdNosoJ+sxmsTT2aoaVKtFOg3/AXOafSfh3+xVP+dm9mJhADKAhckp5/M5rEVzOVeWwTzRROEL1H3zpgm+5kGWae1m5lWdHzh6IopguaGlzlrJNf/FXBm3ZLcS1PMgmIT9yYSQ6FH97w2CfEZGeA0eHvldrs+a/ZfuN6QLKcXk8+SW+q5c2T1at/N9MoEMZqIKKnJh8E+wNaoWK/D/XS0A= X-Forefront-PRVS: 0719EC6A9A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6049001)(6009001)(53754006)(199003)(24454002)(479174004)(189002)(43544003)(5890100001)(62966003)(77156002)(122386002)(5008740100001)(40100003)(2950100001)(92566002)(77096005)(68736005)(15975445007)(46102003)(99136001)(512944002)(64126003)(65806001)(66066001)(64706001)(65956001)(5001830100001)(4001540100001)(97736004)(36756003)(568964001)(105586002)(74482002)(5001860100001)(106356001)(4001350100001)(110136002)(80316001)(86362001)(83506001)(5001960100002)(5004730100002)(84326002)(87976001)(87266999)(54356999)(101416001)(81156007)(5007970100001)(59896002)(42186005)(50986999)(76176999)(65816999)(33656002)(189998001)(19580395003)(19580405001)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR07MB0943; H:[10.102.59.163]; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: darbyshire-bryant.me.uk does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR07MB0943; 23:OSrS/pRFXJawFDyHYcvckFRDq5soZ4mLN4kAy4IOh?= =?us-ascii?Q?mkpVGp/j5BY5zgC3QHuRuYImHh9nOR/Wk7leofMjP2e2hykXrfiNEOGK95q3?= =?us-ascii?Q?iYXeSavh57ywckfiTQFA/piJ5Hdo1oE/wdl79dhyWcvwE9qlEt78T9MayYax?= =?us-ascii?Q?j4IKtLzKYMO8bzNoplASscAYrGfdJIvghMztGPU5w2xhtYOuwW7leCbZ+QIC?= =?us-ascii?Q?pLhoUrQApVk4TKW3YT2aU0v1cgJGVImig4kx/Kyquxq5plW3ejHxbBYuMw9t?= =?us-ascii?Q?t4bEV+tJvmCgk9hFomuOgnzmL+Mpu651pJ7Ik+hab2Orz+9wufPS+ImBkPe3?= =?us-ascii?Q?WlnHi2dAVej3ho4vlH8ZC6wSDfW/iluhgxBd50+eNRB3metagoVAs280q5IV?= =?us-ascii?Q?8TTjdTle/sifOPKy1BRV5T1f4nxsqROlE4TUCxMErgnfO3yc/wqDVech6Cy0?= =?us-ascii?Q?0Lr3NBi9LXysmrM0MU5ZQg4SmfU/Vg8ENKXqireQnnF9ZfTvEaOOy1rY+8OD?= =?us-ascii?Q?C22f7xBcQirs355t5nklCEOGo5i2fRVboq+lwz3uLAPGyz4+83vtHxIjZSF8?= =?us-ascii?Q?ydP1MLuEYUIJf2FtY0WMufjr5KS6cexQyFzKpPvilzBBN9tpHIGBYc35AmWd?= =?us-ascii?Q?aetjtrk9RqxJpio2PfzqoZX5EXuoTrUl/Rud02mZqlCGyftcF3rF+9ArJjpm?= =?us-ascii?Q?Z3pJdSOM+Pl2SFV2QLMAOUUYbsZBFIn2Ttylz7BKMH+M1Ay7Y1XNCndLJ/t6?= =?us-ascii?Q?3wOVmySgk7a5cYrje5UAEapWOvuKNeFc8dLBDh831MXTrNhGrUStMpndWcIr?= =?us-ascii?Q?G3DeaSBm7dj5liStup2arfY79M0bhBMG8hhILsItUGX9MM9yelyOdAWTG2mv?= =?us-ascii?Q?uolo5JBQcmfzcPtwB27DE6bAo4FGFAQDGVE5/XsjwAAoRt9sEnPpaGS3lVkt?= =?us-ascii?Q?YfBE1rCueu7+tbu+tK9tHJVb7l+o9ouaxw94ccEvdIovvJZl7i2NuMkcpMz9?= =?us-ascii?Q?8WJZwAiF5N4ChhiPFaxbIzzS4hRgIGhCljKKgzgprqNk+MB5F2icMKO3j+Gb?= =?us-ascii?Q?omjjzLwliDWtxge0Zg/MNLkl6Q/Ubn14w1D/EoMCnohveWYlQh2yoqVLTqua?= =?us-ascii?Q?iNGs/y+0DHaZEH+ngmG8b280f1mPA/7l+J8ueMi0JL2yrSqXC14fgtspDUkE?= =?us-ascii?Q?aJ+H52/iK7/WM9YmlqxyudJOH04FOC142PBHwaJL5/NDg+wSItdTxmcU//8W?= =?us-ascii?Q?qDsce2GnybIUfW7y4Vgl0veVJESSdJmbgP7rEqPBr3ZaPppNH0L+iPc6yBbb?= =?us-ascii?Q?maioMneUOysdr8CVyakDtQcRrc8igMku2IX5Ag9DrHXrG6xEe8o6ZH1n4Vsd?= =?us-ascii?Q?2GYfU9nbWSdBAoOK3kAc4QXzyV7q8EWtFVv4PSvAPvkHX01WOWAwFburxyRm?= =?us-ascii?Q?aKrp59JqDRL/VDPFU4LRzF03c8LMzreVjYQWpi1OGoMetAKZeimBHtRatrYj?= =?us-ascii?Q?gynoERjdPRi3lEBoJGWSrTwcZVw4NqAvqkuvjisrAAeXdL0N0MMMApiEUdL3?= =?us-ascii?Q?tQN7wi0JWfmKp7qz86UJLQIAIc1LQgsx6OmObQ=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB0943; 5:8JDFOwPWw/0IYYaRhtm94EwnXF5zDZCoXfX7WphKrfWgKXadKiUT63SgmrB40Y4XluQs9BS4YIPldk0j0Nx8jLeM1MitJUENfAZuMTIp4YfZNBP9kIB/ucmhLtwCBHZY3ycr3cWniYpTaSu2T18g7A==; 24:kHnQa4OZXdNaET2w2KQ7pcsWWU8fDaFDLwioLkXMzrtt5kgKR3/ERuk825g7Hm5roZO2n7EF44vvj2kzDg53SOrBfxMPLluyS3zSxaFb8uI=; 20:uUNfnqh8bo20DAjCFVKX+3SCRM/TORMpx910hBM4UVToABhS6tgXhtIFKzC4Ljjh4RdUtFx/9MMCq8rhcz7dpw== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: darbyshire-bryant.me.uk X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Oct 2015 17:23:54.9451 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR07MB0943 Cc: cake@lists.bufferbloat.net Subject: Re: [Cake] cake review comments cake_drop X-BeenThere: cake@lists.bufferbloat.net X-Mailman-Version: 2.1.13 Precedence: list List-Id: Cake - FQ_codel the next generation List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Oct 2015 17:24:23 -0000 --------------ms000607010508030608060301 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 04/10/15 11:50, Sebastian Moeller wrote: > Hi Kevin, > > > On Oct 3, 2015, at 21:42 , Kevin Darbyshire-Bryant wrote: > >> Hello All, >> >> On 18th Aug (before I'd subscribed to the list), Dave posted a message= >> about reviewing cake >> https://lists.bufferbloat.net/pipermail/cake/2015-August/000364.html >> >> In it he mentioned a change to cake_drop: >> >> " >> >> I would like cake_drop to be evaluated with some less exaustive >> search. It also looks wrong >> >> for(j=3D0; j < CAKE_MAX_CLASSES; j++) { >> fqcd =3D &q->classes[j]; >> >> CAKE_MAX_CLASSES should actually be q->class_cnt here; I think. I am >> unsure if other references to it are correct in face of changes, on >> cleanup" >> >> >> After making the change and nearly submitting a pull request I've >> thought about this some more and to be blunt it makes me nervous. My >> concern is what happens if cake is changed from say a diffserv8 config= >> to a single class(bin) config and for whatever reason 'cake_drop' is >> called. with diffserv8 the fat flow is likely to be in a class(bin) >> higher than the first....cake_drop would now only check the first clas= s >> for the fat flow and possibly not find anything to drop.... I fear wh= at >> happens next! > > I thought the following takes care of that (called from cake_reconfigur= e() ): > > /* Discard leftover packets from a class no longer in use. */ > static void cake_clear_class(struct Qdisc *sch, u16 class) > { =20 > struct cake_sched_data *q =3D qdisc_priv(sch); > struct cake_fqcd_sched_data *fqcd =3D &q->classes[class]; > =20 > q->cur_class =3D class; > for(q->cur_flow =3D 0; q->cur_flow < fqcd->flows_cnt; q->cur_fl= ow++) > while(custom_dequeue(NULL, sch)) > ; > } > > I probably do no understand things fully enough, but to me this seems t= o take care of your concern. Especially since cake_reconfigure will only = touch classes from q->class_cnt up to CAKE_MAX_CLASSES. Since I am not ve= ry fluent in C I might have missed things=85 That means that exchanging C= AKE_MAX_CLASSES with q->class_cnt in cake_drop() should be safe. The ques= tion left is then how costly is it to search empty classes? I guess, cake= _drop is the slow path and hence could afford to search them all, then ag= ain cake_drop probably tests called most under heavy traffic conditions, = so even the slow path performance might be noticeable to the user=85 Good spot Sebastian! I agree that looking through the code would indicate that a reconfigure from say 'diffserv8' to 'besteffort' would actually cause cake to drop all the packets in the now redundant classes, therefore my worry is solved. I've re-submitted the pull request. I may even merge it as it has been running on my router for a couple of days without actually blowing up :-) --------------ms000607010508030608060301 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgMFADCABgkqhkiG9w0BBwEAAKCC DYEwggY0MIIEHKADAgECAgEeMA0GCSqGSIb3DQEBBQUAMH0xCzAJBgNVBAYTAklMMRYwFAYD VQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0 ZSBTaWduaW5nMSkwJwYDVQQDEyBTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wNzEwMjQyMTAxNTVaFw0xNzEwMjQyMTAxNTVaMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUg U2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3MgMSBQcmltYXJ5IEludGVybWVkaWF0 ZSBDbGllbnQgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHCYPMzi3YGrEp pC4Tq5a+ijKDjKaIQZZVR63UbxIP6uq/I0fhCu+cQhoUfE6ERKKnu8zPf1Jwuk0tsvVCk6U9 b+0UjM0dLep3ZdE1gblK/1FwYT5Pipsu2yOMluLqwvsuz9/9f1+1PKHG/FaR/wpbfuIqu54q zHDYeqiUfsYzoVflR80DAC7hmJ+SmZnNTWyUGHJbBpA8Q89lGxahNvuryGaC/o2/ceD2uYDX 9U8Eg5DpIpGQdcbQeGarV04WgAUjjXX5r/2dabmtxWMZwhZna//jdiSyrrSMTGKkDiXm6/3/ 4ebfeZuCYKzN2P8O2F/Xe2AC/Y7zeEsnR7FOp+uXAgMBAAGjggGtMIIBqTAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUU3Ltkpzg2ssBXHx+ljVO8tS4UYIw HwYDVR0jBBgwFoAUTgvvGqRAW6UXaYcwyjRoQ9BBrvIwZgYIKwYBBQUHAQEEWjBYMCcGCCsG AQUFBzABhhtodHRwOi8vb2NzcC5zdGFydHNzbC5jb20vY2EwLQYIKwYBBQUHMAKGIWh0dHA6 Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNydDBbBgNVHR8EVDBSMCegJaAjhiFodHRwOi8v d3d3LnN0YXJ0c3NsLmNvbS9zZnNjYS5jcmwwJ6AloCOGIWh0dHA6Ly9jcmwuc3RhcnRzc2wu Y29tL3Nmc2NhLmNybDCBgAYDVR0gBHkwdzB1BgsrBgEEAYG1NwECATBmMC4GCCsGAQUFBwIB FiJodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMDQGCCsGAQUFBwIBFihodHRw Oi8vd3d3LnN0YXJ0c3NsLmNvbS9pbnRlcm1lZGlhdGUucGRmMA0GCSqGSIb3DQEBBQUAA4IC AQAKgwh9eKssBly4Y4xerhy5I3dNoXHYfYa8PlVLL/qtXnkFgdtY1o95CfegFJTwqBBmf8py TUnFsukDFUI22zF5bVHzuJ+GxhnSqN2sD1qetbYwBYK2iyYA5Pg7Er1A+hKMIzEzcduRkIMm CeUTyMyikfbUFvIBivtvkR8ZFAk22BZy+pJfAoedO61HTz4qSfQoCRcLN5A0t4DkuVhTMXIz uQ8CnykhExD6x4e6ebIbrjZLb7L+ocR0y4YjCl/Pd4MXU91y0vTipgr/O75CDUHDRHCCKBVm z/Rzkc/b970MEeHt5LC3NiWTgBSvrLEuVzBKM586YoRD9Dy3OHQgWI270g+5MYA8GfgI/EPT 5G7xPbCDz+zjdH89PeR3U4So4lSXur6H6vp+m9TQXPF3a0LwZrp8MQ+Z77U1uL7TelWO5lAp sbAonrqASfTpaprFVkL4nyGH+NHST2ZJPWIBk81i6Vw0ny0qZW2Niy/QvVNKbb43A43ny076 khXO7cNbBIRdJ/6qQNq9Bqb5C0Q5nEsFcj75oxQRqlKf6TcvGbjxkJh8BYtv9ePsXklAxtm8 J7GCUBthHSQgepbkOexhJ0wP8imUkyiPHQ0GvEnd83129fZjoEhdGwXV27ioRKbj/cIq7JRX un0NbeY+UdMYu9jGfIpDLtUUGSgsg2zMGs5R4jCCB0UwggYtoAMCAQICAw5ySjANBgkqhkiG 9w0BAQsFADCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNV BAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNVBAMTL1N0YXJ0 Q29tIENsYXNzIDEgUHJpbWFyeSBJbnRlcm1lZGlhdGUgQ2xpZW50IENBMB4XDTE1MDYyMDIw MzA1MloXDTE2MDYyMDE0MjY0N1owVjEmMCQGA1UEAwwda2V2aW5AZGFyYnlzaGlyZS1icnlh bnQubWUudWsxLDAqBgkqhkiG9w0BCQEWHWtldmluQGRhcmJ5c2hpcmUtYnJ5YW50Lm1lLnVr MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAugCNtDhytCJ9HOfenUHr/vUGUECv PL1IJXgHMl4cIJmwgLOkXhIcTMxHnX+kFweqvT+eDWv1hzA9yMWhvjLFC4eLoFaV0xiAat8O XQ7t3MwKY5DW0mB1dOnjiFIcc/XMwyYI4KfEGnFMJQkzon0rDVpkl/Q1f/hu1sELO7Zc6TFL wuuDuiP7S73zrz50TRoq0+Ob3x0uOMW2uVwVzf6NLwHgBE2LFleMXblyUMx0IlIcLan2nWiI Vsa3XYd+C6KAGGwlmO4VAZ25KuX7hkj8f82lSapvtKTtvrSoDghXlHH2JXiIQX+Sn0UgOmbX 1KyOe9vN7WzQ+tpPRzpFRffnnnp1VQye3wVRPBumjDxQSFTOhUtslnvbefUQSPw6p5w9ZiXI GJICLkX/MkYN/TwGCvuUG2PxBybSR1A2I5ap+VI/zGSG3XGVEA69SOZQyD+8YjJZfaY2nCu+ DuM64JrJUi2CvX6fwcdHNschJNrrfetpnrx3JrGnG9o+pWuUG1phBg+KKN2bhrdzY79qm7ha 86EMKSUOn5nBdGY3YxdXq/naoUQeOCUV2JMFGOulu7sKpiWcz7HVFacXjd9ebisVLv+jOwll z14BWRb87s1+LBEJn/Ybn3ekhtgyEAhB4kgj0scl4hI8xCU6zrZyDnbXmxSvDXbClZA0PACt f/jhGvUCAwEAAaOCAuMwggLfMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdJQQWMBQG CCsGAQUFBwMCBggrBgEFBQcDBDAdBgNVHQ4EFgQULkW2CpDiQpRNumQ7wdspjFfgX+AwHwYD VR0jBBgwFoAUU3Ltkpzg2ssBXHx+ljVO8tS4UYIwKAYDVR0RBCEwH4Eda2V2aW5AZGFyYnlz aGlyZS1icnlhbnQubWUudWswggFMBgNVHSAEggFDMIIBPzCCATsGCysGAQQBgbU3AQIDMIIB KjAuBggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9saWN5LnBkZjCB9wYI KwYBBQUHAgIwgeowJxYgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwAwIBARqB vlRoaXMgY2VydGlmaWNhdGUgd2FzIGlzc3VlZCBhY2NvcmRpbmcgdG8gdGhlIENsYXNzIDEg VmFsaWRhdGlvbiByZXF1aXJlbWVudHMgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeSwgcmVs aWFuY2Ugb25seSBmb3IgdGhlIGludGVuZGVkIHB1cnBvc2UgaW4gY29tcGxpYW5jZSBvZiB0 aGUgcmVseWluZyBwYXJ0eSBvYmxpZ2F0aW9ucy4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDov L2NybC5zdGFydHNzbC5jb20vY3J0dTEtY3JsLmNybDCBjgYIKwYBBQUHAQEEgYEwfzA5Bggr BgEFBQcwAYYtaHR0cDovL29jc3Auc3RhcnRzc2wuY29tL3N1Yi9jbGFzczEvY2xpZW50L2Nh MEIGCCsGAQUFBzAChjZodHRwOi8vYWlhLnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIuY2xhc3Mx LmNsaWVudC5jYS5jcnQwIwYDVR0SBBwwGoYYaHR0cDovL3d3dy5zdGFydHNzbC5jb20vMA0G CSqGSIb3DQEBCwUAA4IBAQBicQWe98eF/o09TXFsExc+WSyYjt3oSnXyocLzXQp82CQhIg21 5RqNZ1e+hsO7tq8S6hdItUDbKpecpIV59+57ke1zVl2slTRIT19fhYINHH78rVVRPzuHoiDt MXnGrp9hbq3Cz8P4mm8INKDiYK46kyplRAQ3ZMouPG1lsnDzgQAvbCj74H8yAp7fK8if6cxs 28BCUmdP8D3c6M1ffdNNaqNT+4Z3mtOujXXg7zOfmXN0Zg/mEtZ0NrWE2uICGdWjTv9KZiI7 fi4hk2CRpCL63qzmu6BwtcgtwhgYYtuAk2N43+SiyDkyLKGAcjEor3t5f9HivN29E0F0MXTH 1OdgMYIFDTCCBQkCAQEwgZQwgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBM dGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMTgwNgYD VQQDEy9TdGFydENvbSBDbGFzcyAxIFByaW1hcnkgSW50ZXJtZWRpYXRlIENsaWVudCBDQQID DnJKMA0GCWCGSAFlAwQCAwUAoIICSTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqG SIb3DQEJBTEPFw0xNTEwMDQxNzIzNDlaME8GCSqGSIb3DQEJBDFCBEBw24gw5CAqe5SCjPtI 0anfWGLRHVK9+Bm0Xlf1/r0SdDifM3kJobVnWraIYEvsOsHctpfxkmeWm6I/Ks0QzPtlMGwG CSqGSIb3DQEJDzFfMF0wCwYJYIZIAWUDBAEqMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzAO BggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgw gaUGCSsGAQQBgjcQBDGBlzCBlDCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29t IEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2 BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDEgUHJpbWFyeSBJbnRlcm1lZGlhdGUgQ2xpZW50IENB AgMOckowgacGCyqGSIb3DQEJEAILMYGXoIGUMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2ln bmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3MgMSBQcmltYXJ5IEludGVybWVkaWF0ZSBD bGllbnQgQ0ECAw5ySjANBgkqhkiG9w0BAQEFAASCAgCu2ZdOYk1qmos1SWWCgJtx4K1OB2GT p/UMgMxrxw22M+Gc0kCyHBL98hWMpSmHDuhykqumclmv+ckaNSXs2sf/2SoKQHOCLfieDsG0 JCNZunW/nAWsKdfykLtT26rjnBrASqLhHyFHd4UkW/GWgkiN5DjftmEnqmf6OWfbtjMZpUAo Z8u+rN35slZJJWFX9PPWu4Vdb0c0IPJqXTVQYGvlJCm15mxgYlyhBYkgkRtPu3eHY5SGcsCC NIcWVdvPiiNfTGKPseezapAA5rTY9QGTvJxvAoAxlWORmLwDlMNSaomcIDhWfudPqRkUwUXf B8Azt2sbR6Ke2G5wR0DAa7MuLPFKcBw6rLNULSA71MWZTDwtZeHD/Eyo2dtvxULQlDQsLfoy 9kG2YvPx8m6cZV2Q3Xw4K+wPARbyDk9Ae25pv6w39BkBbNF/rpmu80GevEipf82J6m3c75/c KId52tH0jiLR5Kuw0Amvaom2MSMCiw++I2hHO4tczZI0uZL6PII18VB2XHIVGV1fMrTjTUtI lhaIEToHaHYyoPOlR08+MKq5n7bwBTPQTklobYN+NCa1WeBscf2fWs86bXY2DzleO4MrkFNc R5FmbG1iXMGYRpCuB6V00moAzF11uFjl/IcxgfATR2pcJZqoK5MfohOrxL/8ifwRsLTn0IpP wEBoHQAAAAAAAA== --------------ms000607010508030608060301--