<html><head><meta content="text/html; charset=UTF-8" http-equiv="content-type"><style type="text/css">@import url(https://themes.googleusercontent.com/fonts/css?kit=OPeqXG-QxW3ZD8BtmPikfA);ul.lst-kix_kjz3u1vwm87u-2{list-style-type:none}ul.lst-kix_kjz3u1vwm87u-1{list-style-type:none}ul.lst-kix_kjz3u1vwm87u-0{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-0{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-1{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-2{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-3{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-4{list-style-type:none}ul.lst-kix_aqslecbmrlt9-3{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-0{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-5{list-style-type:none}ul.lst-kix_aqslecbmrlt9-2{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-6{list-style-type:none}ul.lst-kix_aqslecbmrlt9-1{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-7{list-style-type:none}ul.lst-kix_aqslecbmrlt9-0{list-style-type:none}ul.lst-kix_oa2l3fr3uhys-8{list-style-type:none}ul.lst-kix_aqslecbmrlt9-7{list-style-type:none}ul.lst-kix_aqslecbmrlt9-6{list-style-type:none}ul.lst-kix_aqslecbmrlt9-5{list-style-type:none}ul.lst-kix_aqslecbmrlt9-4{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-7{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-8{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-5{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-6{list-style-type:none}ul.lst-kix_aqslecbmrlt9-8{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-3{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-4{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-1{list-style-type:none}ul.lst-kix_i7bmre9bc3e8-2{list-style-type:none}ul.lst-kix_wlwlb53om0pz-0{list-style-type:none}ul.lst-kix_wlwlb53om0pz-1{list-style-type:none}ul.lst-kix_wlwlb53om0pz-2{list-style-type:none}ul.lst-kix_5jdeieiov2jo-8{list-style-type:none}ul.lst-kix_wlwlb53om0pz-3{list-style-type:none}ul.lst-kix_wlwlb53om0pz-4{list-style-type:none}ul.lst-kix_wlwlb53om0pz-5{list-style-type:none}ul.lst-kix_wlwlb53om0pz-6{list-style-type:none}ul.lst-kix_wlwlb53om0pz-7{list-style-type:none}ul.lst-kix_wlwlb53om0pz-8{list-style-type:none}.lst-kix_q4t2lvjspjpq-8>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-8}ul.lst-kix_kjz3u1vwm87u-8{list-style-type:none}ul.lst-kix_kjz3u1vwm87u-7{list-style-type:none}ul.lst-kix_kjz3u1vwm87u-6{list-style-type:none}ul.lst-kix_kjz3u1vwm87u-5{list-style-type:none}ul.lst-kix_kjz3u1vwm87u-4{list-style-type:none}ul.lst-kix_kjz3u1vwm87u-3{list-style-type:none}.lst-kix_qz2j3tgouhds-4>li:before{content:"\0025cb   "}.lst-kix_2gc8wphbwguv-4>li:before{content:"-  "}.lst-kix_qz2j3tgouhds-5>li:before{content:"\0025a0   "}.lst-kix_qz2j3tgouhds-7>li:before{content:"\0025cb   "}.lst-kix_2gc8wphbwguv-1>li:before{content:"-  "}.lst-kix_2gc8wphbwguv-5>li:before{content:"-  "}.lst-kix_qz2j3tgouhds-6>li:before{content:"\0025cf   "}.lst-kix_2gc8wphbwguv-0>li:before{content:"-  "}.lst-kix_2gc8wphbwguv-8>li:before{content:"-  "}ul.lst-kix_7ylkx0u6g7ty-3{list-style-type:none}ul.lst-kix_7ylkx0u6g7ty-2{list-style-type:none}ul.lst-kix_7ylkx0u6g7ty-5{list-style-type:none}ul.lst-kix_7ylkx0u6g7ty-4{list-style-type:none}.lst-kix_2gc8wphbwguv-6>li:before{content:"-  "}ul.lst-kix_7ylkx0u6g7ty-7{list-style-type:none}ul.lst-kix_7ylkx0u6g7ty-6{list-style-type:none}.lst-kix_2gc8wphbwguv-7>li:before{content:"-  "}.lst-kix_qz2j3tgouhds-8>li:before{content:"\0025a0   "}ul.lst-kix_7ylkx0u6g7ty-8{list-style-type:none}ul.lst-kix_7ylkx0u6g7ty-1{list-style-type:none}ul.lst-kix_7ylkx0u6g7ty-0{list-style-type:none}ul.lst-kix_q23adj2uc958-8{list-style-type:none}ul.lst-kix_p7f5jwyph9la-7{list-style-type:none}ul.lst-kix_q23adj2uc958-7{list-style-type:none}ul.lst-kix_5jdeieiov2jo-7{list-style-type:none}ul.lst-kix_p7f5jwyph9la-8{list-style-type:none}ul.lst-kix_q23adj2uc958-6{list-style-type:none}ul.lst-kix_5jdeieiov2jo-6{list-style-type:none}ul.lst-kix_p7f5jwyph9la-5{list-style-type:none}ul.lst-kix_q23adj2uc958-5{list-style-type:none}ul.lst-kix_5jdeieiov2jo-5{list-style-type:none}ul.lst-kix_p7f5jwyph9la-6{list-style-type:none}ul.lst-kix_q23adj2uc958-4{list-style-type:none}ul.lst-kix_5jdeieiov2jo-4{list-style-type:none}ul.lst-kix_p7f5jwyph9la-3{list-style-type:none}ul.lst-kix_q23adj2uc958-3{list-style-type:none}ul.lst-kix_5jdeieiov2jo-3{list-style-type:none}ul.lst-kix_p7f5jwyph9la-4{list-style-type:none}ul.lst-kix_q23adj2uc958-2{list-style-type:none}ul.lst-kix_5jdeieiov2jo-2{list-style-type:none}ul.lst-kix_p7f5jwyph9la-1{list-style-type:none}ul.lst-kix_q23adj2uc958-1{list-style-type:none}ul.lst-kix_5jdeieiov2jo-1{list-style-type:none}ul.lst-kix_p7f5jwyph9la-2{list-style-type:none}ul.lst-kix_q23adj2uc958-0{list-style-type:none}ul.lst-kix_5jdeieiov2jo-0{list-style-type:none}ul.lst-kix_p7f5jwyph9la-0{list-style-type:none}.lst-kix_bxc3fwagz9n4-8>li:before{content:"-  "}.lst-kix_2gc8wphbwguv-2>li:before{content:"-  "}.lst-kix_2gc8wphbwguv-3>li:before{content:"-  "}.lst-kix_bxc3fwagz9n4-5>li:before{content:"-  "}.lst-kix_bxc3fwagz9n4-3>li:before{content:"-  "}.lst-kix_bxc3fwagz9n4-7>li:before{content:"-  "}ul.lst-kix_p2too92sm296-8{list-style-type:none}ul.lst-kix_p2too92sm296-7{list-style-type:none}.lst-kix_q4t2lvjspjpq-0>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-0}ul.lst-kix_p2too92sm296-6{list-style-type:none}ul.lst-kix_p2too92sm296-5{list-style-type:none}ul.lst-kix_p2too92sm296-4{list-style-type:none}ul.lst-kix_p2too92sm296-3{list-style-type:none}ul.lst-kix_p2too92sm296-2{list-style-type:none}ul.lst-kix_p2too92sm296-1{list-style-type:none}ul.lst-kix_p2too92sm296-0{list-style-type:none}.lst-kix_p30vht8wkj5m-6>li:before{content:"-  "}ul.lst-kix_ihdvvcfkrodb-3{list-style-type:none}.lst-kix_bxc3fwagz9n4-1>li:before{content:"-  "}ul.lst-kix_ihdvvcfkrodb-4{list-style-type:none}ul.lst-kix_ihdvvcfkrodb-5{list-style-type:none}ul.lst-kix_ihdvvcfkrodb-6{list-style-type:none}.lst-kix_g7zmvzs33jh5-5>li:before{content:"-  "}ul.lst-kix_ihdvvcfkrodb-7{list-style-type:none}ul.lst-kix_ihdvvcfkrodb-8{list-style-type:none}.lst-kix_p30vht8wkj5m-8>li:before{content:"-  "}.lst-kix_fkidea160sgq-3>li:before{content:"-  "}.lst-kix_7ylkx0u6g7ty-8>li:before{content:"\0025a0   "}.lst-kix_g7zmvzs33jh5-3>li:before{content:"-  "}.lst-kix_g7zmvzs33jh5-1>li:before{content:"-  "}.lst-kix_fkidea160sgq-5>li:before{content:"-  "}.lst-kix_fkidea160sgq-7>li:before{content:"-  "}.lst-kix_qz2j3tgouhds-2>li:before{content:"\0025a0   "}ul.lst-kix_3pujr63wtigv-0{list-style-type:none}ul.lst-kix_3pujr63wtigv-1{list-style-type:none}.lst-kix_p7f5jwyph9la-8>li:before{content:"-  "}ul.lst-kix_3pujr63wtigv-2{list-style-type:none}.lst-kix_wlwlb53om0pz-7>li:before{content:"-  "}.lst-kix_qz2j3tgouhds-0>li:before{content:"\0025cf   "}.lst-kix_wlwlb53om0pz-5>li:before{content:"-  "}.lst-kix_p7f5jwyph9la-2>li:before{content:"-  "}.lst-kix_p7f5jwyph9la-4>li:before{content:"-  "}.lst-kix_gvjahu3muex0-1>li:before{content:"-  "}.lst-kix_mrbzpiod19zo-8>li:before{content:"\0025a0   "}.lst-kix_p7f5jwyph9la-6>li:before{content:"-  "}.lst-kix_wlwlb53om0pz-3>li:before{content:"-  "}.lst-kix_fkidea160sgq-1>li:before{content:"-  "}.lst-kix_g7zmvzs33jh5-7>li:before{content:"-  "}.lst-kix_gvjahu3muex0-5>li:before{content:"-  "}.lst-kix_wlwlb53om0pz-1>li:before{content:"-  "}ul.lst-kix_221b6f5jx36q-6{list-style-type:none}ul.lst-kix_221b6f5jx36q-5{list-style-type:none}.lst-kix_mrbzpiod19zo-6>li:before{content:"\0025cf   "}ul.lst-kix_221b6f5jx36q-8{list-style-type:none}.lst-kix_p7f5jwyph9la-0>li:before{content:"-  "}ul.lst-kix_221b6f5jx36q-7{list-style-type:none}.lst-kix_gvjahu3muex0-3>li:before{content:"-  "}.lst-kix_p30vht8wkj5m-4>li:before{content:"-  "}ul.lst-kix_3pujr63wtigv-7{list-style-type:none}ul.lst-kix_3pujr63wtigv-8{list-style-type:none}.lst-kix_mrbzpiod19zo-2>li:before{content:"\0025a0   "}.lst-kix_mrbzpiod19zo-4>li:before{content:"\0025cb   "}ul.lst-kix_221b6f5jx36q-0{list-style-type:none}.lst-kix_q4t2lvjspjpq-1>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-1}ul.lst-kix_3pujr63wtigv-3{list-style-type:none}ul.lst-kix_221b6f5jx36q-2{list-style-type:none}.lst-kix_q4t2lvjspjpq-7>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-7}ul.lst-kix_3pujr63wtigv-4{list-style-type:none}ul.lst-kix_221b6f5jx36q-1{list-style-type:none}ul.lst-kix_3pujr63wtigv-5{list-style-type:none}ul.lst-kix_221b6f5jx36q-4{list-style-type:none}ul.lst-kix_3pujr63wtigv-6{list-style-type:none}ul.lst-kix_221b6f5jx36q-3{list-style-type:none}.lst-kix_p30vht8wkj5m-2>li:before{content:"-  "}.lst-kix_mrbzpiod19zo-0>li:before{content:"\0025cf   "}.lst-kix_gvjahu3muex0-7>li:before{content:"-  "}.lst-kix_p30vht8wkj5m-0>li:before{content:"-  "}ol.lst-kix_q4t2lvjspjpq-2.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-2 0}.lst-kix_kjz3u1vwm87u-8>li:before{content:"\0025a0   "}.lst-kix_kwsfbh415ym3-2>li:before{content:"\0025a0   "}.lst-kix_kwsfbh415ym3-1>li:before{content:"\0025cb   "}.lst-kix_kjz3u1vwm87u-1>li:before{content:"\0025cb   "}.lst-kix_kjz3u1vwm87u-5>li:before{content:"\0025a0   "}.lst-kix_kjz3u1vwm87u-0>li:before{content:"\0025cf   "}.lst-kix_kjz3u1vwm87u-4>li:before{content:"\0025cb   "}ol.lst-kix_q4t2lvjspjpq-7.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-7 0}.lst-kix_7ylkx0u6g7ty-3>li:before{content:"\0025cf   "}ul.lst-kix_mkzc59ly2665-8{list-style-type:none}ul.lst-kix_mkzc59ly2665-7{list-style-type:none}ul.lst-kix_mkzc59ly2665-6{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-8.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-8 0}.lst-kix_7ylkx0u6g7ty-4>li:before{content:"\0025cb   "}.lst-kix_7ylkx0u6g7ty-7>li:before{content:"\0025cb   "}ul.lst-kix_ihdvvcfkrodb-0{list-style-type:none}ul.lst-kix_ihdvvcfkrodb-1{list-style-type:none}ul.lst-kix_ihdvvcfkrodb-2{list-style-type:none}ul.lst-kix_mkzc59ly2665-1{list-style-type:none}ul.lst-kix_mkzc59ly2665-0{list-style-type:none}ul.lst-kix_mkzc59ly2665-5{list-style-type:none}.lst-kix_kwsfbh415ym3-5>li:before{content:"\0025a0   "}ul.lst-kix_mkzc59ly2665-4{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-3.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-3 0}ul.lst-kix_mkzc59ly2665-3{list-style-type:none}ul.lst-kix_mkzc59ly2665-2{list-style-type:none}.lst-kix_kwsfbh415ym3-6>li:before{content:"\0025cf   "}ul.lst-kix_x0jk3p44hw5u-8{list-style-type:none}ul.lst-kix_x0jk3p44hw5u-7{list-style-type:none}ul.lst-kix_x0jk3p44hw5u-6{list-style-type:none}ul.lst-kix_x0jk3p44hw5u-5{list-style-type:none}.lst-kix_7ylkx0u6g7ty-0>li:before{content:"\0025cf   "}ul.lst-kix_x0jk3p44hw5u-4{list-style-type:none}ul.lst-kix_x0jk3p44hw5u-3{list-style-type:none}ul.lst-kix_x0jk3p44hw5u-2{list-style-type:none}ul.lst-kix_x0jk3p44hw5u-1{list-style-type:none}ul.lst-kix_x0jk3p44hw5u-0{list-style-type:none}.lst-kix_bxc3fwagz9n4-6>li:before{content:"-  "}.lst-kix_egm6q74cuc9v-2>li:before{content:"-  "}.lst-kix_trsgeol68xbv-5>li:before{content:"-  "}ul.lst-kix_h3censsvn827-3{list-style-type:none}ul.lst-kix_h3censsvn827-4{list-style-type:none}ul.lst-kix_h3censsvn827-1{list-style-type:none}ul.lst-kix_h3censsvn827-2{list-style-type:none}.lst-kix_p30vht8wkj5m-5>li:before{content:"-  "}ul.lst-kix_h3censsvn827-0{list-style-type:none}.lst-kix_bxc3fwagz9n4-2>li:before{content:"-  "}.lst-kix_q0pcv3qt6eh6-4>li:before{content:"\0025cb   "}ul.lst-kix_h3censsvn827-7{list-style-type:none}ul.lst-kix_h3censsvn827-8{list-style-type:none}ul.lst-kix_h3censsvn827-5{list-style-type:none}.lst-kix_g7zmvzs33jh5-6>li:before{content:"-  "}ul.lst-kix_h3censsvn827-6{list-style-type:none}.lst-kix_oa2l3fr3uhys-6>li:before{content:"-  "}.lst-kix_t083pgxhci1s-3>li:before{content:"\0025cf   "}.lst-kix_fkidea160sgq-4>li:before{content:"-  "}ol.lst-kix_q4t2lvjspjpq-4{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-5{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-6{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-7{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-0{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-1{list-style-type:none}.lst-kix_g7zmvzs33jh5-2>li:before{content:"-  "}ol.lst-kix_q4t2lvjspjpq-2{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-3{list-style-type:none}.lst-kix_fkidea160sgq-8>li:before{content:"-  "}.lst-kix_a9fzzv5qggwq-0>li:before{content:"-  "}.lst-kix_q0pcv3qt6eh6-0>li:before{content:"\0025cf   "}ul.lst-kix_tvemz69t9hcg-5{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-8{list-style-type:none}ul.lst-kix_tvemz69t9hcg-6{list-style-type:none}ul.lst-kix_tvemz69t9hcg-7{list-style-type:none}ul.lst-kix_tvemz69t9hcg-8{list-style-type:none}ul.lst-kix_tvemz69t9hcg-1{list-style-type:none}ul.lst-kix_tvemz69t9hcg-2{list-style-type:none}.lst-kix_jap2f8dnznr2-7>li:before{content:"\0025cb   "}ul.lst-kix_tvemz69t9hcg-3{list-style-type:none}ul.lst-kix_tvemz69t9hcg-4{list-style-type:none}ul.lst-kix_tvemz69t9hcg-0{list-style-type:none}.lst-kix_a9fzzv5qggwq-8>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-6>li:before{content:"-  "}.lst-kix_j5i0nqyw0am7-7>li:before{content:"\0025cb   "}.lst-kix_qz2j3tgouhds-1>li:before{content:"\0025cb   "}.lst-kix_jap2f8dnznr2-3>li:before{content:"\0025cf   "}.lst-kix_wlwlb53om0pz-6>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-2>li:before{content:"-  "}.lst-kix_a9fzzv5qggwq-4>li:before{content:"-  "}.lst-kix_wlwlb53om0pz-2>li:before{content:"-  "}.lst-kix_t083pgxhci1s-7>li:before{content:"\0025cb   "}.lst-kix_h75p68dox4pl-3>li:before{content:"-  "}.lst-kix_gvjahu3muex0-0>li:before{content:"-  "}.lst-kix_p7f5jwyph9la-5>li:before{content:"-  "}ul.lst-kix_6tiajzogwgui-8{list-style-type:none}.lst-kix_gvjahu3muex0-4>li:before{content:"-  "}ul.lst-kix_6tiajzogwgui-7{list-style-type:none}.lst-kix_fkidea160sgq-0>li:before{content:"-  "}.lst-kix_q0pcv3qt6eh6-8>li:before{content:"\0025a0   "}ul.lst-kix_6tiajzogwgui-0{list-style-type:none}ul.lst-kix_6tiajzogwgui-2{list-style-type:none}ul.lst-kix_6tiajzogwgui-1{list-style-type:none}.lst-kix_mrbzpiod19zo-5>li:before{content:"\0025a0   "}ul.lst-kix_6tiajzogwgui-4{list-style-type:none}ul.lst-kix_6tiajzogwgui-3{list-style-type:none}ul.lst-kix_6tiajzogwgui-6{list-style-type:none}.lst-kix_p7f5jwyph9la-1>li:before{content:"-  "}.lst-kix_oa2l3fr3uhys-2>li:before{content:"-  "}ul.lst-kix_6tiajzogwgui-5{list-style-type:none}.lst-kix_msbub8o3wjpn-7>li:before{content:"-  "}ul.lst-kix_q869v7lwxxb1-0{list-style-type:none}ul.lst-kix_q869v7lwxxb1-1{list-style-type:none}ul.lst-kix_q869v7lwxxb1-2{list-style-type:none}ul.lst-kix_q869v7lwxxb1-3{list-style-type:none}.lst-kix_j5i0nqyw0am7-3>li:before{content:"\0025cf   "}ul.lst-kix_q869v7lwxxb1-8{list-style-type:none}.lst-kix_trsgeol68xbv-1>li:before{content:"-  "}.lst-kix_gvjahu3muex0-8>li:before{content:"-  "}.lst-kix_p30vht8wkj5m-1>li:before{content:"-  "}.lst-kix_mrbzpiod19zo-1>li:before{content:"\0025cb   "}ul.lst-kix_q869v7lwxxb1-4{list-style-type:none}ul.lst-kix_q869v7lwxxb1-5{list-style-type:none}ul.lst-kix_q869v7lwxxb1-6{list-style-type:none}.lst-kix_egm6q74cuc9v-6>li:before{content:"-  "}ul.lst-kix_q869v7lwxxb1-7{list-style-type:none}.lst-kix_msbub8o3wjpn-3>li:before{content:"-  "}.lst-kix_o8wa98pl356e-2>li:before{content:"\0025a0   "}.lst-kix_o8wa98pl356e-3>li:before{content:"\0025cf   "}ul.lst-kix_egm6q74cuc9v-6{list-style-type:none}.lst-kix_fdn2s47zlbp2-5>li:before{content:"\0025a0   "}ul.lst-kix_egm6q74cuc9v-7{list-style-type:none}ul.lst-kix_egm6q74cuc9v-8{list-style-type:none}.lst-kix_fdn2s47zlbp2-4>li:before{content:"\0025cb   "}.lst-kix_o8wa98pl356e-0>li:before{content:"\0025cf   "}.lst-kix_q4t2lvjspjpq-6>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-6}ul.lst-kix_btor5fghjhg-1{list-style-type:none}.lst-kix_fdn2s47zlbp2-7>li:before{content:"\0025cb   "}ul.lst-kix_trsgeol68xbv-6{list-style-type:none}ul.lst-kix_btor5fghjhg-2{list-style-type:none}ul.lst-kix_trsgeol68xbv-5{list-style-type:none}ul.lst-kix_trsgeol68xbv-4{list-style-type:none}ul.lst-kix_btor5fghjhg-0{list-style-type:none}ul.lst-kix_trsgeol68xbv-3{list-style-type:none}ul.lst-kix_btor5fghjhg-5{list-style-type:none}ul.lst-kix_trsgeol68xbv-2{list-style-type:none}ul.lst-kix_btor5fghjhg-6{list-style-type:none}ul.lst-kix_trsgeol68xbv-1{list-style-type:none}.lst-kix_o8wa98pl356e-5>li:before{content:"\0025a0   "}ul.lst-kix_btor5fghjhg-3{list-style-type:none}.lst-kix_ueh9c2uprout-8>li:before{content:"\0025a0   "}ul.lst-kix_trsgeol68xbv-0{list-style-type:none}ul.lst-kix_btor5fghjhg-4{list-style-type:none}ul.lst-kix_btor5fghjhg-7{list-style-type:none}ul.lst-kix_btor5fghjhg-8{list-style-type:none}.lst-kix_ueh9c2uprout-5>li:before{content:"\0025a0   "}.lst-kix_ueh9c2uprout-3>li:before{content:"\0025cf   "}ul.lst-kix_egm6q74cuc9v-2{list-style-type:none}ul.lst-kix_egm6q74cuc9v-3{list-style-type:none}ul.lst-kix_egm6q74cuc9v-4{list-style-type:none}ul.lst-kix_egm6q74cuc9v-5{list-style-type:none}ul.lst-kix_egm6q74cuc9v-0{list-style-type:none}.lst-kix_fdn2s47zlbp2-2>li:before{content:"\0025a0   "}ul.lst-kix_egm6q74cuc9v-1{list-style-type:none}.lst-kix_h75p68dox4pl-5>li:before{content:"-  "}.lst-kix_p2too92sm296-1>li:before{content:"-  "}.lst-kix_p2too92sm296-3>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-8>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-8,lower-roman) ". "}.lst-kix_ueh9c2uprout-2>li:before{content:"\0025a0   "}.lst-kix_h75p68dox4pl-8>li:before{content:"-  "}.lst-kix_ueh9c2uprout-0>li:before{content:"\0025cf   "}.lst-kix_p2too92sm296-0>li:before{content:"-  "}.lst-kix_o8wa98pl356e-8>li:before{content:"\0025a0   "}.lst-kix_icgoe51cc7fx-8>li:before{content:"-  "}ol.lst-kix_q4t2lvjspjpq-4.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-4 0}ul.lst-kix_u2lsbidcbmgf-8{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-7{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-6{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-5{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-0{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-4{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-3{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-2{list-style-type:none}ul.lst-kix_u2lsbidcbmgf-1{list-style-type:none}.lst-kix_icgoe51cc7fx-5>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-3>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-3,decimal) ". "}.lst-kix_q4t2lvjspjpq-6>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-6,decimal) ". "}.lst-kix_icgoe51cc7fx-3>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-5>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-5,lower-roman) ". "}.lst-kix_icgoe51cc7fx-2>li:before{content:"-  "}.lst-kix_x0jk3p44hw5u-7>li:before{content:"\0025cb   "}.lst-kix_tltyda7lmar-4>li:before{content:"-  "}.lst-kix_x0jk3p44hw5u-6>li:before{content:"\0025cf   "}.lst-kix_p2too92sm296-6>li:before{content:"-  "}.lst-kix_tltyda7lmar-3>li:before{content:"-  "}.lst-kix_icgoe51cc7fx-0>li:before{content:"-  "}.lst-kix_x0jk3p44hw5u-4>li:before{content:"\0025cb   "}.lst-kix_p2too92sm296-8>li:before{content:"-  "}.lst-kix_tltyda7lmar-1>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-0>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-0,decimal) ". "}ul.lst-kix_trsgeol68xbv-8{list-style-type:none}ul.lst-kix_trsgeol68xbv-7{list-style-type:none}.lst-kix_x0jk3p44hw5u-1>li:before{content:"\0025cb   "}ul.lst-kix_icgoe51cc7fx-7{list-style-type:none}ul.lst-kix_icgoe51cc7fx-8{list-style-type:none}.lst-kix_egm6q74cuc9v-3>li:before{content:"-  "}.lst-kix_j8rp27y1qsm4-5>li:before{content:"-  "}.lst-kix_j8rp27y1qsm4-7>li:before{content:"-  "}.lst-kix_oa2l3fr3uhys-3>li:before{content:"-  "}.lst-kix_trsgeol68xbv-6>li:before{content:"-  "}.lst-kix_r40efdz54ogr-1>li:before{content:"-  "}ul.lst-kix_icgoe51cc7fx-3{list-style-type:none}ul.lst-kix_icgoe51cc7fx-4{list-style-type:none}ul.lst-kix_icgoe51cc7fx-5{list-style-type:none}.lst-kix_oa2l3fr3uhys-5>li:before{content:"-  "}.lst-kix_trsgeol68xbv-8>li:before{content:"-  "}.lst-kix_tltyda7lmar-6>li:before{content:"-  "}ul.lst-kix_icgoe51cc7fx-6{list-style-type:none}ul.lst-kix_icgoe51cc7fx-0{list-style-type:none}.lst-kix_r40efdz54ogr-3>li:before{content:"-  "}ul.lst-kix_icgoe51cc7fx-1{list-style-type:none}.lst-kix_q0pcv3qt6eh6-5>li:before{content:"\0025a0   "}ul.lst-kix_icgoe51cc7fx-2{list-style-type:none}.lst-kix_q4t2lvjspjpq-2>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-2}.lst-kix_t083pgxhci1s-0>li:before{content:"\0025cf   "}ul.lst-kix_2gc8wphbwguv-2{list-style-type:none}.lst-kix_yumyju3ufa7r-1>li:before{content:"-  "}ul.lst-kix_2gc8wphbwguv-1{list-style-type:none}.lst-kix_cnptvq8snb6-7>li:before{content:"-  "}.lst-kix_aqslecbmrlt9-2>li:before{content:"-  "}ul.lst-kix_2gc8wphbwguv-0{list-style-type:none}ul.lst-kix_p30vht8wkj5m-1{list-style-type:none}ul.lst-kix_p30vht8wkj5m-0{list-style-type:none}ul.lst-kix_p30vht8wkj5m-3{list-style-type:none}ul.lst-kix_p30vht8wkj5m-2{list-style-type:none}ul.lst-kix_p30vht8wkj5m-5{list-style-type:none}ul.lst-kix_p30vht8wkj5m-4{list-style-type:none}.lst-kix_t083pgxhci1s-2>li:before{content:"\0025a0   "}ul.lst-kix_p30vht8wkj5m-7{list-style-type:none}ul.lst-kix_p30vht8wkj5m-6{list-style-type:none}ul.lst-kix_2gc8wphbwguv-8{list-style-type:none}ul.lst-kix_2gc8wphbwguv-7{list-style-type:none}ul.lst-kix_p30vht8wkj5m-8{list-style-type:none}ul.lst-kix_2gc8wphbwguv-6{list-style-type:none}ul.lst-kix_2gc8wphbwguv-5{list-style-type:none}.lst-kix_aqslecbmrlt9-4>li:before{content:"-  "}ul.lst-kix_2gc8wphbwguv-4{list-style-type:none}ul.lst-kix_2gc8wphbwguv-3{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-1.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-1 0}.lst-kix_jap2f8dnznr2-8>li:before{content:"\0025a0   "}.lst-kix_lzhtiajxbsta-7>li:before{content:"-  "}.lst-kix_iwx9fy5rmt9t-3>li:before{content:"-  "}.lst-kix_221b6f5jx36q-6>li:before{content:"-  "}.lst-kix_tvemz69t9hcg-1>li:before{content:"-  "}.lst-kix_a9fzzv5qggwq-7>li:before{content:"-  "}.lst-kix_221b6f5jx36q-8>li:before{content:"-  "}.lst-kix_u2lsbidcbmgf-3>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-1>li:before{content:"-  "}.lst-kix_iwx9fy5rmt9t-5>li:before{content:"-  "}.lst-kix_tvemz69t9hcg-3>li:before{content:"-  "}.lst-kix_99s8j2ra9jm-5>li:before{content:"-  "}.lst-kix_jap2f8dnznr2-2>li:before{content:"\0025a0   "}.lst-kix_6o4qqgfnm1cp-0>li:before{content:"-  "}.lst-kix_t083pgxhci1s-8>li:before{content:"\0025a0   "}.lst-kix_99s8j2ra9jm-7>li:before{content:"-  "}.lst-kix_u2lsbidcbmgf-5>li:before{content:"-  "}.lst-kix_6o4qqgfnm1cp-2>li:before{content:"-  "}.lst-kix_h75p68dox4pl-2>li:before{content:"-  "}.lst-kix_jap2f8dnznr2-0>li:before{content:"\0025cf   "}.lst-kix_cnptvq8snb6-1>li:before{content:"-  "}.lst-kix_a9fzzv5qggwq-5>li:before{content:"-  "}.lst-kix_yumyju3ufa7r-7>li:before{content:"-  "}.lst-kix_i7bmre9bc3e8-0>li:before{content:"-  "}.lst-kix_q0pcv3qt6eh6-7>li:before{content:"\0025cb   "}ul.lst-kix_a9fzzv5qggwq-6{list-style-type:none}ul.lst-kix_a9fzzv5qggwq-5{list-style-type:none}.lst-kix_h75p68dox4pl-0>li:before{content:"-  "}ul.lst-kix_a9fzzv5qggwq-4{list-style-type:none}.lst-kix_msbub8o3wjpn-6>li:before{content:"-  "}ul.lst-kix_a9fzzv5qggwq-3{list-style-type:none}ul.lst-kix_a9fzzv5qggwq-8{list-style-type:none}ul.lst-kix_a9fzzv5qggwq-7{list-style-type:none}ul.lst-kix_cnptvq8snb6-1{list-style-type:none}.lst-kix_i7bmre9bc3e8-6>li:before{content:"-  "}ul.lst-kix_cnptvq8snb6-0{list-style-type:none}ul.lst-kix_cnptvq8snb6-3{list-style-type:none}ul.lst-kix_cnptvq8snb6-2{list-style-type:none}.lst-kix_msbub8o3wjpn-4>li:before{content:"-  "}ul.lst-kix_cnptvq8snb6-8{list-style-type:none}.lst-kix_trsgeol68xbv-0>li:before{content:"-  "}.lst-kix_j5i0nqyw0am7-4>li:before{content:"\0025cb   "}.lst-kix_j5i0nqyw0am7-6>li:before{content:"\0025cf   "}.lst-kix_egm6q74cuc9v-5>li:before{content:"-  "}ul.lst-kix_cnptvq8snb6-5{list-style-type:none}.lst-kix_6o4qqgfnm1cp-8>li:before{content:"-  "}ul.lst-kix_cnptvq8snb6-4{list-style-type:none}ul.lst-kix_cnptvq8snb6-7{list-style-type:none}ul.lst-kix_cnptvq8snb6-6{list-style-type:none}.lst-kix_ihdvvcfkrodb-1>li:before{content:"-  "}.lst-kix_q23adj2uc958-6>li:before{content:"-  "}.lst-kix_ihdvvcfkrodb-4>li:before{content:"-  "}.lst-kix_5jdeieiov2jo-4>li:before{content:"-  "}ul.lst-kix_a9fzzv5qggwq-2{list-style-type:none}ul.lst-kix_a9fzzv5qggwq-1{list-style-type:none}ul.lst-kix_a9fzzv5qggwq-0{list-style-type:none}.lst-kix_kwsfbh415ym3-3>li:before{content:"\0025cf   "}.lst-kix_5jdeieiov2jo-1>li:before{content:"-  "}.lst-kix_kwsfbh415ym3-0>li:before{content:"\0025cf   "}.lst-kix_kjz3u1vwm87u-7>li:before{content:"\0025cb   "}.lst-kix_mkzc59ly2665-6>li:before{content:"\0025cf   "}.lst-kix_kjz3u1vwm87u-2>li:before{content:"\0025a0   "}.lst-kix_btor5fghjhg-1>li:before{content:"-  "}.lst-kix_221b6f5jx36q-3>li:before{content:"-  "}.lst-kix_69r3ohbhz155-7>li:before{content:"-  "}.lst-kix_69r3ohbhz155-4>li:before{content:"-  "}.lst-kix_221b6f5jx36q-0>li:before{content:"-  "}.lst-kix_kgqfxit2qc9l-8>li:before{content:"\0025a0   "}.lst-kix_btor5fghjhg-6>li:before{content:"-  "}.lst-kix_7ylkx0u6g7ty-2>li:before{content:"\0025a0   "}.lst-kix_6tiajzogwgui-7>li:before{content:"\0025cb   "}.lst-kix_6tiajzogwgui-4>li:before{content:"\0025cb   "}.lst-kix_7ylkx0u6g7ty-5>li:before{content:"\0025a0   "}.lst-kix_kgqfxit2qc9l-3>li:before{content:"\0025cf   "}.lst-kix_kgqfxit2qc9l-0>li:before{content:"\0025cf   "}.lst-kix_3pujr63wtigv-6>li:before{content:"-  "}.lst-kix_kwsfbh415ym3-8>li:before{content:"\0025a0   "}.lst-kix_q23adj2uc958-1>li:before{content:"-  "}.lst-kix_3pujr63wtigv-3>li:before{content:"-  "}.lst-kix_egm6q74cuc9v-8>li:before{content:"-  "}.lst-kix_q869v7lwxxb1-5>li:before{content:"-  "}.lst-kix_j8rp27y1qsm4-2>li:before{content:"-  "}ul.lst-kix_iwx9fy5rmt9t-0{list-style-type:none}ul.lst-kix_iwx9fy5rmt9t-1{list-style-type:none}ul.lst-kix_iwx9fy5rmt9t-2{list-style-type:none}.lst-kix_q0pcv3qt6eh6-2>li:before{content:"\0025a0   "}ul.lst-kix_iwx9fy5rmt9t-3{list-style-type:none}ul.lst-kix_iwx9fy5rmt9t-4{list-style-type:none}ul.lst-kix_iwx9fy5rmt9t-5{list-style-type:none}ul.lst-kix_iwx9fy5rmt9t-6{list-style-type:none}.lst-kix_egm6q74cuc9v-0>li:before{content:"-  "}ul.lst-kix_iwx9fy5rmt9t-7{list-style-type:none}ul.lst-kix_iwx9fy5rmt9t-8{list-style-type:none}.lst-kix_bxc3fwagz9n4-0>li:before{content:"-  "}.lst-kix_yumyju3ufa7r-4>li:before{content:"-  "}.lst-kix_fkidea160sgq-2>li:before{content:"-  "}.lst-kix_g7zmvzs33jh5-4>li:before{content:"-  "}.lst-kix_oa2l3fr3uhys-8>li:before{content:"-  "}.lst-kix_r40efdz54ogr-6>li:before{content:"-  "}ul.lst-kix_qz2j3tgouhds-5{list-style-type:none}ul.lst-kix_qz2j3tgouhds-6{list-style-type:none}ul.lst-kix_qz2j3tgouhds-7{list-style-type:none}ul.lst-kix_qz2j3tgouhds-8{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-0{list-style-type:none}ul.lst-kix_qz2j3tgouhds-1{list-style-type:none}.lst-kix_aqslecbmrlt9-7>li:before{content:"-  "}ul.lst-kix_qz2j3tgouhds-2{list-style-type:none}ul.lst-kix_qz2j3tgouhds-3{list-style-type:none}ul.lst-kix_qz2j3tgouhds-4{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-4{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-3{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-2{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-1{list-style-type:none}ul.lst-kix_qz2j3tgouhds-0{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-8{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-7{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-6{list-style-type:none}ul.lst-kix_cbtueh1ca0aa-5{list-style-type:none}.lst-kix_u2lsbidcbmgf-0>li:before{content:"-  "}.lst-kix_6o4qqgfnm1cp-5>li:before{content:"-  "}.lst-kix_jap2f8dnznr2-5>li:before{content:"\0025a0   "}.lst-kix_j5i0nqyw0am7-1>li:before{content:"\0025cb   "}.lst-kix_wlwlb53om0pz-4>li:before{content:"-  "}.lst-kix_a9fzzv5qggwq-2>li:before{content:"-  "}.lst-kix_cnptvq8snb6-4>li:before{content:"-  "}.lst-kix_u2lsbidcbmgf-8>li:before{content:"-  "}.lst-kix_p7f5jwyph9la-3>li:before{content:"-  "}.lst-kix_tvemz69t9hcg-6>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-4>li:before{content:"-  "}.lst-kix_t083pgxhci1s-5>li:before{content:"\0025a0   "}.lst-kix_iwx9fy5rmt9t-0>li:before{content:"-  "}.lst-kix_gvjahu3muex0-2>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-1>li:before{content:"-  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_cbtueh1ca0aa-2>li:before{content:"-  "}ul.lst-kix_gvjahu3muex0-1{list-style-type:none}.lst-kix_mrbzpiod19zo-3>li:before{content:"\0025cf   "}ul.lst-kix_gvjahu3muex0-0{list-style-type:none}ul.lst-kix_gvjahu3muex0-3{list-style-type:none}ul.lst-kix_gvjahu3muex0-2{list-style-type:none}.lst-kix_p30vht8wkj5m-3>li:before{content:"-  "}.lst-kix_oa2l3fr3uhys-0>li:before{content:"-  "}.lst-kix_trsgeol68xbv-3>li:before{content:"-  "}.lst-kix_msbub8o3wjpn-1>li:before{content:"-  "}ul.lst-kix_gvjahu3muex0-8{list-style-type:none}.lst-kix_99s8j2ra9jm-2>li:before{content:"-  "}ul.lst-kix_gvjahu3muex0-5{list-style-type:none}.lst-kix_ajyhxuww45wt-5>li:before{content:"-  "}.lst-kix_i7bmre9bc3e8-3>li:before{content:"-  "}ul.lst-kix_gvjahu3muex0-4{list-style-type:none}.lst-kix_iwx9fy5rmt9t-8>li:before{content:"-  "}ul.lst-kix_gvjahu3muex0-7{list-style-type:none}ul.lst-kix_gvjahu3muex0-6{list-style-type:none}ul.lst-kix_t083pgxhci1s-6{list-style-type:none}ul.lst-kix_t083pgxhci1s-5{list-style-type:none}ul.lst-kix_t083pgxhci1s-4{list-style-type:none}ul.lst-kix_t083pgxhci1s-3{list-style-type:none}ul.lst-kix_t083pgxhci1s-8{list-style-type:none}ul.lst-kix_t083pgxhci1s-7{list-style-type:none}ul.lst-kix_t083pgxhci1s-2{list-style-type:none}ul.lst-kix_t083pgxhci1s-1{list-style-type:none}ul.lst-kix_t083pgxhci1s-0{list-style-type:none}.lst-kix_cbtueh1ca0aa-7>li:before{content:"-  "}.lst-kix_cbtueh1ca0aa-8>li:before{content:"-  "}.lst-kix_cbtueh1ca0aa-5>li:before{content:"-  "}.lst-kix_cbtueh1ca0aa-6>li:before{content:"-  "}.lst-kix_h3censsvn827-0>li:before{content:"-  "}.lst-kix_eedhc8porvzr-1>li:before{content:"\0025cb   "}.lst-kix_h3censsvn827-1>li:before{content:"-  "}.lst-kix_eedhc8porvzr-0>li:before{content:"\0025cf   "}.lst-kix_eedhc8porvzr-4>li:before{content:"\0025cb   "}.lst-kix_h3censsvn827-3>li:before{content:"-  "}.lst-kix_eedhc8porvzr-3>li:before{content:"\0025cf   "}.lst-kix_h3censsvn827-2>li:before{content:"-  "}.lst-kix_eedhc8porvzr-2>li:before{content:"\0025a0   "}.lst-kix_eedhc8porvzr-7>li:before{content:"\0025cb   "}.lst-kix_eedhc8porvzr-8>li:before{content:"\0025a0   "}.lst-kix_eedhc8porvzr-5>li:before{content:"\0025a0   "}.lst-kix_eedhc8porvzr-6>li:before{content:"\0025cf   "}ul.lst-kix_jap2f8dnznr2-6{list-style-type:none}ul.lst-kix_jap2f8dnznr2-7{list-style-type:none}ul.lst-kix_jap2f8dnznr2-4{list-style-type:none}ul.lst-kix_jap2f8dnznr2-5{list-style-type:none}ul.lst-kix_jap2f8dnznr2-2{list-style-type:none}ul.lst-kix_jap2f8dnznr2-3{list-style-type:none}ul.lst-kix_jap2f8dnznr2-0{list-style-type:none}ul.lst-kix_jap2f8dnznr2-1{list-style-type:none}.lst-kix_h3censsvn827-8>li:before{content:"-  "}.lst-kix_h3censsvn827-7>li:before{content:"-  "}ul.lst-kix_99s8j2ra9jm-0{list-style-type:none}.lst-kix_h3censsvn827-4>li:before{content:"-  "}ul.lst-kix_99s8j2ra9jm-4{list-style-type:none}ul.lst-kix_99s8j2ra9jm-3{list-style-type:none}.lst-kix_h3censsvn827-5>li:before{content:"-  "}ul.lst-kix_99s8j2ra9jm-2{list-style-type:none}ul.lst-kix_99s8j2ra9jm-1{list-style-type:none}.lst-kix_h3censsvn827-6>li:before{content:"-  "}ul.lst-kix_99s8j2ra9jm-8{list-style-type:none}ul.lst-kix_99s8j2ra9jm-7{list-style-type:none}ul.lst-kix_jap2f8dnznr2-8{list-style-type:none}ul.lst-kix_99s8j2ra9jm-6{list-style-type:none}ul.lst-kix_99s8j2ra9jm-5{list-style-type:none}.lst-kix_q869v7lwxxb1-6>li:before{content:"-  "}.lst-kix_q869v7lwxxb1-8>li:before{content:"-  "}.lst-kix_q869v7lwxxb1-7>li:before{content:"-  "}.lst-kix_q869v7lwxxb1-2>li:before{content:"-  "}.lst-kix_q869v7lwxxb1-4>li:before{content:"-  "}ul.lst-kix_yumyju3ufa7r-8{list-style-type:none}ul.lst-kix_yumyju3ufa7r-7{list-style-type:none}ul.lst-kix_yumyju3ufa7r-6{list-style-type:none}ul.lst-kix_yumyju3ufa7r-5{list-style-type:none}ul.lst-kix_yumyju3ufa7r-4{list-style-type:none}ul.lst-kix_yumyju3ufa7r-3{list-style-type:none}.lst-kix_q869v7lwxxb1-0>li:before{content:"-  "}ul.lst-kix_yumyju3ufa7r-2{list-style-type:none}ul.lst-kix_yumyju3ufa7r-1{list-style-type:none}ul.lst-kix_yumyju3ufa7r-0{list-style-type:none}ul.lst-kix_kwsfbh415ym3-2{list-style-type:none}ul.lst-kix_kwsfbh415ym3-1{list-style-type:none}ul.lst-kix_kwsfbh415ym3-4{list-style-type:none}ul.lst-kix_kwsfbh415ym3-3{list-style-type:none}ul.lst-kix_kwsfbh415ym3-0{list-style-type:none}ul.lst-kix_kwsfbh415ym3-6{list-style-type:none}ul.lst-kix_kwsfbh415ym3-5{list-style-type:none}ul.lst-kix_kwsfbh415ym3-8{list-style-type:none}ul.lst-kix_kwsfbh415ym3-7{list-style-type:none}ul.lst-kix_6o4qqgfnm1cp-7{list-style-type:none}ul.lst-kix_6o4qqgfnm1cp-6{list-style-type:none}ul.lst-kix_6o4qqgfnm1cp-5{list-style-type:none}.lst-kix_mkzc59ly2665-3>li:before{content:"\0025cf   "}ul.lst-kix_6o4qqgfnm1cp-4{list-style-type:none}ul.lst-kix_6o4qqgfnm1cp-8{list-style-type:none}.lst-kix_mkzc59ly2665-1>li:before{content:"\0025cb   "}ul.lst-kix_6o4qqgfnm1cp-3{list-style-type:none}ol.lst-kix_q4t2lvjspjpq-0.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-0 0}ul.lst-kix_6o4qqgfnm1cp-2{list-style-type:none}ul.lst-kix_6o4qqgfnm1cp-1{list-style-type:none}ul.lst-kix_6o4qqgfnm1cp-0{list-style-type:none}.lst-kix_cbtueh1ca0aa-1>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-0>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-2>li:before{content:"-  "}ul.lst-kix_g7zmvzs33jh5-6{list-style-type:none}ul.lst-kix_g7zmvzs33jh5-7{list-style-type:none}ul.lst-kix_g7zmvzs33jh5-8{list-style-type:none}.lst-kix_ajyhxuww45wt-0>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-4>li:before{content:"-  "}.lst-kix_cbtueh1ca0aa-3>li:before{content:"-  "}.lst-kix_ajyhxuww45wt-2>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-8>li:before{content:"-  "}.lst-kix_ajyhxuww45wt-4>li:before{content:"-  "}.lst-kix_ajyhxuww45wt-8>li:before{content:"-  "}ul.lst-kix_g7zmvzs33jh5-2{list-style-type:none}ul.lst-kix_g7zmvzs33jh5-3{list-style-type:none}ul.lst-kix_g7zmvzs33jh5-4{list-style-type:none}.lst-kix_8mljvtb7hb4g-6>li:before{content:"-  "}ul.lst-kix_g7zmvzs33jh5-5{list-style-type:none}ul.lst-kix_g7zmvzs33jh5-0{list-style-type:none}.lst-kix_ajyhxuww45wt-6>li:before{content:"-  "}ul.lst-kix_g7zmvzs33jh5-1{list-style-type:none}.lst-kix_q23adj2uc958-8>li:before{content:"-  "}.lst-kix_ihdvvcfkrodb-2>li:before{content:"-  "}.lst-kix_ihdvvcfkrodb-3>li:before{content:"-  "}.lst-kix_ihdvvcfkrodb-6>li:before{content:"-  "}.lst-kix_q23adj2uc958-7>li:before{content:"-  "}.lst-kix_i7bmre9bc3e8-8>li:before{content:"-  "}.lst-kix_5jdeieiov2jo-3>li:before{content:"-  "}.lst-kix_5jdeieiov2jo-2>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-5>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-5}.lst-kix_6tiajzogwgui-1>li:before{content:"\0025cb   "}.lst-kix_5jdeieiov2jo-6>li:before{content:"-  "}.lst-kix_mkzc59ly2665-4>li:before{content:"\0025cb   "}.lst-kix_6tiajzogwgui-2>li:before{content:"\0025a0   "}.lst-kix_5jdeieiov2jo-7>li:before{content:"-  "}.lst-kix_ihdvvcfkrodb-7>li:before{content:"-  "}.lst-kix_mkzc59ly2665-7>li:before{content:"\0025cb   "}.lst-kix_mkzc59ly2665-8>li:before{content:"\0025a0   "}.lst-kix_69r3ohbhz155-6>li:before{content:"-  "}.lst-kix_69r3ohbhz155-5>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-3>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-3}.lst-kix_221b6f5jx36q-2>li:before{content:"-  "}.lst-kix_btor5fghjhg-0>li:before{content:"-  "}.lst-kix_btor5fghjhg-4>li:before{content:"-  "}.lst-kix_69r3ohbhz155-2>li:before{content:"-  "}.lst-kix_221b6f5jx36q-1>li:before{content:"-  "}.lst-kix_69r3ohbhz155-1>li:before{content:"-  "}.lst-kix_kgqfxit2qc9l-6>li:before{content:"\0025cf   "}.lst-kix_btor5fghjhg-7>li:before{content:"-  "}.lst-kix_kgqfxit2qc9l-2>li:before{content:"\0025a0   "}.lst-kix_6tiajzogwgui-5>li:before{content:"\0025a0   "}.lst-kix_kgqfxit2qc9l-1>li:before{content:"\0025cb   "}.lst-kix_kgqfxit2qc9l-5>li:before{content:"\0025a0   "}.lst-kix_btor5fghjhg-3>li:before{content:"-  "}.lst-kix_6tiajzogwgui-6>li:before{content:"\0025cf   "}ul.lst-kix_fkidea160sgq-7{list-style-type:none}.lst-kix_3pujr63wtigv-4>li:before{content:"-  "}ul.lst-kix_fkidea160sgq-8{list-style-type:none}ul.lst-kix_fkidea160sgq-3{list-style-type:none}ul.lst-kix_fkidea160sgq-4{list-style-type:none}ul.lst-kix_fkidea160sgq-5{list-style-type:none}.lst-kix_3pujr63wtigv-1>li:before{content:"-  "}.lst-kix_3pujr63wtigv-5>li:before{content:"-  "}ul.lst-kix_fkidea160sgq-6{list-style-type:none}.lst-kix_3pujr63wtigv-0>li:before{content:"-  "}.lst-kix_3pujr63wtigv-8>li:before{content:"-  "}.lst-kix_q23adj2uc958-0>li:before{content:"-  "}.lst-kix_btor5fghjhg-8>li:before{content:"-  "}.lst-kix_q23adj2uc958-4>li:before{content:"-  "}ul.lst-kix_fkidea160sgq-0{list-style-type:none}ul.lst-kix_fkidea160sgq-1{list-style-type:none}ul.lst-kix_fkidea160sgq-2{list-style-type:none}.lst-kix_q23adj2uc958-3>li:before{content:"-  "}ul.lst-kix_mrbzpiod19zo-0{list-style-type:none}.lst-kix_j8rp27y1qsm4-0>li:before{content:"-  "}ol.lst-kix_q4t2lvjspjpq-6.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-6 0}ul.lst-kix_mrbzpiod19zo-6{list-style-type:none}ul.lst-kix_mrbzpiod19zo-5{list-style-type:none}ul.lst-kix_mrbzpiod19zo-8{list-style-type:none}ul.lst-kix_mrbzpiod19zo-7{list-style-type:none}.lst-kix_r40efdz54ogr-0>li:before{content:"-  "}ul.lst-kix_mrbzpiod19zo-2{list-style-type:none}ul.lst-kix_mrbzpiod19zo-1{list-style-type:none}ul.lst-kix_mrbzpiod19zo-4{list-style-type:none}ul.lst-kix_mrbzpiod19zo-3{list-style-type:none}.lst-kix_q869v7lwxxb1-3>li:before{content:"-  "}.lst-kix_r40efdz54ogr-4>li:before{content:"-  "}.lst-kix_j8rp27y1qsm4-4>li:before{content:"-  "}.lst-kix_j8rp27y1qsm4-8>li:before{content:"-  "}.lst-kix_aqslecbmrlt9-1>li:before{content:"-  "}.lst-kix_tltyda7lmar-7>li:before{content:"-  "}.lst-kix_r40efdz54ogr-8>li:before{content:"-  "}.lst-kix_cnptvq8snb6-6>li:before{content:"-  "}.lst-kix_yumyju3ufa7r-2>li:before{content:"-  "}.lst-kix_aqslecbmrlt9-5>li:before{content:"-  "}ul.lst-kix_ueh9c2uprout-3{list-style-type:none}.lst-kix_6o4qqgfnm1cp-7>li:before{content:"-  "}ul.lst-kix_ueh9c2uprout-2{list-style-type:none}.lst-kix_iwx9fy5rmt9t-2>li:before{content:"-  "}ul.lst-kix_ueh9c2uprout-5{list-style-type:none}.lst-kix_221b6f5jx36q-5>li:before{content:"-  "}ul.lst-kix_ueh9c2uprout-4{list-style-type:none}ul.lst-kix_ueh9c2uprout-7{list-style-type:none}.lst-kix_tvemz69t9hcg-0>li:before{content:"-  "}.lst-kix_tvemz69t9hcg-4>li:before{content:"-  "}ul.lst-kix_ueh9c2uprout-6{list-style-type:none}ul.lst-kix_ueh9c2uprout-8{list-style-type:none}.lst-kix_6o4qqgfnm1cp-3>li:before{content:"-  "}.lst-kix_iwx9fy5rmt9t-6>li:before{content:"-  "}ul.lst-kix_ueh9c2uprout-1{list-style-type:none}.lst-kix_u2lsbidcbmgf-2>li:before{content:"-  "}ul.lst-kix_ueh9c2uprout-0{list-style-type:none}.lst-kix_cnptvq8snb6-2>li:before{content:"-  "}.lst-kix_tvemz69t9hcg-8>li:before{content:"-  "}ul.lst-kix_69r3ohbhz155-8{list-style-type:none}ul.lst-kix_69r3ohbhz155-7{list-style-type:none}.lst-kix_99s8j2ra9jm-8>li:before{content:"-  "}ol.lst-kix_q4t2lvjspjpq-5.start{counter-reset:lst-ctn-kix_q4t2lvjspjpq-5 0}.lst-kix_u2lsbidcbmgf-6>li:before{content:"-  "}.lst-kix_mkzc59ly2665-0>li:before{content:"\0025cf   "}ul.lst-kix_69r3ohbhz155-2{list-style-type:none}ul.lst-kix_69r3ohbhz155-1{list-style-type:none}.lst-kix_yumyju3ufa7r-6>li:before{content:"-  "}ul.lst-kix_69r3ohbhz155-0{list-style-type:none}ul.lst-kix_69r3ohbhz155-6{list-style-type:none}ul.lst-kix_69r3ohbhz155-5{list-style-type:none}ul.lst-kix_69r3ohbhz155-4{list-style-type:none}.lst-kix_cbtueh1ca0aa-0>li:before{content:"-  "}.lst-kix_cbtueh1ca0aa-4>li:before{content:"-  "}ul.lst-kix_69r3ohbhz155-3{list-style-type:none}.lst-kix_ajyhxuww45wt-3>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-3>li:before{content:"-  "}.lst-kix_ajyhxuww45wt-7>li:before{content:"-  "}.lst-kix_i7bmre9bc3e8-5>li:before{content:"-  "}.lst-kix_99s8j2ra9jm-4>li:before{content:"-  "}.lst-kix_fdn2s47zlbp2-8>li:before{content:"\0025a0   "}.lst-kix_i7bmre9bc3e8-1>li:before{content:"-  "}.lst-kix_99s8j2ra9jm-0>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-7>li:before{content:"-  "}.lst-kix_fdn2s47zlbp2-3>li:before{content:"\0025cf   "}.lst-kix_fdn2s47zlbp2-1>li:before{content:"\0025cb   "}.lst-kix_o8wa98pl356e-4>li:before{content:"\0025cb   "}.lst-kix_fdn2s47zlbp2-0>li:before{content:"\0025cf   "}.lst-kix_o8wa98pl356e-6>li:before{content:"\0025cf   "}.lst-kix_o8wa98pl356e-7>li:before{content:"\0025cb   "}ul.lst-kix_fdn2s47zlbp2-7{list-style-type:none}ul.lst-kix_fdn2s47zlbp2-8{list-style-type:none}ul.lst-kix_fdn2s47zlbp2-5{list-style-type:none}ul.lst-kix_fdn2s47zlbp2-6{list-style-type:none}ul.lst-kix_fdn2s47zlbp2-3{list-style-type:none}.lst-kix_fdn2s47zlbp2-6>li:before{content:"\0025cf   "}ul.lst-kix_fdn2s47zlbp2-4{list-style-type:none}.lst-kix_ueh9c2uprout-7>li:before{content:"\0025cb   "}.lst-kix_ueh9c2uprout-6>li:before{content:"\0025cf   "}.lst-kix_o8wa98pl356e-1>li:before{content:"\0025cb   "}.lst-kix_ueh9c2uprout-4>li:before{content:"\0025cb   "}.lst-kix_h75p68dox4pl-4>li:before{content:"-  "}.lst-kix_h75p68dox4pl-6>li:before{content:"-  "}.lst-kix_ueh9c2uprout-1>li:before{content:"\0025cb   "}.lst-kix_p2too92sm296-2>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-7>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-7,lower-latin) ". "}.lst-kix_h75p68dox4pl-7>li:before{content:"-  "}.lst-kix_icgoe51cc7fx-6>li:before{content:"-  "}ul.lst-kix_kgqfxit2qc9l-1{list-style-type:none}ul.lst-kix_fdn2s47zlbp2-1{list-style-type:none}ul.lst-kix_kgqfxit2qc9l-0{list-style-type:none}ul.lst-kix_fdn2s47zlbp2-2{list-style-type:none}ul.lst-kix_kgqfxit2qc9l-3{list-style-type:none}ul.lst-kix_kgqfxit2qc9l-2{list-style-type:none}ul.lst-kix_fdn2s47zlbp2-0{list-style-type:none}.lst-kix_icgoe51cc7fx-7>li:before{content:"-  "}ul.lst-kix_kgqfxit2qc9l-8{list-style-type:none}ul.lst-kix_kgqfxit2qc9l-5{list-style-type:none}ul.lst-kix_kgqfxit2qc9l-4{list-style-type:none}ul.lst-kix_kgqfxit2qc9l-7{list-style-type:none}ul.lst-kix_kgqfxit2qc9l-6{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-8{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-7{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-4{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-3{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-6{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-5{list-style-type:none}.lst-kix_q4t2lvjspjpq-1>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-1,lower-latin) ". "}ul.lst-kix_j5i0nqyw0am7-0{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-2{list-style-type:none}ul.lst-kix_j5i0nqyw0am7-1{list-style-type:none}.lst-kix_q4t2lvjspjpq-2>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-2,lower-roman) ". "}.lst-kix_icgoe51cc7fx-4>li:before{content:"-  "}.lst-kix_p2too92sm296-5>li:before{content:"-  "}.lst-kix_q4t2lvjspjpq-4>li:before{content:"" counter(lst-ctn-kix_q4t2lvjspjpq-4,lower-latin) ". "}.lst-kix_icgoe51cc7fx-1>li:before{content:"-  "}.lst-kix_x0jk3p44hw5u-8>li:before{content:"\0025a0   "}.lst-kix_p2too92sm296-4>li:before{content:"-  "}.lst-kix_x0jk3p44hw5u-5>li:before{content:"\0025a0   "}.lst-kix_tltyda7lmar-2>li:before{content:"-  "}.lst-kix_x0jk3p44hw5u-2>li:before{content:"\0025a0   "}.lst-kix_x0jk3p44hw5u-3>li:before{content:"\0025cf   "}.lst-kix_p2too92sm296-7>li:before{content:"-  "}.lst-kix_tltyda7lmar-0>li:before{content:"-  "}ul.lst-kix_8mljvtb7hb4g-8{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-6{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-7{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-4{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-5{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-2{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-3{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-0{list-style-type:none}ul.lst-kix_8mljvtb7hb4g-1{list-style-type:none}.lst-kix_x0jk3p44hw5u-0>li:before{content:"\0025cf   "}.lst-kix_egm6q74cuc9v-7>li:before{content:"-  "}.lst-kix_j8rp27y1qsm4-1>li:before{content:"-  "}.lst-kix_j8rp27y1qsm4-3>li:before{content:"-  "}.lst-kix_msbub8o3wjpn-0>li:before{content:"-  "}.lst-kix_q0pcv3qt6eh6-1>li:before{content:"\0025cb   "}ul.lst-kix_o8wa98pl356e-4{list-style-type:none}ul.lst-kix_o8wa98pl356e-5{list-style-type:none}ul.lst-kix_o8wa98pl356e-2{list-style-type:none}.lst-kix_egm6q74cuc9v-1>li:before{content:"-  "}ul.lst-kix_o8wa98pl356e-3{list-style-type:none}ul.lst-kix_o8wa98pl356e-8{list-style-type:none}ul.lst-kix_o8wa98pl356e-6{list-style-type:none}ul.lst-kix_j8rp27y1qsm4-8{list-style-type:none}.lst-kix_r40efdz54ogr-5>li:before{content:"-  "}ul.lst-kix_o8wa98pl356e-7{list-style-type:none}ul.lst-kix_j8rp27y1qsm4-7{list-style-type:none}.lst-kix_q0pcv3qt6eh6-3>li:before{content:"\0025cf   "}ul.lst-kix_j8rp27y1qsm4-6{list-style-type:none}ul.lst-kix_j8rp27y1qsm4-5{list-style-type:none}ul.lst-kix_j8rp27y1qsm4-4{list-style-type:none}.lst-kix_oa2l3fr3uhys-7>li:before{content:"-  "}ul.lst-kix_j8rp27y1qsm4-3{list-style-type:none}ul.lst-kix_j8rp27y1qsm4-2{list-style-type:none}ul.lst-kix_j8rp27y1qsm4-1{list-style-type:none}ul.lst-kix_j8rp27y1qsm4-0{list-style-type:none}ul.lst-kix_msbub8o3wjpn-0{list-style-type:none}.lst-kix_yumyju3ufa7r-3>li:before{content:"-  "}ul.lst-kix_msbub8o3wjpn-3{list-style-type:none}.lst-kix_aqslecbmrlt9-0>li:before{content:"-  "}ul.lst-kix_msbub8o3wjpn-4{list-style-type:none}ul.lst-kix_msbub8o3wjpn-1{list-style-type:none}ul.lst-kix_msbub8o3wjpn-2{list-style-type:none}.lst-kix_t083pgxhci1s-4>li:before{content:"\0025cb   "}ul.lst-kix_q0pcv3qt6eh6-4{list-style-type:none}ul.lst-kix_msbub8o3wjpn-7{list-style-type:none}ul.lst-kix_q0pcv3qt6eh6-5{list-style-type:none}ul.lst-kix_msbub8o3wjpn-8{list-style-type:none}ul.lst-kix_q0pcv3qt6eh6-2{list-style-type:none}ul.lst-kix_msbub8o3wjpn-5{list-style-type:none}ul.lst-kix_q0pcv3qt6eh6-3{list-style-type:none}.lst-kix_tltyda7lmar-8>li:before{content:"-  "}ul.lst-kix_msbub8o3wjpn-6{list-style-type:none}ul.lst-kix_q0pcv3qt6eh6-8{list-style-type:none}.lst-kix_cnptvq8snb6-5>li:before{content:"-  "}.lst-kix_r40efdz54ogr-7>li:before{content:"-  "}ul.lst-kix_q0pcv3qt6eh6-6{list-style-type:none}ul.lst-kix_q0pcv3qt6eh6-7{list-style-type:none}.lst-kix_aqslecbmrlt9-6>li:before{content:"-  "}ul.lst-kix_q0pcv3qt6eh6-0{list-style-type:none}ul.lst-kix_q0pcv3qt6eh6-1{list-style-type:none}.lst-kix_aqslecbmrlt9-8>li:before{content:"-  "}.lst-kix_221b6f5jx36q-4>li:before{content:"-  "}.lst-kix_u2lsbidcbmgf-1>li:before{content:"-  "}ul.lst-kix_bxc3fwagz9n4-0{list-style-type:none}.lst-kix_6o4qqgfnm1cp-6>li:before{content:"-  "}ul.lst-kix_bxc3fwagz9n4-1{list-style-type:none}.lst-kix_j5i0nqyw0am7-8>li:before{content:"\0025a0   "}ul.lst-kix_bxc3fwagz9n4-2{list-style-type:none}ul.lst-kix_bxc3fwagz9n4-3{list-style-type:none}ul.lst-kix_bxc3fwagz9n4-4{list-style-type:none}.lst-kix_tvemz69t9hcg-5>li:before{content:"-  "}ul.lst-kix_bxc3fwagz9n4-5{list-style-type:none}ul.lst-kix_bxc3fwagz9n4-6{list-style-type:none}ul.lst-kix_bxc3fwagz9n4-7{list-style-type:none}.lst-kix_jap2f8dnznr2-6>li:before{content:"\0025cf   "}ul.lst-kix_bxc3fwagz9n4-8{list-style-type:none}.lst-kix_6o4qqgfnm1cp-4>li:before{content:"-  "}.lst-kix_jap2f8dnznr2-4>li:before{content:"\0025cb   "}.lst-kix_a9fzzv5qggwq-1>li:before{content:"-  "}.lst-kix_cnptvq8snb6-3>li:before{content:"-  "}.lst-kix_j5i0nqyw0am7-0>li:before{content:"\0025cf   "}.lst-kix_a9fzzv5qggwq-3>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-3>li:before{content:"-  "}.lst-kix_u2lsbidcbmgf-7>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-5>li:before{content:"-  "}.lst-kix_iwx9fy5rmt9t-1>li:before{content:"-  "}.lst-kix_tvemz69t9hcg-7>li:before{content:"-  "}.lst-kix_t083pgxhci1s-6>li:before{content:"\0025cf   "}.lst-kix_yumyju3ufa7r-5>li:before{content:"-  "}.lst-kix_msbub8o3wjpn-8>li:before{content:"-  "}.lst-kix_j5i0nqyw0am7-2>li:before{content:"\0025a0   "}.lst-kix_oa2l3fr3uhys-1>li:before{content:"-  "}.lst-kix_trsgeol68xbv-4>li:before{content:"-  "}.lst-kix_msbub8o3wjpn-2>li:before{content:"-  "}.lst-kix_i7bmre9bc3e8-4>li:before{content:"-  "}.lst-kix_99s8j2ra9jm-3>li:before{content:"-  "}.lst-kix_99s8j2ra9jm-1>li:before{content:"-  "}.lst-kix_i7bmre9bc3e8-2>li:before{content:"-  "}.lst-kix_iwx9fy5rmt9t-7>li:before{content:"-  "}.lst-kix_trsgeol68xbv-2>li:before{content:"-  "}ul.lst-kix_tltyda7lmar-8{list-style-type:none}.lst-kix_ihdvvcfkrodb-0>li:before{content:"-  "}ul.lst-kix_tltyda7lmar-7{list-style-type:none}ul.lst-kix_tltyda7lmar-6{list-style-type:none}ul.lst-kix_tltyda7lmar-5{list-style-type:none}ul.lst-kix_tltyda7lmar-4{list-style-type:none}ul.lst-kix_tltyda7lmar-3{list-style-type:none}.lst-kix_q23adj2uc958-5>li:before{content:"-  "}ul.lst-kix_tltyda7lmar-2{list-style-type:none}ul.lst-kix_tltyda7lmar-1{list-style-type:none}ul.lst-kix_tltyda7lmar-0{list-style-type:none}.lst-kix_i7bmre9bc3e8-7>li:before{content:"-  "}.lst-kix_ihdvvcfkrodb-5>li:before{content:"-  "}ul.lst-kix_lzhtiajxbsta-1{list-style-type:none}ul.lst-kix_lzhtiajxbsta-2{list-style-type:none}ul.lst-kix_lzhtiajxbsta-0{list-style-type:none}.lst-kix_5jdeieiov2jo-0>li:before{content:"-  "}.lst-kix_kjz3u1vwm87u-3>li:before{content:"\0025cf   "}.lst-kix_6tiajzogwgui-0>li:before{content:"\0025cf   "}ul.lst-kix_lzhtiajxbsta-5{list-style-type:none}ul.lst-kix_lzhtiajxbsta-6{list-style-type:none}ul.lst-kix_lzhtiajxbsta-3{list-style-type:none}ul.lst-kix_lzhtiajxbsta-4{list-style-type:none}.lst-kix_6tiajzogwgui-3>li:before{content:"\0025cf   "}ul.lst-kix_lzhtiajxbsta-7{list-style-type:none}.lst-kix_kjz3u1vwm87u-6>li:before{content:"\0025cf   "}.lst-kix_5jdeieiov2jo-5>li:before{content:"-  "}ul.lst-kix_lzhtiajxbsta-8{list-style-type:none}.lst-kix_mkzc59ly2665-5>li:before{content:"\0025a0   "}.lst-kix_ihdvvcfkrodb-8>li:before{content:"-  "}.lst-kix_5jdeieiov2jo-8>li:before{content:"-  "}.lst-kix_69r3ohbhz155-8>li:before{content:"-  "}.lst-kix_btor5fghjhg-5>li:before{content:"-  "}.lst-kix_69r3ohbhz155-3>li:before{content:"-  "}.lst-kix_7ylkx0u6g7ty-1>li:before{content:"\0025cb   "}.lst-kix_kgqfxit2qc9l-7>li:before{content:"\0025cb   "}.lst-kix_kgqfxit2qc9l-4>li:before{content:"\0025cb   "}.lst-kix_6tiajzogwgui-8>li:before{content:"\0025a0   "}.lst-kix_btor5fghjhg-2>li:before{content:"-  "}.lst-kix_7ylkx0u6g7ty-6>li:before{content:"\0025cf   "}.lst-kix_kwsfbh415ym3-4>li:before{content:"\0025cb   "}ul.lst-kix_o8wa98pl356e-0{list-style-type:none}ul.lst-kix_o8wa98pl356e-1{list-style-type:none}.lst-kix_3pujr63wtigv-7>li:before{content:"-  "}.lst-kix_kwsfbh415ym3-7>li:before{content:"\0025cb   "}.lst-kix_69r3ohbhz155-0>li:before{content:"-  "}.lst-kix_q23adj2uc958-2>li:before{content:"-  "}.lst-kix_3pujr63wtigv-2>li:before{content:"-  "}ul.lst-kix_eedhc8porvzr-3{list-style-type:none}ul.lst-kix_eedhc8porvzr-4{list-style-type:none}ul.lst-kix_eedhc8porvzr-1{list-style-type:none}.lst-kix_bxc3fwagz9n4-4>li:before{content:"-  "}ul.lst-kix_eedhc8porvzr-2{list-style-type:none}ul.lst-kix_eedhc8porvzr-0{list-style-type:none}.lst-kix_egm6q74cuc9v-4>li:before{content:"-  "}.lst-kix_q869v7lwxxb1-1>li:before{content:"-  "}ul.lst-kix_eedhc8porvzr-7{list-style-type:none}ul.lst-kix_eedhc8porvzr-8{list-style-type:none}ul.lst-kix_eedhc8porvzr-5{list-style-type:none}ul.lst-kix_eedhc8porvzr-6{list-style-type:none}.lst-kix_j8rp27y1qsm4-6>li:before{content:"-  "}.lst-kix_oa2l3fr3uhys-4>li:before{content:"-  "}.lst-kix_trsgeol68xbv-7>li:before{content:"-  "}.lst-kix_p30vht8wkj5m-7>li:before{content:"-  "}.lst-kix_r40efdz54ogr-2>li:before{content:"-  "}.lst-kix_q0pcv3qt6eh6-6>li:before{content:"\0025cf   "}.lst-kix_tltyda7lmar-5>li:before{content:"-  "}ul.lst-kix_h75p68dox4pl-0{list-style-type:none}ul.lst-kix_h75p68dox4pl-1{list-style-type:none}.lst-kix_t083pgxhci1s-1>li:before{content:"\0025cb   "}.lst-kix_cnptvq8snb6-8>li:before{content:"-  "}.lst-kix_aqslecbmrlt9-3>li:before{content:"-  "}.lst-kix_yumyju3ufa7r-0>li:before{content:"-  "}.lst-kix_fkidea160sgq-6>li:before{content:"-  "}ul.lst-kix_ajyhxuww45wt-8{list-style-type:none}.lst-kix_g7zmvzs33jh5-0>li:before{content:"-  "}ul.lst-kix_ajyhxuww45wt-6{list-style-type:none}ul.lst-kix_ajyhxuww45wt-7{list-style-type:none}ul.lst-kix_h75p68dox4pl-6{list-style-type:none}ul.lst-kix_ajyhxuww45wt-4{list-style-type:none}ul.lst-kix_h75p68dox4pl-7{list-style-type:none}ul.lst-kix_ajyhxuww45wt-5{list-style-type:none}ul.lst-kix_h75p68dox4pl-8{list-style-type:none}ul.lst-kix_ajyhxuww45wt-2{list-style-type:none}ul.lst-kix_ajyhxuww45wt-3{list-style-type:none}ul.lst-kix_h75p68dox4pl-2{list-style-type:none}ul.lst-kix_ajyhxuww45wt-0{list-style-type:none}ul.lst-kix_h75p68dox4pl-3{list-style-type:none}ul.lst-kix_ajyhxuww45wt-1{list-style-type:none}ul.lst-kix_h75p68dox4pl-4{list-style-type:none}ul.lst-kix_h75p68dox4pl-5{list-style-type:none}.lst-kix_tvemz69t9hcg-2>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-8>li:before{content:"-  "}.lst-kix_a9fzzv5qggwq-6>li:before{content:"-  "}.lst-kix_qz2j3tgouhds-3>li:before{content:"\0025cf   "}.lst-kix_u2lsbidcbmgf-4>li:before{content:"-  "}.lst-kix_p7f5jwyph9la-7>li:before{content:"-  "}.lst-kix_221b6f5jx36q-7>li:before{content:"-  "}.lst-kix_wlwlb53om0pz-8>li:before{content:"-  "}.lst-kix_iwx9fy5rmt9t-4>li:before{content:"-  "}ul.lst-kix_r40efdz54ogr-6{list-style-type:none}ul.lst-kix_r40efdz54ogr-5{list-style-type:none}ul.lst-kix_r40efdz54ogr-4{list-style-type:none}ul.lst-kix_r40efdz54ogr-3{list-style-type:none}.lst-kix_99s8j2ra9jm-6>li:before{content:"-  "}.lst-kix_cnptvq8snb6-0>li:before{content:"-  "}ul.lst-kix_r40efdz54ogr-8{list-style-type:none}.lst-kix_mkzc59ly2665-2>li:before{content:"\0025a0   "}ul.lst-kix_r40efdz54ogr-7{list-style-type:none}.lst-kix_h75p68dox4pl-1>li:before{content:"-  "}.lst-kix_6o4qqgfnm1cp-1>li:before{content:"-  "}ul.lst-kix_r40efdz54ogr-2{list-style-type:none}.lst-kix_jap2f8dnznr2-1>li:before{content:"\0025cb   "}ul.lst-kix_r40efdz54ogr-1{list-style-type:none}ul.lst-kix_r40efdz54ogr-0{list-style-type:none}.lst-kix_gvjahu3muex0-6>li:before{content:"-  "}.lst-kix_g7zmvzs33jh5-8>li:before{content:"-  "}.lst-kix_8mljvtb7hb4g-5>li:before{content:"-  "}.lst-kix_mrbzpiod19zo-7>li:before{content:"\0025cb   "}.lst-kix_wlwlb53om0pz-0>li:before{content:"-  "}.lst-kix_yumyju3ufa7r-8>li:before{content:"-  "}.lst-kix_ajyhxuww45wt-1>li:before{content:"-  "}.lst-kix_lzhtiajxbsta-0>li:before{content:"-  "}.lst-kix_msbub8o3wjpn-5>li:before{content:"-  "}.lst-kix_j5i0nqyw0am7-5>li:before{content:"\0025a0   "}.lst-kix_q4t2lvjspjpq-4>li{counter-increment:lst-ctn-kix_q4t2lvjspjpq-4}ol{margin:0;padding:0}table td,table th{padding:0}.c17{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:108pt;border-top-color:#000000;border-bottom-style:solid}.c27{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:320.2pt;border-top-color:#000000;border-bottom-style:solid}.c30{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:45pt;border-top-color:#000000;border-bottom-style:solid}.c40{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:74.2pt;border-top-color:#000000;border-bottom-style:solid}.c18{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:221.7pt;border-top-color:#000000;border-bottom-style:solid}.c29{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:500pt;border-top-color:#000000;border-bottom-style:solid}.c21{border-right-style:solid;padding:5pt 5pt 5pt 5pt;border-bottom-color:#000000;border-top-width:1pt;border-right-width:1pt;border-left-color:#000000;vertical-align:top;border-right-color:#000000;border-left-width:1pt;border-top-style:solid;border-left-style:solid;border-bottom-width:1pt;width:164.2pt;border-top-color:#000000;border-bottom-style:solid}.c3{-webkit-text-decoration-skip:none;color:#1155cc;font-weight:400;text-decoration:underline;vertical-align:baseline;text-decoration-skip-ink:none;font-size:11pt;font-family:"Arial";font-style:normal}.c42{color:#434343;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"Arial";font-style:normal}.c33{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c46{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:26pt;font-family:"Arial";font-style:normal}.c48{color:#7d6eae;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c43{color:#666666;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:12pt;font-family:"Arial";font-style:normal}.c12{padding-top:16pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c7{padding-top:14pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c13{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:20pt;font-family:"Arial";font-style:normal}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c1{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c16{color:#000000;text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c53{color:#7d6eae;text-decoration:none;vertical-align:baseline;font-size:14pt;font-style:normal}.c54{padding-top:16pt;padding-bottom:4pt;line-height:1.0;page-break-after:avoid;text-align:left}.c35{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;text-align:left}.c47{background-color:#f6f8fa;text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c28{padding-top:20pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;text-align:left}.c34{padding-top:0pt;padding-bottom:3pt;line-height:1.15;page-break-after:avoid;text-align:left}.c39{color:#6aa84f;text-decoration:none;vertical-align:baseline;font-size:11pt;font-style:normal}.c38{border-spacing:0;border-collapse:collapse;margin-right:auto}.c49{padding-top:0pt;padding-bottom:0pt;line-height:1.15;text-align:justify}.c26{padding-top:3pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c44{background-color:#ffffff;font-size:10.5pt;font-family:"Roboto";font-weight:400}.c14{padding-top:0pt;padding-bottom:0pt;line-height:1.0;text-align:left}.c50{margin-left:6pt;border-spacing:0;border-collapse:collapse;margin-right:auto}.c19{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c2{font-family:"Courier New";color:#9f6807;font-weight:400}.c36{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c15{margin-left:72pt;padding-left:0pt}.c5{margin-left:108pt;padding-left:0pt}.c11{padding:0;margin:0}.c6{color:inherit;text-decoration:inherit}.c41{font-style:italic;color:#008000}.c25{orphans:2;widows:2}.c22{font-weight:700;font-family:"Arial"}.c8{margin-left:36pt;padding-left:0pt}.c4{font-weight:400;font-family:"Courier New"}.c24{background-color:#f3f3f3}.c23{font-weight:700}.c9{color:#af1915}.c10{height:11pt}.c52{font-size:25pt}.c45{margin-left:18pt}.c37{margin-left:36pt}.c51{background-color:#ffff00}.c31{font-family:"Courier New"}.c20{height:0pt}.c32{color:#00607c}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style></head><body class="c36 doc-content"><p class="c1 c10"><span class="c0"></span></p><a id="t.747b87e0283561b090f9c078a31cb1794208a619"></a><a id="t.0"></a><table class="c38"><tr class="c20"><td class="c40" colspan="1" rowspan="1"><p class="c14 c25"><span class="c0">Document</span></p></td><td class="c27" colspan="1" rowspan="1"><p class="c1"><span class="c16 c22">P3109R0</span></p></td></tr><tr class="c20"><td class="c40" colspan="1" rowspan="1"><p class="c14 c25"><span class="c0">Date</span></p></td><td class="c27" colspan="1" rowspan="1"><p class="c14 c25"><span class="c16 c22">2024/02/12</span></p></td></tr><tr class="c20"><td class="c40" colspan="1" rowspan="1"><p class="c14 c25"><span class="c0">Reply To</span></p></td><td class="c27" colspan="1" rowspan="1"><p class="c14 c25"><span class="c16 c22">Lewis Baker &lt;lewissbaker@gmail.com&gt;<br>Eric Niebler &lt;eric.niebler@gmail.com&gt;</span></p><p class="c14 c25"><span class="c16 c22">Kirk Shoop &lt;kirk.shoop@gmail.com&gt;</span></p><p class="c14 c25"><span class="c16 c22">Lucian Radu Teodorescu &lt;lucteo@lucteo.ro&gt;</span></p></td></tr><tr class="c20"><td class="c40" colspan="1" rowspan="1"><p class="c14 c25"><span class="c0">Audience</span></p></td><td class="c27" colspan="1" rowspan="1"><p class="c14 c25"><span class="c16 c22">LEWG</span></p></td></tr></table><p class="c1 c10"><span class="c0"></span></p><p class="c1 c10"><span class="c0"></span></p><p class="c25 c34 title" id="h.gdjg73xcubsn"><span class="c52">P3109R0: A plan for std::execution for C++26</span></p><p class="c26"><span class="c3"><a class="c6" href="#h.g1mkgspr921k">Abstract</a></span></p><p class="c26"><span class="c3"><a class="c6" href="#h.edmwpsbops6p">Executive Summary</a></span></p><p class="c26"><span class="c3"><a class="c6" href="#h.r0cmngbdz5bx">Library Modifications and Additions</a></span></p><p class="c26 c45"><span class="c3"><a class="c6" href="#h.s3wlp5un83kb">Library Design Modifications</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.givvkpstclpu">Remove ensure_started() algorithm (P2519)</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.yqj8vkhbptxm">Move to member-function-based customization (P2855)</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.lzprjqozn4dd">Generalised Environment/Queryable Facilities (P3121)</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.dpmgk06ql5ip">Reducing the synchronization overhead of cancellation</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.cvh57wk0jbim">Design changes to the run_loop class</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.el1m6lkf1ozr">Clarify destruction order of algorithm resources</a></span></p><p class="c26 c45"><span class="c3"><a class="c6" href="#h.3ebjmpyw24j">Library Design Additions</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.9imgaa742k82">Async Scope (P2519)</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.ixxwc620yux">Heap-allocating sender algorithms need allocator support</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.7jhvktu9whlb">Coroutine task type</a></span></p><p class="c26 c37"><span class="c3"><a class="c6" href="#h.dp444q3nwzgr">System Execution Context (P2079)</a></span></p><p class="c26"><span class="c3"><a class="c6" href="#h.f1m90va72v31">Acknowledgements</a></span></p><p class="c26"><span class="c3"><a class="c6" href="#h.g0wzf1jilvkl">Appendix A - A list of existing utilities in P2300</a></span></p><h1 class="c28 c25" id="h.g1mkgspr921k"><span class="c13">Abstract</span></h1><p class="c1"><span class="c0">P2300 introduces the sender/receiver framework, laying the foundational model for asynchrony in C++ and the standard library. However, before we ship P2300 and freeze its design in the standard, we should ensure that all potentially-breaking design questions are fully resolved, and that the initial release includes a sufficiently well-rounded set of utilities to be generally useful.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">In this paper we aim to identify and prioritize these critical work items that need to be worked on in the C++26 cycle, on top of what&rsquo;s already in P2300. Additional features that we identify as secondary priorities, and don&#39;t need to ship with the initial release of sender/receiver are described in P3118. However, we do not exclude the possibility of working on those features targeting the initial release.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>A summary of existing facilities defined by P2300 is listed in Appendix A for reference. They are also listed in an updating experimental section in </span><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://en.cppreference.com/w/cpp/experimental/execution&amp;sa=D&amp;source=editors&amp;ust=1707781281326732&amp;usg=AOvVaw1rIyE4WpiXBPGkWvNkF9p0">Cppreference</a></span><span class="c0">.</span></p><h1 class="c25 c28" id="h.edmwpsbops6p"><span class="c13">Executive Summary</span></h1><p class="c1"><span class="c0">The following work items should be prioritized to address potentially-breaking design questions in P2300:</span></p><ul class="c11 lst-kix_7ylkx0u6g7ty-0 start"><li class="c1 c8 li-bullet-0"><span class="c16 c22">Removing ensure_started() algorithm, replacing it with a new async scope facility.</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-1 start"><li class="c1 c15 li-bullet-0"><span class="c4">ensure_started()</span><span class="c0">&nbsp;has some foot-guns that make it difficult to use correctly/safely</span></li><li class="c1 c15 li-bullet-0"><span>we should replace </span><span class="c4">ensure_started()</span><span class="c0">&nbsp;with a new async-scope abstraction that provides equivalent functionality but in a way that has fewer footguns</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Needs a paper.</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-0"><li class="c1 c8 li-bullet-0"><span class="c16 c22">Remove dependency on tag_invoke</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-1 start"><li class="c1 c15 li-bullet-0"><span>Current wording of </span><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://wg21.link/P2300R7&amp;sa=D&amp;source=editors&amp;ust=1707781281327522&amp;usg=AOvVaw3qEdrusXvcy92w7wFy3i-j">P2300R7</a></span><span class="c0">&nbsp;uses tag_invoke()-based customisation points to define the core concepts as well as customisable algorithms.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">tag_invoke relies on dispatching all customisation points through a single ADL function, relying on tag-dispatch to select the right overload, which has raised compile-time scalability concerns.</span></li><li class="c1 c15 li-bullet-0"><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://wg21.link/P2999R3&amp;sa=D&amp;source=editors&amp;ust=1707781281327871&amp;usg=AOvVaw1n7osJOYLZH0JtuKH76GVO">P2999R3</a></span><span>&nbsp;</span><span class="c0">proposed replacing algorithm customisation with a new domain-based customization design that relies on member-functions on a type obtained from an environment - already forwarded by LEWG.</span></li><li class="c1 c15 li-bullet-0"><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://wg21.link/P2855&amp;sa=D&amp;source=editors&amp;ust=1707781281328106&amp;usg=AOvVaw1SzodZpCJ-CB8MDDjlt2Vg">P2855</a></span><span class="c0">&nbsp;proposes changing the core concepts to instead be member-function based. This change needs to be made before we ship as it is a breaking change. Needs a new paper revision.</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-0"><li class="c1 c8 li-bullet-0"><span class="c16 c22">Changes to the &lsquo;queryable&rsquo; concept used for receiver environments and sender attributes</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-1 start"><li class="c1 c15 li-bullet-0"><span>Extend the queryable concept with the ability to enumerate the queries it provides values for. This is needed to address limitations in </span><span class="c4">split()</span><span>&nbsp;and </span><span class="c4">ensure_started()</span><span class="c0">&nbsp;algorithms that currently prevent them from forwarding sender attributes of the wrapped sender.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Explore whether the &lsquo;queryable&rsquo; facility should be made more generally available for other use-cases that want to be able to pass a bag of properties. If so, we may also want to consider shipping the concept with additional facilities for creating/manipulating queryable objects.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Needs papers.</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-0"><li class="c1 c8 li-bullet-0"><span class="c16 c22">Explore change to get_stop_token() requirements that would allow reduced synchronization overhead for stop callbacks</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-1 start"><li class="c1 c15 li-bullet-0"><span>It may be possible to reduce the amount of synchronization needed to support cancellation by restricting sender operations to registering a single stop-callback at a time with a stop token obtained from </span><span class="c4">std::execution::get_stop_token()</span><span class="c0">.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">This would potentially make cancellable algorithms more efficient.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Making this change later would be a breaking change for user-authored senders that register multiple stop-callbacks, either directly or indirectly by passing the stop-token to multiple child operations, each of which might register their own stop callbacks.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Needs a paper.</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-0"><li class="c1 c8 li-bullet-0"><span class="c23">Improvements to the design of std::execution::run_loop class</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-1 start"><li class="c1 c15 li-bullet-0"><span>The run_loop class provides a simple scheduler implementation that allows you to manually drive an event loop by calling a </span><span class="c4">run()</span><span>&nbsp;method that executes work scheduled to it until </span><span class="c4">finish()</span><span>&nbsp;is called. It is used by </span><span class="c4">sync_wait()</span><span class="c0">.</span></li><li class="c1 c15 li-bullet-0"><span>The current design has a very limited use - you can only call </span><span class="c4">run() </span><span>once. If there are items queued to it after you call </span><span class="c4">finish() </span><span>then there is no way to execute them. This makes it difficult or impossible to use in scenarios that are not roughly equivalent to </span><span class="c4">sync_wait()</span><span class="c0">.</span></li><li class="c1 c15 li-bullet-0"><span>We should consider changing the design to make it more generally useful. e.g. by allowing repeated calls to drive the </span><span>event loop.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Needs a paper.</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-0"><li class="c1 c8 li-bullet-0"><span class="c16 c22">Heap-allocated senders need support for custom allocators</span></li></ul><ul class="c11 lst-kix_7ylkx0u6g7ty-1 start"><li class="c1 c15 li-bullet-0"><span>The algorithms </span><span class="c4">ensure_started()</span><span>, </span><span class="c4">split()</span><span>&nbsp;and </span><span class="c4">start_detached() </span><span class="c0">all need to dynamically allocate memory for the operation-state internal to the operation.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">These algorithms do not currently provide any way to customize the allocation.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">We should update these algorithms to allow passing a custom allocator that would be used for the allocation.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Depending on the chosen design this could either be a breaking change or added later.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Needs a paper.</span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>The following work items should be prioritized to ensure that the initial ship vehicle for </span><span class="c4">std::execution</span><span class="c0">&nbsp;includes enough facilities to be generally useful out of the box:</span></p><ul class="c11 lst-kix_kjz3u1vwm87u-0 start"><li class="c1 c8 li-bullet-0"><span class="c16 c22">Async Scope</span></li></ul><ul class="c11 lst-kix_kjz3u1vwm87u-1 start"><li class="c1 c15 li-bullet-0"><span class="c0">Enables launching a dynamic number of async operations that all use a given resource and then ensuring that all of those operations complete before the resource is destroyed. </span></li><li class="c1 c15 li-bullet-0"><span class="c0">To support this use-case, we propose a facility that represents a scope that exits after all nested async-functions have completed.</span></li><li class="c1 c15 li-bullet-0"><span>This facility should allow us to remove the unsafe </span><span class="c4">ensure_started()</span><span>&nbsp;algorithm (see </span><span class="c19"><a class="c6" href="#h.givvkpstclpu">Remove </a></span><span class="c19 c4"><a class="c6" href="#h.givvkpstclpu">ensure_started()</a></span><span class="c19"><a class="c6" href="#h.givvkpstclpu">&nbsp;algorithm</a></span><span>&nbsp;section).</span></li><li class="c1 c15 li-bullet-0"><span>Paper forthcoming.</span></li></ul><ul class="c11 lst-kix_kjz3u1vwm87u-0"><li class="c1 c8 li-bullet-0"><span class="c16 c22">Coroutine task type</span></li></ul><ul class="c11 lst-kix_kjz3u1vwm87u-1 start"><li class="c1 c15 li-bullet-0"><span class="c0">We expect the most common use of senders will actually be from within coroutines.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">It would be a real disservice for users to have to wait until C++29 before they have an async coroutine task type out of the box that worked with the new async model proposed in P2300.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Needs a new paper - the design described in P1056 predated sender/receiver and does not support many of the features required for interoperability with senders.</span></li></ul><ul class="c11 lst-kix_kjz3u1vwm87u-0"><li class="c1 c8 li-bullet-0"><span class="c16 c22">System Execution Context</span></li></ul><ul class="c11 lst-kix_kjz3u1vwm87u-1 start"><li class="c1 c15 li-bullet-0"><span>Several of the facilities in P2300 require a scheduler but the only scheduler provided by &nbsp;P2300 is the one from </span><span class="c4">std::execution::run_loop</span><span class="c0">.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">We should provide a scheduler out of the box that allows users to make use of the underlying platform&rsquo;s system thread-pool for executing sender-based code in a portable way across multiple threads.</span></li><li class="c1 c15 li-bullet-0"><span class="c0">Without this, users will need to go to third party libraries for thread-pools, or write their own, in order to write async code that utilizes multiple CPU cores.</span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This paper, along with P3118, will introduce our suggested modifications and extensions.</span></p><p class="c1"><span>This paper includes topics which are high priority for</span><span class="c23">&nbsp;C++26</span><span class="c0">, and P3118 will present lower priority fixes and additions which can be done post initial delivery.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">The modifications and additions are split into priorities. This paper includes all the P0 topics.</span></p><p class="c1"><span class="c0">Classification is as follows:</span></p><ul class="c11 lst-kix_fkidea160sgq-0 start"><li class="c1 c8 li-bullet-0"><span class="c0">P0 - highest priority - things we can&rsquo;t change after we ship.</span></li><li class="c1 c8 li-bullet-0"><span class="c0">P1 - high priority - we should strive to ship this in the first version of std::execution to improve the user-experience, but it can be added later if needed</span></li><li class="c1 c8 li-bullet-0"><span class="c0">P2 - nice to have - we should continue to make progress on this in parallel with other work, but it is fine to target a subsequent ship-vehicle.</span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">To summarize, the modifications and additions suggested in this paper:</span></p><p class="c1 c10"><span class="c48"></span></p><a id="t.a781d596156d94ff4b92a50b48088fdd99178363"></a><a id="t.1"></a><table class="c50"><tr class="c20"><td class="c30 c24" colspan="1" rowspan="1"><p class="c14"><span class="c0">Paper</span></p></td><td class="c21 c24" colspan="1" rowspan="1"><p class="c14"><span class="c0">Description</span></p></td><td class="c17 c24" colspan="1" rowspan="1"><p class="c14"><span class="c0">Change type</span></p></td><td class="c18 c24" colspan="1" rowspan="1"><p class="c14"><span class="c0">Details</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span class="c44"><a class="c6" href="https://www.google.com/url?q=https://kirkshoop.github.io/async_scope/asyncscope.html&amp;sa=D&amp;source=editors&amp;ust=1707781281333703&amp;usg=AOvVaw1ibP4VWJ4KavTvFxeOh2aZ">D2519</a></span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Async Scope (+ removing ensure_started)</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design addition</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span class="c0">High priority design addition, which will allow management of multiple fire-and-forget executions to be done safely.</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span><a class="c6" href="https://www.google.com/url?q=https://wg21.link/P2855&amp;sa=D&amp;source=editors&amp;ust=1707781281334626&amp;usg=AOvVaw0fVwGAiP0aQ2u5VdcJPL9M">P2855</a></span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Member-function-based customization</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design modification</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span class="c0">Remove the tag_invoke ADL-based CPs</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span>P3121</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Fine tune the &ldquo;queryable&rdquo; concept, (potentially) add generalized Environment/Queryable Facilities</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design modification (generalization)</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span class="c0">We may be able to define the CPs only, and deliver full utility later</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span class="c0">-</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Reducing the synchronization overhead of cancellation</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Optimization</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c1"><span>By e</span><span>xploring changes in </span><span>get_stop_token() requirements</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span class="c0">-</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design changes to the run_loop</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design modification</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span>Explore modifications to</span><span>&nbsp;the API of &ldquo;run_loop&rdquo;</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span class="c0">-</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Heap-allocating sender algorithms need allocator support</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design addition</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span>Add support for allocators. </span><span>Having this post initial revision will be a potential ABI break.</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span class="c0">-</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Coroutine task type</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design addition</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span class="c0">Support what is expected to be a main use case</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span><a class="c6" href="https://www.google.com/url?q=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2079r3.html&amp;sa=D&amp;source=editors&amp;ust=1707781281339231&amp;usg=AOvVaw3K2lNAsWEIXVDTDorDpEtn">P2079</a></span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">System Execution Context</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design addition</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span>Adding a system-wide scheduler that allows to spawn concurrent work. Required for a basic usage of S/R for typical concurrency problems.</span></p></td></tr><tr class="c20"><td class="c30" colspan="1" rowspan="1"><p class="c14"><span class="c0">-</span></p></td><td class="c21" colspan="1" rowspan="1"><p class="c14"><span class="c0">Clarify destruction order of algorithms</span></p></td><td class="c17" colspan="1" rowspan="1"><p class="c14"><span class="c0">Design modification</span></p></td><td class="c18" colspan="1" rowspan="1"><p class="c14"><span>Add lifetime requirements on objects or sub-objects passed to algorithms</span></p></td></tr></table><h1 class="c28 c25" id="h.r0cmngbdz5bx"><span class="c13">Library Modifications and Additions</span></h1><h2 class="c25 c35" id="h.s3wlp5un83kb"><span>Library Design Modifications</span></h2><h3 class="c12" id="h.givvkpstclpu"><span>Remove </span><span class="c4">ensure_started()</span><span>&nbsp;algorithm (P2519)</span></h3><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Senders are generally assumed to be safe to destroy at any point. It is common to have algorithms that senders can be composed with that are not guaranteed to connect/start their child senders.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>However, </span><span class="c4">ensure_started()</span><span class="c0">&nbsp;returns a sender that owns work that is potentially already executing asynchronously in the background.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>If this </span><span class="c4">ensure_started()</span><span class="c0">&nbsp;sender is destroyed without being connected/started then we need to specify the semantics of what will happen to that already-started asynchronous work. There are four common strategies for what to do in this case:</span></p><ol class="c11 lst-kix_q4t2lvjspjpq-0 start" start="1"><li class="c1 c8 li-bullet-0"><span class="c0">Block in the destructor until the asynchronous operation completes - can easily lead to deadlock.</span></li><li class="c1 c8 li-bullet-0"><span class="c0">Detaching from the async operation, letting it run to completion in the background - makes it hard to implement clean shut-down.</span></li><li class="c1 c8 li-bullet-0"><span class="c0">Treat it as undefined-behavior - this behavior is user-hostile.</span></li><li class="c1 c8 li-bullet-0"><span class="c0">Terminate the program - the strategy that std::thread takes - also user hostile.</span></li></ol><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>The current </span><span class="c4">ensure_started()</span><span class="c0">&nbsp;wording chooses option 2 as the least worst option, but all of the options are generally bad options.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>We should remove </span><span class="c4">ensure_started()</span><span class="c0">&nbsp;from P2300 before it is merged into the IS.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>To provide equivalent functionality of being able to eagerly spawn work, we should provide the async_scope abstraction, that allows spawning eager work, while still allowing the work to be joined, preserving structured-concurrency, even if the returned sender is never connected/started.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>See the section on </span><span class="c19"><a class="c6" href="#h.9imgaa742k82">Async Scope</a></span><span class="c0">&nbsp;for work relating to the replacement facility.</span></p><h3 class="c12" id="h.yqj8vkhbptxm"><span class="c42">Move to member-function-based customization (P2855)</span></h3><p class="c1"><span>The current specification of P2300 defines the customization-points for the core concepts in terms of </span><span class="c4">tag_invoke</span><span class="c0">, a generic ADL-based customization point mechanism.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>The use of a single ADL name for dispatching to a customization of any algorithm is powerful, but also problematic for compile-times as it makes the overload-set sizes potentially much larger, since overloads for receiver methods (</span><span class="c4">set_value</span><span>, etc.) are considered in a call to </span><span class="c4">connect()</span><span class="c0">.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This paper proposes to instead move back to a more direct member-function-based API for defining implementations of the core concepts.</span></p><p class="c1"><span class="c0"><br>e.g. instead of a sender defining:</span></p><p class="c1"><span class="c16 c4">&nbsp; template&lt;typename Receiver&gt;<br> &nbsp;friend op_state&lt;Receiver&gt; tag_invoke(connect_t, my_sender&amp;&amp; self,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Receiver r) { /* &hellip; */ }</span></p><p class="c1"><span class="c0">they can define the following member function:</span></p><p class="c1"><span>&nbsp; &nbsp; </span><span class="c16 c4">template&lt;typename Receiver&gt;<br> &nbsp;op_state&lt;Receiver&gt; connect(Receiver r) &amp;&amp; { /* &hellip; */ }</span></p><p class="c1 c10"><span class="c16 c4"></span></p><p class="c1"><span class="c0">In combination with the changes introduced in P2999, which removes ADL-based customization of sender algorithms in favor of a member-function based customization on a customization domain object, there will be no more ADL-based customization points left in the design.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">The result should be better compile times, and also a simpler interface for authors of senders, receivers and operation-states to implement.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This is a change to the definition of the core concepts and so is a change that we cannot make after we ship sender/receiver in a standard.</span></p><h3 class="c12" id="h.lzprjqozn4dd"><span>Generalised Environment/Queryable Facilities</span><span class="c42">&nbsp;(P3121)</span></h3><p class="c1"><span>The </span><span class="c4">queryable</span><span class="c0">&nbsp;concept in P2300 defines the interface that &ldquo;environments&rdquo; provide. These environments are obtained either from a receiver or from a sender, and let you query properties of that environment to get additional information about the context of the caller (receiver) or of the operation (sender).</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">For example, environments are used to pass information about the current scheduler, allocator or stop-token to child operations via the receiver.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">These environments generally are read-only and have reference semantics - they are more like handles to the environment - so that asking for the environment is cheap.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>There are a number of improvements we should consider making to the queryable concept listed below. We need to make these changes before shipping </span><span class="c4">std::execution</span><span class="c0">&nbsp;as it will be difficult to change it later.</span></p><h4 class="c7" id="h.le3j151xngww"><span class="c43">Enumerating queries</span></h4><p class="c1"><span class="c0">The queryable concept is currently missing the ability to enumerate which queries it provides values for. This makes it difficult to, for example, generically construct a new environment that holds a copy of each of the values of an arbitrary given environment.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>Such a facility is needed by algorithms like </span><span class="c4">split()</span><span>&nbsp;and </span><span class="c4">ensure_started()</span><span class="c0">&nbsp;to be able to continue using the sender&rsquo;s attribute values after the original sender&rsquo;s lifetime has ended by taking a copy of the values of each attribute.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">The shape of this might be as simple as requiring environments to have a nested type-alias that resolves to a type-list that contains the list of CPO types of queries it supports.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Such a type-alias would also allow making the queryable concept more selective, as it could check for the existence of this type-alias.</span></p><h4 class="c7" id="h.2gj0nx13qui"><span class="c43">Remove dependency on tag_invoke</span></h4><p class="c1"><span>The current wording in P2300R7 defines a queryable object&rsquo;s interface in terms of calls to </span><span class="c4">tag_invoke()</span><span class="c0">.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>The paper </span><span>P2855</span><span>&nbsp;makes a case for removing the dependency of </span><span class="c4">std::execution</span><span>&nbsp;concepts on </span><span class="c4">tag_invoke()</span><span>&nbsp;and proposes replacing it with a </span><span class="c4">.tag_query()</span><span class="c0">&nbsp;member-function on the environment.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>We could also consider other member-function based designs. e.g. using </span><span class="c4">operator[] </span><span class="c0">where the index is the query CPO.</span></p><h4 class="c7" id="h.tfgtgghzjhq"><span class="c43">Consider moving out of std::execution</span></h4><p class="c1"><span>The queryable concept is a general facility that may be useful outside of the use of </span><span class="c4">std::execution</span><span class="c0">&nbsp;and sender/receiver usage. It can potentially be used anywhere we want to be able to pass a bag of properties into some facility where the set of properties needs to be an open set.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>If we expect it to be widely applicable in other domains, we should consider promoting the queryable concept, along with any related facilities, to the top level </span><span class="c4">std::</span><span class="c0">&nbsp;namespace and potentially consider putting it in a separate header.</span></p><h3 class="c12" id="h.dpmgk06ql5ip"><span class="c42">Reducing the synchronization overhead of cancellation</span></h3><p class="c1"><span>The </span><span class="c4">stoppable_token</span><span>&nbsp;concept from P2300 allows the user to register a callback to be notified of a stop-request if some thread calls </span><span class="c4">request_stop()</span><span>on an associated stop-source</span><span>. The current design of </span><span class="c4">std::stop_token</span><span>, as well as the proposed </span><span class="c4">std::in_place_stop_token</span><span class="c0">&nbsp;type introduced by P2300, allow multiple stop-callbacks to be registered to the same shared stop state.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>An operation that obtains a stop-token from a receiver&rsquo;s environment using the </span><span class="c4">get_stop_token()</span><span class="c0">&nbsp;query is currently permitted to register multiple stop-callbacks to the same stop-token. This allows operations that are transparent to cancellation (i.e. that pass through stop-requests but do not generate their own) to just pass down the same stop-token obtained from the parent operation&rsquo;s receiver in the environment passed to all child operations.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">However, not every sender algorithm needs to be able to register multiple stop-callbacks and in these cases we are potentially paying a performance penalty for a more complicated data-structure needed to maintain a list of multiple stop-callbacks in situations that don&rsquo;t need it.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>One suggestion has been to instead restrict callers of the </span><span class="c4">get_stop_token()</span><span class="c0">&nbsp;environment query to only attaching a single stop-callback at a time to any given receiver&rsquo;s stop-token.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This can simplify the data-structure needed to implement the stop-token to one that is mostly lock free - only requiring blocking during deregistration of a callback that is concurrently executed on another thread.</span></p><p class="c1"><span class="c0">Current implementations of multi-callback stop-tokens require acquiring a lock when adding, removing or invoking any stop-callbacks.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>If we are to make such a change, we need to do it before we ship the </span><span class="c4">get_stop_token()</span><span class="c0">&nbsp;query as part of P2300 as trying to make this change later will be a breaking semantic change.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This change still requires some research to understand the impact of it on the complexity of algorithms with multiple child operations, but also to evaluate the performance benefit of this change on existing sender/receiver code-bases.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>A sketch of an implementation of simpler stop-token that only allows a single stop-callback to be registered at a time is available here: </span><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://godbolt.org/z/sE43hPGW8&amp;sa=D&amp;source=editors&amp;ust=1707781281346527&amp;usg=AOvVaw1tNUHz6_nh5_NMHTx5iIIQ">https://godbolt.org/z/sE43hPGW8</a></span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>Note that we may still want to keep the </span><span class="c4">std::in_place_stop_token</span><span>&nbsp;with support for multiple stop-callbacks for cases where there are a potentially unbounded number of child operations. The main candidate for this would be in the implementation of a cancellable async-scope facility &nbsp;(see </span><span class="c19"><a class="c6" href="#h.9imgaa742k82">Async Scope</a></span><span class="c0">).</span></p><h3 class="c12" id="h.cvh57wk0jbim"><span>Design changes to the </span><span class="c4">run_loop</span><span class="c42">&nbsp;class</span></h3><p class="c1"><span>The </span><span class="c4">std::execution::run_loop</span><span>&nbsp;class described in P2300 provides a simple scheduler implementation that schedules work in FIFO order on the thread that calls </span><span class="c4">run()</span><span class="c0">. This facility is used within sync_wait() to allow the calling thread to drive an event loop that can execute work while waiting for the operation to complete.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>The design of the interface of </span><span class="c4">run_loop</span><span>&nbsp;is such that you can only drive the event-loop once by calling the </span><span class="c4">run()</span><span>&nbsp;member function. This </span><span class="c4">run()</span><span>&nbsp;function executes until some thread calls </span><span class="c4">finish()</span><span>, at which point the </span><span class="c4">run()</span><span>&nbsp;function will return and the </span><span class="c4">run_loop</span><span>&nbsp;object is now in the &ldquo;finishing&rdquo; state. The only thing you can do with such a </span><span class="c4">run_loop</span><span class="c0">&nbsp;object is destroy it.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>This makes the </span><span class="c4">run_loop</span><span>&nbsp;class useful for </span><span class="c4">sync_wait()</span><span>&nbsp;but not much else. It is not possible to integrate this facility with other event-loops to allow them to incrementally run work scheduled using a </span><span class="c4">run_loop</span><span class="c0">.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>We should revisit the design of </span><span class="c4">run_loop</span><span class="c0">&nbsp;to see if it can be modified to be usable in situations that require repeated calls to drive execution.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>Alternatively, we could consider removing run_loop from the standard-library for this release, leaving it as an implementation detail of </span><span class="c4">sync_wait()</span><span>&nbsp;- the current wording hints at using </span><span class="c4">run_loop</span><span class="c0">&nbsp;but does not require it.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">See the following issues for additional discussion:</span></p><ul class="c11 lst-kix_egm6q74cuc9v-0 start"><li class="c1 c8 li-bullet-0"><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://github.com/cplusplus/sender-receiver/issues/172&amp;sa=D&amp;source=editors&amp;ust=1707781281348339&amp;usg=AOvVaw1YM6Rm1rHM443uwQaItptf">https://github.com/cplusplus/sender-receiver/issues/172</a></span></li><li class="c1 c8 li-bullet-0"><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://github.com/cplusplus/sender-receiver/issues/120&amp;sa=D&amp;source=editors&amp;ust=1707781281348573&amp;usg=AOvVaw0ymi-jf1A7RBl459dfkuEN">https://github.com/cplusplus/sender-receiver/issues/120</a></span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c16 c22">Integration with other frameworks</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">One possible design for the run_loop to support integration with other event-loops would be to provide two methods: </span></p><ul class="c11 lst-kix_kgqfxit2qc9l-0 start"><li class="c1 c8 li-bullet-0"><span class="c4">ready_at()</span><span>&nbsp;- returns a cancellable sender that completes when an item is ready in the queue, it also completes to provide a time-point for when the next item is going to be ready. This allows scheduling the </span><span class="c4">run_loop</span><span class="c0">&nbsp;on another framework&#39;s scheduler without polling. </span></li><li class="c1 c8 li-bullet-0"><span class="c4">run_some()</span><span>&nbsp;- returns a cancellable sender that runs a finite number of queued items inline and then completes. This allows the </span><span class="c4">run_loop</span><span class="c0">&nbsp;queue items to be interleaved into another framework&rsquo;s scheduler</span></li></ul><p class="c1 c10"><span class="c0"></span></p><h3 class="c12" id="h.el1m6lkf1ozr"><span class="c42">Clarify destruction order of algorithm resources</span></h3><p class="c1"><span class="c0">When a sender completes, the completion-signaling function is responsible for (eventually) destroying the operation-state object, which will eventually ensure that all of the resources of the operation are released.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">However, it&rsquo;s not enforced that the operation-state of the just-completed operation is destroyed before the completion-signaling implementation goes on to execute logic that processes the result.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This can lead to an inconsistency in the order of destruction compared to normal functions, where resources held by a callee in its operation-state may still be alive while the caller executes some of its continuation rather than cleanup with nested lifetimes.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Whether an operation destroys the resources it holds before calling the completion-signaling function, or is deferred until the destructor of the operation state is called is currently not specified. We need to do an audit of the algorithms in P2300 to ensure that the destruction order is clear and makes sense for each of them.</span></p><h2 class="c35 c25" id="h.3ebjmpyw24j"><span class="c33">Library Design Additions</span></h2><h3 class="c12" id="h.9imgaa742k82"><span class="c42">Async Scope (P2519)</span></h3><p class="c1"><span class="c0">One pattern that we need to support is launching a dynamic number of async operations that all use a given resource and then ensuring that all of those operations complete before the resource is destroyed. </span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c4">ensure_started()</span><span>, </span><span class="c4">start_detached()</span><span class="c0">&nbsp;is attractive, but problematic - can&rsquo;t join the work.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">To support this use-case, we need an async-scope abstraction that represents a scope that waits until all nested async operations have completed. Destruction of any async resources used by those nested operations can then be scheduled for after the wait-operation has completed.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Async operations nested within an async-scope can either be launched eagerly or lazily:</span></p><ul class="c11 lst-kix_qz2j3tgouhds-0 start"><li class="c1 c8 li-bullet-0"><span class="c4">spawn_future()</span><span class="c0">&nbsp;- eagerly starts the operation, returning a sender that can be used to observe the result</span></li><li class="c1 c8 li-bullet-0"><span class="c4">spawn()</span><span class="c0">&nbsp;- eagerly starts the operation, returning void - provides no way to observe the result</span></li><li class="c1 c8 li-bullet-0"><span class="c4">invoke()</span><span>&nbsp;- returns a sender that tracks completion of the operation via the scope, but starts the operation lazily when the returned sender is started</span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c4">spawn_future()</span><span>&nbsp;is similar to </span><span class="c4">ensure_started()</span><span class="c0">, but retains the ability to join the operation through the async-scope in the case that the sender is discarded without connecting and starting it.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c4">spawn()</span><span>&nbsp;is similar to </span><span class="c4">start_detached()</span><span class="c0">, but retains the ability to join the operation through the async-scope.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>This facility should allow us to remove </span><span class="c4">ensure_started()</span><span>&nbsp;(see </span><span class="c19"><a class="c6" href="#h.givvkpstclpu">Remove </a></span><span class="c19 c4"><a class="c6" href="#h.givvkpstclpu">ensure_started()</a></span><span class="c19"><a class="c6" href="#h.givvkpstclpu">&nbsp;algorithm</a></span><span>&nbsp;section).</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Design topics currently being worked on:</span></p><ul class="c11 lst-kix_mkzc59ly2665-0 start"><li class="c1 c8 li-bullet-0"><span class="c0">Allocator support</span></li></ul><ul class="c11 lst-kix_mkzc59ly2665-1 start"><li class="c1 c15 li-bullet-0"><span class="c0">The async-scope spawn() and spawn_future() operations will need to allocate storage for the operation-state. Users should be able to customize the allocation.</span></li></ul><ul class="c11 lst-kix_mkzc59ly2665-0"><li class="c1 c8 li-bullet-0"><span class="c0">Do we need cancellable/non-cancellable scopes?</span></li></ul><ul class="c11 lst-kix_mkzc59ly2665-1 start"><li class="c1 c15 li-bullet-0"><span class="c0">Sometimes we may want an easy way to cancel all operations nested within an async-scope, or cancel only individual operations, or not cancel any of them. </span></li></ul><ul class="c11 lst-kix_mkzc59ly2665-0"><li class="c1 c8 li-bullet-0"><span class="c0">Publishing an async-scope paper independently of async resource lifetime management</span></li></ul><ul class="c11 lst-kix_mkzc59ly2665-1 start"><li class="c1 c15 li-bullet-0"><span>We want </span><span>to ship an async-scope facility with a design that is forwards compatible with async-sequences/async-cleanup so that we don&rsquo;t couple async_scope to accepting those other papers.</span></li><li class="c1 c15 li-bullet-0"><span>Goal: </span><span>reduce procedural risk</span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">There is existing implementation experience for async-scope facilities that solve some of these problems, but &nbsp;</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Latest efforts on this can be found here:</span></p><ul class="c11 lst-kix_fdn2s47zlbp2-0 start"><li class="c1 c8 li-bullet-0"><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://kirkshoop.github.io/async_scope/asyncscope.html&amp;sa=D&amp;source=editors&amp;ust=1707781281352503&amp;usg=AOvVaw0sIEXsHuWFHpeApEm3M4JL">https://kirkshoop.github.io/async_scope/asyncscope.html</a></span></li><li class="c1 c8 li-bullet-0"><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://github.com/ispeters/async_scope/pull/2/files&amp;sa=D&amp;source=editors&amp;ust=1707781281352677&amp;usg=AOvVaw3doSEvJNq384c72bd2SSMH">https://github.com/ispeters/async_scope/pull/2/files</a></span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Example (using async resource lifetime management):</span></p><p class="c1 c10"><span class="c0"></span></p><a id="t.e8df9e1173bfbffcd4846373a4d5f0ae44dece55"></a><a id="t.2"></a><table class="c38"><tr class="c20"><td class="c29" colspan="1" rowspan="1"><p class="c1"><span class="c4 c32">using</span><span class="c4">&nbsp;</span><span class="c4 c32">namespace</span><span class="c4">&nbsp;std</span><span class="c4 c9">::</span><span class="c16 c4">execution;</span></p><p class="c1 c10"><span class="c16 c4"></span></p><p class="c1"><span class="c4">sender </span><span class="c4 c32">auto</span><span class="c4">&nbsp;some_work</span><span class="c4 c9">(</span><span class="c4 c32">int</span><span class="c4">&nbsp;work_index</span><span class="c4 c9">)</span><span class="c16 c4">;</span></p><p class="c1 c10"><span class="c16 c4"></span></p><p class="c1"><span class="c4">sender </span><span class="c4 c32">auto</span><span class="c4">&nbsp;foo</span><span class="c4 c9">(</span><span class="c4">scheduler </span><span class="c4 c32">auto</span><span class="c4">&nbsp;</span><span class="c4">sch</span><span class="c4 c9">)</span><span class="c4">&nbsp;</span><span class="c4 c9">{</span></p><p class="c1"><span class="c4">&nbsp; </span><span class="c4 c32">return</span><span class="c4">&nbsp;ex</span><span class="c4 c9">::</span><span class="c4">use_resources</span><span class="c4 c9">(</span><span class="c4">&nbsp;</span><span class="c41 c4">// with async resource lifetime management</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; </span><span class="c4 c9">[</span><span class="c4">sch</span><span class="c4 c9">](</span><span class="c23 c31">counting_scope</span><span class="c4">&nbsp;scope</span><span class="c4 c9">){</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; </span><span class="c4 c32">return</span><span class="c4">&nbsp;schedule</span><span class="c4 c9">(</span><span class="c4">sch</span><span class="c4 c9">)</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c4 c9">|</span><span class="c4">&nbsp;then</span><span class="c4 c9">([]{</span><span class="c4">&nbsp;std</span><span class="c4 c9">::</span><span class="c4">cout </span><span class="c4 c9">&lt;&lt;</span><span class="c4">&nbsp;</span><span class="c2">&quot;Before tasks launch\n&quot;</span><span class="c4">; </span><span class="c4 c9">})</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c4 c9">|</span><span class="c4">&nbsp;then</span><span class="c4 c9">(</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c4 c9">[</span><span class="c4">sch</span><span class="c4">, scope</span><span class="c4 c9">]{</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c4 c41">// Create parallel work</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c4 c32">for</span><span class="c4 c9">(</span><span class="c4 c32">int</span><span class="c4">&nbsp;i </span><span class="c4 c9">=</span><span class="c4">&nbsp;</span><span class="c2">0</span><span class="c4">; i </span><span class="c4 c9">&lt;</span><span class="c4">&nbsp;</span><span class="c2">100</span><span class="c4">; </span><span class="c4 c9">++</span><span class="c4">i</span><span class="c4 c9">)</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spawn</span><span class="c4 c9">(</span><span class="c23 c31">scope</span><span class="c4">, on</span><span class="c4 c9">(</span><span class="c4">sch</span><span class="c4">, some_work</span><span class="c4 c9">(</span><span class="c4">i</span><span class="c4 c9">)))</span><span class="c16 c4">;</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c41 c4">// Join the work with the help of the scope</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="c4 c9">})</span></p><p class="c1"><span class="c16 c4">&nbsp; &nbsp; &nbsp; &nbsp; ;</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; </span><span class="c4 c9">}</span><span class="c16 c4">,</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; make_deferred</span><span class="c4 c9">&lt;</span><span class="c4">counting_scope_resource</span><span class="c4 c9">&gt;())</span></p><p class="c1"><span class="c4">&nbsp; &nbsp; </span><span class="c4 c9">|</span><span class="c4">&nbsp;then</span><span class="c4 c9">([]{</span><span class="c4">&nbsp;std</span><span class="c4 c9">::</span><span class="c4">cout </span><span class="c4 c9">&lt;&lt;</span><span class="c4">&nbsp;</span><span class="c2">&quot;After tasks complete\n&quot;</span><span class="c4">; </span><span class="c4 c9">})</span><span class="c16 c4">;</span></p><p class="c49 c25"><span class="c4 c9">}</span></p></td></tr></table><p class="c25 c10 c49"><span class="c4 c9 c47"></span></p><h4 class="c7" id="h.kwm4zxoma589"><span class="c43">Async Resource Lifetime Management / Async Cleanup</span></h4><p class="c1"><span class="c0">With the introduction of senders in P2300 there is a need to be able to represent objects that need to perform async operations during initialization and cleanup. However, these operations cannot currently be implemented using the language&rsquo;s constructors and destructors, as those functions cannot be asynchronous.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">The async-scope facility described above is an example of such an object - it should ensure that all async operations nested within the scope are joined before the async-scope object&rsquo;s lifetime ends - joining all of those operations is itself an async operation and so cannot be done from a destructor.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">We anticipate that there will be many more resources that require async init/cleanup and so it would be useful for the standard library to define a standard interface that objects with async initialization/cleanup can implement in a uniform way.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This would allow generic algorithms to be written to manage their lifetimes and compose these objects in a way that models the automatic nesting of object lifetimes provided by the language.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This async cleanup interface is needed in the initial release only to the extent that the async-scope facility should ideally implement this interface.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Work on a design has begun, but is not yet ready to put into a paper.</span></p><h3 class="c12" id="h.ixxwc620yux"><span>Heap-allocating sender algorithms need allocator support</span></h3><p class="c1"><span class="c0">There are several sender algorithms in P2300 that need to allocate storage for the state of the operation in dynamic memory.</span></p><p class="c1 c10"><span class="c0"></span></p><ul class="c11 lst-kix_kwsfbh415ym3-0 start"><li class="c1 c8 li-bullet-0"><span class="c4">ensure_started()</span><span class="c0">&nbsp;needs to allocate storage so that the operation executing concurrently in the background has a stable location to store the result while still allowing the returned sender to be moved around and composed with other sender-algorithms</span></li><li class="c1 c8 li-bullet-0"><span class="c4">split()</span><span class="c0">&nbsp;needs to allocate shared-state for which all copies of the returned sender share ownership</span></li><li class="c1 c8 li-bullet-0"><span class="c4">start_detached()</span><span class="c0">&nbsp;needs to allocate storage for the operation-state of the operation launched in the background. This storage is freed upon completion of the operation.</span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">As currently specified in P2300R7 these algorithms all allocate storage using global operator new and so it is not possible to customize the allocation strategy. If P3002 is adopted as policy then all new facilities that allocate memory should accept an allocator and use that allocator for allocation and deallocation of memory.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">These algorithms need to be modified to support custom allocators. They should also be specified to use the allocator from the input sender&rsquo;s environment by default, if the environment specifies a value for the &lsquo;get_allocator&rsquo; query.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Note that it may be possible to add support for allocator customisation later by adding an overload to these algorithms that takes an extra parameter for the allocator.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">However, if we wanted to later specify these algorithms to use the allocator from the sender&rsquo;s attributes then that could be a potential ABI break - existing calls to these functions might start returning senders with different types/layouts</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>Note that there is another </span><span class="c19"><a class="c6" href="#h.givvkpstclpu">item</a></span><span>&nbsp;listed in this document that suggests we should remove </span><span class="c4">ensure_started()</span><span class="c0">, which would obviously remove the need to add allocator support to that algorithm.</span></p><h3 class="c54" id="h.7jhvktu9whlb"><span class="c42">Coroutine task type</span></h3><p class="c1"><span class="c0">One of the key motivations for adding the coroutines language feature in C++20 was to make it easier for users to write asynchronous code using the co_await syntax. However, to date we have not yet added a coroutine-type that lets users co_await asynchronous operations.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">The main reason for delaying the addition of such a coroutine type to the standard library was because we wanted to make sure that it integrated well with the async model of the rest of the standard library and so were focusing on getting the core async model in place first.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">With P2300 introducing sender/receiver as the async model, we can now define an initial coroutine type that allows awaiting senders and that also presents the task as a sender.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">We expect the majority of application code using sender/receiver to be written using coroutines, with sender-algorithms being used where needed to introduce concurrency.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">For example: We want to be able to write the following code</span></p><a id="t.c6bb2481a3c13236eb560d9a38dad1b2f7b6355f"></a><a id="t.3"></a><table class="c38"><tr class="c20"><td class="c29" colspan="1" rowspan="1"><p class="c14"><span class="c16 c4">std::execution::task&lt;int&gt; foo();</span></p><p class="c14"><span class="c16 c4">std::execution::task&lt;int&gt; bar(int x);</span></p><p class="c14"><span class="c16 c4">std::execution::task&lt;int&gt; baz(int x);</span></p><p class="c14 c10"><span class="c16 c4"></span></p><p class="c14"><span class="c4">std::execution::task&lt;int&gt; example() {<br> &nbsp;</span><span class="c4 c39">// co_await another task directly</span></p><p class="c14"><span class="c4">&nbsp; int x = co_await foo();<br><br></span><span class="c39 c4">&nbsp; // Calling another task-returning function and passing tasks</span></p><p class="c14"><span class="c39 c4">&nbsp; // to the when_all() sender algorithm.</span></p><p class="c14"><span class="c16 c4">&nbsp; auto [a, b] = co_await std::execution::when_all(bar(x), baz(x));<br><br> &nbsp;co_return std::min(a, b);<br>}</span></p></td></tr></table><p class="c1 c10"><span class="c0"></span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">There are some capabilities that the initial coroutine task type should include:</span></p><ul class="c11 lst-kix_2gc8wphbwguv-0 start"><li class="c1 c8 li-bullet-0"><span>The ability to </span><span class="c4">co_await</span><span class="c0">&nbsp;senders</span></li><li class="c1 c8 li-bullet-0"><span class="c0">The task return-type is able to be awaited by other tasks as well as being used as a sender</span></li><li class="c1 c8 li-bullet-0"><span>Ability to customize the coroutine-frame allocation - ideally use the same design as </span><span class="c16 c4">std::generator</span></li><li class="c1 c8 li-bullet-0"><span>T</span><span class="c0">ransparent cancellation - a stop-request issued by a parent operation is transparently passed down to child operations awaited by the coroutine</span></li><li class="c1 c8 li-bullet-0"><span class="c0">Scheduler-affinity - the coroutine always resumes on the associated scheduler&rsquo;s context after awaiting another operation</span></li><li class="c1 c8 li-bullet-0"><span class="c0">Ability to transparently pass through a user-specified set of environment queries from the consumer of the task to child operations of the coroutine</span></li><li class="c1 c8 li-bullet-0"><span class="c0">Avoidance of stack-overflow when awaiting synchronously-completing senders in a loop</span></li></ul><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Note that we may choose to add other coroutine types in future that provide different feature-sets for different use-cases, but this should be the default one that most developers reach for when writing async code.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>There has been an </span><span class="c19"><a class="c6" href="https://www.google.com/url?q=https://github.com/NVIDIA/stdexec/blob/main/include/exec/task.hpp&amp;sa=D&amp;source=editors&amp;ust=1707781281362637&amp;usg=AOvVaw2w2rlHx1qQshg3LpNceoRC">implementation</a></span><span class="c0">&nbsp;of a task type in stdexec that supports most of these features. It is missing support for allocator customization and has not yet incorporated a strategy for avoiding stack-overflow when awaiting synchronously-completing senders in a loop, but can otherwise form a solid basis for a standard task type.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>Work is required to turn this task-type implementation into a proposal.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">This paper will need to address some design questions:</span></p><ul class="c11 lst-kix_i7bmre9bc3e8-0 start"><li class="c1 c8 li-bullet-0"><span class="c0">If it supports scheduler affinity, what is the default scheduler type?<br>Should it be a type-erased scheduler? If so, one will need to be included in the proposal.</span></li><li class="c1 c8 li-bullet-0"><span class="c0">Do we need to also include a trampoline_scheduler as a strategy for avoiding stack-overflow?</span></li><li class="c1 c8 li-bullet-0"><span>Should we also include a nothrow-task type for tasks that cannot complete with an error?</span></li></ul><h3 class="c12" id="h.dp444q3nwzgr"><span class="c42">System Execution Context (P2079)</span></h3><p class="c1"><span>At the moment, the only scheduler included in P2300 is from </span><span class="c4">std::execution::run_loop</span><span>, which requires manually driving its execution by calling the </span><span class="c4">run()</span><span>&nbsp;function, which can only be done from a single thread, once.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">To allow C++ programs to make full use of the system, we should provide some kind of default, out of the box scheduler that can schedule work to take advantage of multiple CPU cores on modern processors.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>While it would be relatively straightforward to implement and provide some kind of </span><span class="c4">static_thread_pool</span><span>&nbsp;execution context that owns its own pool of threads, we do not recommend adding such a facility to the standard library, as experience has shown that in large systems, use of such a thread-pool class tends towards each software component constructing its own thread pool of O(CPU core count) threads which then leads to 100&rsquo;s or even 1000&rsquo;s of threads being created where there are far fewer CPU cores available to execute them. This results in poor performance due to the large number of context-switches required to fairly schedule all of those threads. A Malthusian disaster!</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">Instead, the standard library should provide an execution context that is shared across many components within the process. Where available, the execution context should map on to the underlying operating system&rsquo;s built-in thread pool facilities, e.g. Windows Thread Pool or Grand Central Dispatch (GCD), so that the system can scale the thread-pool as appropriate based on available compute resources. However, it also needs to be able to work on systems that might only have a single thread of execution - in which case scheduling work onto the system context might dispatch it to the main event loop.</span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span>Shipping </span><span class="c4">std::execution</span><span>&nbsp;without a system execution context would severely limit the out-of-box experience for users of the facility, requiring them to pull in third-party libraries to be able to do useful work. </span></p><p class="c1 c10"><span class="c0"></span></p><p class="c1"><span class="c0">There are still a number of outstanding design challenges which need to be resolved in any solution:</span></p><p class="c1 c10"><span class="c0"></span></p><ul class="c11 lst-kix_ueh9c2uprout-0 start"><li class="c1 c8 li-bullet-0"><span class="c23">Extensibility</span><span>&nbsp;- future releases will want to add support for additional features to the system context - time-based scheduling, async file I/O, networking, etc. </span><span>We need to require that implementations of the system context have a stable ABI that allows adding features later without breaking the ABI of existing usage of the system context. </span></li><li class="c1 c8 li-bullet-0"><span class="c23">Replaceability</span><span>&nbsp;- require that the system context for a compiled binary can be replaced by an implementation not produced by the std library vendor (depends on a stable-abi), similar to how an application can replace the global </span><span class="c4">operator new/delete</span><span class="c0">.</span></li><li class="c1 c8 li-bullet-0"><span class="c23">Shareability</span><span>&nbsp;- require that the same system context can be shared across all binaries in the same process (depends on a stable ABI).</span></li><li class="c1 c8 li-bullet-0"><span class="c23">Lifetime</span><span>&nbsp;- </span><span>specify </span><span class="c0">when the system context is available to be used.<br>What are its startup/shutdown constraints, and what behavior results when the system context is used outside those constraints? When do thread_local objects from thread-pool threads get destroyed with regards to [basic.start.term]?</span></li></ul><h1 class="c28 c25" id="h.f1m90va72v31"><span class="c13">Acknowledgements</span></h1><p class="c1"><span>Thanks to Inbal Levi, Ga&scaron;per A&#382;man, and Maikel Nadolski for input and feedback on this paper.</span></p><h1 class="c28 c25" id="h.g0wzf1jilvkl"><span class="c13">Appendix A - A list of existing utilities in P2300</span></h1><p class="c1 c10"><span class="c0"></span></p><ul class="c11 lst-kix_x0jk3p44hw5u-0 start"><li class="c1 c8 li-bullet-0"><span class="c0">Core concepts</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1 start"><li class="c1 c15 li-bullet-0"><span class="c16 c4">sender / sender_in / sender_to</span></li><li class="c1 c15 li-bullet-0"><span class="c16 c4">receiver / receiver_of</span></li><li class="c1 c15 li-bullet-0"><span class="c16 c4">operation_state</span></li><li class="c1 c15 li-bullet-0"><span class="c16 c4">queryable</span></li><li class="c1 c15 li-bullet-0"><span class="c16 c4">stoppable_token</span></li><li class="c1 c15 li-bullet-0"><span class="c16 c4">scheduler</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-0"><li class="c1 c8 li-bullet-0"><span class="c0">Utilities</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1 start"><li class="c1 c15 li-bullet-0"><span class="c16 c4">receiver_adaptor</span></li><li class="c1 c15 li-bullet-0"><span class="c16 c4">completion_signatures</span></li><li class="c1 c15 li-bullet-0"><span class="c16 c4">transform_completion_signatures</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-0"><li class="c1 c8 li-bullet-0"><span class="c0">Algorithms</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1 start"><li class="c1 c15 li-bullet-0"><span class="c0">Utilities</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-2 start"><li class="c1 c5 li-bullet-0"><span class="c16 c4">execute</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1"><li class="c1 c15 li-bullet-0"><span class="c0">Sender factories</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-2 start"><li class="c1 c5 li-bullet-0"><span class="c4 c16">just / just_error / just_stopped</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">read</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">schedule</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1"><li class="c1 c15 li-bullet-0"><span class="c0">Sender adaptors</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-2 start"><li class="c1 c5 li-bullet-0"><span class="c16 c4">on</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">transfer</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">schedule_from</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">then / upon_error / upon_stopped</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">let_value / let_error / let_stopped</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">bulk</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">split</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">when_all</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">into_variant</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">stopped_as_optional</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">stopped_as_error</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">ensure_started</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1"><li class="c1 c15 li-bullet-0"><span class="c0">Sender consumers</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-2 start"><li class="c1 c5 li-bullet-0"><span class="c16 c4">sync_wait</span></li><li class="c1 c5 li-bullet-0"><span class="c16 c4">start_detached</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-0"><li class="c1 c8 li-bullet-0"><span class="c0">Execution Contexts</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1 start"><li class="c1 c15 li-bullet-0"><span class="c16 c4">run_loop</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-0"><li class="c1 c8 li-bullet-0"><span class="c0">Coroutine Utilities</span></li></ul><ul class="c11 lst-kix_x0jk3p44hw5u-1 start"><li class="c1 c15 li-bullet-0"><span class="c16 c4">as_awaitable</span></li><li class="c1 c15 li-bullet-0"><span class="c4">with_awaitable_senders</span></li></ul></body></html>